• VLMI - форум по обмену информацией. На форуме можете найти способы заработка, разнообразную информацию по интернет-безопасности, обмен знаниями, курсы/сливы.

    После регистрации будут доступны основные разделы.

    Контент форума создают пользователи, администрация за действия пользователей не несёт ответственности, отказ от ответственности. Так же перед использованием форума необходимо ознакомиться с правилами ресурса. Продолжая использовать ресурс вы соглашаетесь с правилами.
  • Подпишись на наш канал в Telegram для информации о актуальных зеркалах форума: https://t.me/vlmiclub

Уроки по разработке Telegram ботов

BotHub

Разработчик ботов

BotHub

Разработчик ботов
Резидент
Сообщения
285
Реакции
420
0 руб.
Telegram
Этим постом хочу начать серию небольших уроков по разработке Telegram ботов на PHP. Почему именно PHP, он прост в изучении, и большинство провайдеров предоставляют услуги с поддержкой именно PHP. Однако, забегая вперед, хочу сказать, что для работы полноценного сервиса, по средством бота, нужно иметь свой VPS сервер.

Управление ботом проходит по средством API. В свою очередь, ответы Telegram сервера приходят в формате JSON массива данных. Взаимодействие с ботом (API) проходит с помощью 2 методов long polling и WebHook. В первом случае, для взаимодействия с ботов, нужно самому отправлять запрос на сервер Telegram. Во втором случае, сам сервер Telegram отправляет ответ вашему серверу (скрипту). Второй способ, удобнее и экономит ресурсы вашего сервера, потому что ему не нужно обрабатывать данные, пока их не отправит Telegram сервер. А для первого способа, для его автоматизации придется использовать, планировщик заданий, к примеру Cron.

Telegram бот это оболочка, простой интерфейс взаимодействия, он не несет в себе весь функционал вашего сервиса или вашей задачи. Бот всего лишь помогает, перенести интерфейс управления, вашей задачей, в Telegram клиент.

Что бы не рассказывать уже всем известные вещи, и действительно написать что то полезное и нужное, предлагаю вам написать идеи для бота, действительно нужного и полезного. А я в свою очередь, в рамках данной темы, постараюсь описать его работу и напишу урок по его реализации. Так наше обучение, будет более продуктивным.

Список уроков (будет пополняться):
  • Урок №1 - IP логгер с отправкой лога в Телеграм
  • Урок №2 - Обработка команд, курс Биткойн, Цитаты рунета
 
Последнее редактирование:

Billionair_e

Местный
Сообщения
54
Реакции
51
0 руб.
Telegram
Очень прикольный проект придумал, просто супер!

Моя идея возможно будет не очень полезна для некоторых, но сделаю предложение первым:
Бот который будет кидать оповещение если выйдет новая тема на vlmi.top (реклама). Приходить будет название темы и ссылка на неё.
 

Night

По вопросам сотрудничества

Night

По вопросам сотрудничества
Команда форума
Админ
Сообщения
935
Реакции
2.276
0 руб.
Telegram
Очень прикольный проект придумал, просто супер!

Моя идея возможно будет не очень полезна для некоторых, но сделаю предложение первым:
Бот который будет кидать оповещение если выйдет новая тема на vlmi.top (реклама). Приходить будет название темы и ссылка на неё.
Это просто. Можно с помощью Father`a добавить rss ленту и всё.
 

BotHub

Разработчик ботов

BotHub

Разработчик ботов
Резидент
Сообщения
285
Реакции
420
0 руб.
Telegram
Пока вы придумываете бота. Напишу небольшой урок, по созданию логгера. Скрипта который будет отправлять данные из любого места или сервера, к вам в Telegram.

Подойдет любой хостинг, где присутствует поддержка PHP. Реализовывать будем максимально просто.

Первое, что нам понадобится это TOKEN. Telegram TOKEN это некий ключ доступа, по которому Telegram сервер распознает команду и связывает ее именно с тем ботом, к которому он и относится. Ключ довольно сложный, и методом подбора ломать такой ключ придется долго, что бы подключится хоть к какому то боту.

Зарегистрировать бота и получить TOKEN можно у бота @BotFather.
Получили к примеру TOKEN 423885960:AAH1vTl3CkRK_fTAnoCK4E3kdih6kA32kGc

Для того что бы отправить сообщение нужно использовать метод sendMessage. Он имеет следующие обязательные значения, chat_id и text.
chat_id - это индивидуальный идентификатор пользователя.
text - это текст сообщения.
Существует еще множество параметров для данного метода, но в рамках данного урока мы их не будем рассматривать. Что бы получить chat_id отправьте любое сообщение вашему боту, он вам конечно не ответит, но вам сейчас это и не нужно.
Далее, берем данный запрос https://api.telegram.org/botTOKEN/getUpdates
Вместо слова TOKEN подставляем ранее полученный TOKEN. И получаем такой вот адрес https://api.telegram.org/bot423885960:AAH1vTl3CkRK_fTAnoCK4E3kdih6kA32kGc/getUpdates
Отлично, теперь переходим по нему в браузере. В ответ получаем некие данные, это и есть JSON массив, ответ сервера. Нам нужно найти там значение "chat":{"id":193092653
193092653 - chat_id. Теперь мы знаем свой ID.

Теперь в качестве примера, будем отсылать себе в Telegram IP адрес жертвы. Используем функции.
1. Получаем IP - $_SERVER["REMOTE_ADDR"]
2. Получаем Браузер - $_SERVER['HTTP_USER_AGENT']
3. Получаем Время - date("H:i:s")
4. Получаем Дату - date("d.m.Y")

Собираем все в скрипт
PHP:
<?php

$token = '423885960:AAH1vTl3CkRK_fTAnoCK4E3kdih6kA32kGc'; // TOKEN
$id    = 193092653;                                       // Chat ID
$ip    = $_SERVER["REMOTE_ADDR"];                         // IP Жертвы
$agent = $_SERVER['HTTP_USER_AGENT'];                     // User Agent
$time  = date("H:i:s");                                   // Время
$date  = date("d.m.Y");                                   // Дата

$text     = "Получен новый лог\n\nIP: $ip\nВремя: $time\nДата: $date\nБраузер: $agent"; // Текст сообщения
$argument = http_build_query(array('chat_id' => $id, 'text' => $text));                 // Нормализуем строку
$query    = "https://api.telegram.org/bot$token/sendMessage?$argument";                 // Запрос к API

file_get_contents($query); // Вызов запроса к API

?>

Логгер готов. Устанавливаем его на нужном файле и получаем Лог, каждый раз когда кто то заходит на страницу.
Получаем сообщение такого вида (Тестировал с локальной машины)
Screenshot_1.png
Спасибо за внимание.
 
Последнее редактирование:

BotHub

Разработчик ботов

BotHub

Разработчик ботов
Резидент
Сообщения
285
Реакции
420
0 руб.
Telegram
Очень прикольный проект придумал, просто супер!

Моя идея возможно будет не очень полезна для некоторых, но сделаю предложение первым:
Бот который будет кидать оповещение если выйдет новая тема на vlmi.top (реклама). Приходить будет название темы и ссылка на неё.
Было бы неплохо получать разные данные с сайта, однако, у форума нет своего API для нормального получения данных, можно по пробовать создать имитацию захода на сайт, с вашим логином и паролем, и тогда получать некоторые данные с форума, но подобных реализаций я не встречал, подобные форумы имеют защиту, и многие их устанавливают через защиту от ддоса, поэтому парсить личные данные из форума, не так то просто.
 

Night

По вопросам сотрудничества

Night

По вопросам сотрудничества
Команда форума
Админ
Сообщения
935
Реакции
2.276
0 руб.
Telegram
Было бы неплохо получать разные данные с сайта, однако, у форума нет своего API для нормального получения данных, можно по пробовать создать имитацию захода на сайт, с вашим логином и паролем, и тогда получать некоторые данные с форума, но подобных реализаций я не встречал, подобные форумы имеют защиту, и многие их устанавливают через защиту от ддоса, поэтому парсить личные данные из форума, не так то просто.
Есть апи. Можем что ни будь придумать =)
 

BotHub

Разработчик ботов

BotHub

Разработчик ботов
Резидент
Сообщения
285
Реакции
420
0 руб.
Telegram
Есть апи. Можем что ни будь придумать =)
Даже так? Хорошо, напишите мне в ЛС насчет этого. Эти API вообще можно будет давать в личное пользование для пользователей? Я не совсем хорошо знаком с движком данного форума.
 

BotHub

Разработчик ботов

BotHub

Разработчик ботов
Резидент
Сообщения
285
Реакции
420
0 руб.
Telegram
Второй урок. Сегодня напишем бота, который будет обрабатывать наши команды и присылать нам нужную информацию. Допустим мы тот человек, который интересуется Биткойнами, и хочет получать его курс. А также нам нравятся цитаты великих людей. И любите читать bash.im

Данный бот будет не только отправлять нам информацию, но и принимать ее от нас. Поэтому создаем на вашем сервере папку и создаем там файл bot.php. Именно к этому файлу и будет обращаться сервер Телеграм, для отправки нам ответа. Для этого зарегистрируем WebHook. Открываем браузер и делаем вот такой запрос api.telegram.org/botTOKEN/setwebhook?url=URL_BOT

Где TOKEN это наш токен полученный от BotFather, URL_BOT – полный адрес до нашего файла bot.php. Делаем запрос и получаем ответ, что WebHook установлен успешно. Теперь все что мы напишем боту, будет отправлено нам в bot.php сервером Телеграм.

Первое что нужно написать, это научить наш скрипт принимать данные которые нам присылает Телеграм. Для этого воспользуемся функцией file_get_contents('php://input'). Телеграм присылает данные в формате JSON, поэтому перед тем как работать с ними, нужно декодировать их в удобный нам формат, массива.
PHP:
$data = json_decode(file_get_contents('php://input'), true);
Получив массив данных, давайте сразу вытащим из него нужные нам значения, а это наш ID, что б бот понимал кому отправлять сообщение. И значение поля TEXT что бы бот видел команду, которую мы ему присылаем.
PHP:
$id   = $data['message']['chat']['id'];
$botText = $data['message']['text'];
Этого нам в рамках данного урока хватит.

Теперь напишем вот такую конструкцию для обработки команд
PHP:
switch () {
   case '/start':
       break;

   case 'Курс Bitcoin':
       break;

   case 'Цитата Bash':
       break;

   case 'Случайное высказывание':
       break;
  
   default:
       break;
}
Пока оставим этот код и выведем кнопки, для отправки команд. Сделаем 3 кнопки в 2 ряда.
PHP:
$botton = ['keyboard' => [
    [['text' => 'Курс Bitcoin'], ['text' => 'Цитата Bash']],
    [['text' => 'Случайное высказывание']]
], 'resize_keyboard' => true];
И преобразуем этот массив сразу JSON, добавим эту функцию прямо в строку запроса. Теперь, когда у нас есть кнопки, можем обработать первую команду. А первая команда у любого Телеграм бота /start. При вводе этой команды давайте по приветствуем себя и выведем меню.
PHP:
case '/start':
  $text  = "Добро пожаловать в Бота\n\nМеню Бота:";
  break;
Теперь обработаем команду Курс Bitcoin. Данные я буду получать с сайта blockchain.info. Они приходят так же в JSON формате (забегая вперед все данные в этом уроке будут приходить в JSON), мы их уже умеем обрабатывать, и давайте выведем курс для Рубля и Доллара, и куплю/продажу.
PHP:
$bitcoin = json_decode(file_get_contents('https://blockchain.info/ru/ticker'), true);
$coinUSD = $bitcoin['USD']['15m'];
$buyUSD  = $bitcoin['USD']['buy'];
$sellUSD = $bitcoin['USD']['sell'];
$coinRUB = $bitcoin['RUB']['15m'];
$buyRUB  = $bitcoin['RUB']['buy'];
$sellRUB = $bitcoin['RUB']['sell'];
$text = "Курс Bitcoin\n\nUSD: $coinUSD\nПокупка: $buyUSD\nПродажа: $sellUSD\n\nRUB: $coinRUB\nПокупка: $buyRUB\nПродажа: $sellRUB";
По аналогии с этим обрабатываем остальные команды и выводим информацию для них.
PHP:
$bash = json_decode(file_get_contents('http://umorili.herokuapp.com/api/get?site=bash.im&name=bash&num=1'), true);
$bashText = strip_tags($bash[0]['elementPureHtml']);
$text = "Цитата Bash\n\n$bashText";

$quote = json_decode(file_get_contents('https://api.forismatic.com/api/1.0/?method=getQuote&format=json'), true);
$quoteText = $quote['quoteText'];
$quoteAuthor = $quote['quoteAuthor'];
$text = "Случайное высказывание\n\n$quoteText\n\n($quoteAuthor)";
И последнее, добавим ответ на неверную команду.

Полный код Бота:
PHP:
<?php

$token = 'ВАШ ТОКЕН'; // Токен от Телеграм бота

$data = json_decode(file_get_contents('php://input'), true); // Принемаем данные и раскодируем JSON

$id      = $data['message']['chat']['id']; // Ваш Chat ID
$botText = $data['message']['text']; // Присланные вами данные

switch ($botText) {
    case '/start': // Обработка команды /start
    $text     = "Добро пожаловать в Бота\n\nМеню Бота:";
        break;

    case 'Курс Bitcoin':
      $bitcoin = json_decode(file_get_contents('https://blockchain.info/ru/ticker'), true); // API blockchain.info
      $coinUSD = $bitcoin['USD']['15m'];
      $buyUSD  = $bitcoin['USD']['buy'];
      $sellUSD = $bitcoin['USD']['sell'];
      $coinRUB = $bitcoin['RUB']['15m'];
      $buyRUB  = $bitcoin['RUB']['buy'];
      $sellRUB = $bitcoin['RUB']['sell'];
      $text = "Курс Bitcoin\n\nUSD: $coinUSD\nПокупка: $buyUSD\nПродажа: $sellUSD\n\nRUB: $coinRUB\nПокупка: $buyRUB\nПродажа: $sellRUB";
        break;

    case 'Цитата Bash':
      $bash = json_decode(file_get_contents('http://umorili.herokuapp.com/api/get?site=bash.im&name=bash&num=1'), true); // API umorili
      $bashText = strip_tags($bash[0]['elementPureHtml']);
      $text = "Цитата Bash\n\n$bashText";
        break;

    case 'Случайное высказывание':
      $quote = json_decode(file_get_contents('https://api.forismatic.com/api/1.0/?method=getQuote&format=json'), true); // forismatic.com
      $quoteText = $quote['quoteText'];
      $quoteAuthor = $quote['quoteAuthor'];
      $text = "Случайное высказывание\n\n$quoteText\n\n($quoteAuthor)";
        break;
    
    default: // Обработка всех неверных команд
      $text = "Неверная команда! Введите /start";
        break;
}

$botton = ['keyboard' => [ // Вывод клавиатуры
    [['text' => 'Курс Bitcoin'], ['text' => 'Цитата Bash']],
    [['text' => 'Случайное высказывание']]
], 'resize_keyboard' => true];

$argument = http_build_query(array('chat_id' => $id, 'text' => $text, 'reply_markup' => json_encode($botton)));             
$query    = "https://api.telegram.org/bot$token/sendMessage?$argument";

file_get_contents($query); // Запрос к API Telegram

?>

photo_2017-12-26_20-34-42.jpg

Рабочий пример Бота по уроку №2: https://t.me/vlmi_su_bot
Данный пример будет работать, до момента написания нового урока.

Спасибо за внимание.
 

Вложения

  • vlmi.top-bot-lesson-2.zip
    1,2 KB · Просмотры: 204

Unnamed

Один на все века

Unnamed

Один на все века
Резидент
Сообщения
437
Реакции
445
0 руб.
Telegram
Отличные курсы!)
С нетерпением жду продолжения!
Очень интересно читать)
 

BotHub

Разработчик ботов

BotHub

Разработчик ботов
Резидент
Сообщения
285
Реакции
420
0 руб.
Telegram
Небольшой анонс. Новый урок будет по разработке бота администратора для чат группы.
Функционал:
  • Приветствие.
  • Справка
  • Удаление сообщений с нарушениями.
  • Небольшой диалог с ботом

Еще предложите варианты для функционала.

p.s Кик и Блокировку не делаю специально, нельзя боту позволять принимать такие решения. Но если интересно, могу включить.
 

BotHub

Разработчик ботов

BotHub

Разработчик ботов
Резидент
Сообщения
285
Реакции
420
0 руб.
Telegram
Из-за занятостью новым заказами, не было времени для уроков.

Приступим к реализации бота администратора. Первым пунктом у нас это приветствие новых участников. Но в начале нужно добавить бота, администратором той группы в которой хотите что бы он работал. При вступлении в чат нового участника, появляется сообщение. Это сообщение мы и будем отслеживать. Получаем массив с данными и обработаем нужный его участок. Для удобства работы с Telegram создадим небольшой class. В будущем будем его дополнять.
PHP:
<?php

class telegram {

    public function token($token) {
        $this -> token = $token;
    }

    public function connection() {
        $data = json_decode(file_get_contents('php://input'), true);
        return [
            'id'         => $data['message']['chat']['id'],
            'message_id' => $data['message']['message_id'],
            'text'       => $data['message']['text'],
            'new_member' => $data['message']['new_chat_member'] ?? false
        ];
    }

    private function curl($method) {
        $ch = curl_init();
        curl_setopt($ch, CURLOPT_URL, 'https://api.telegram.org/bot' . $this -> token . '/' . $method);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
        curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
        curl_exec($ch);
        curl_close($ch);
    }

    public function sendMessage($id, $messageId, $text) {
        $data = [
            'chat_id'      => $id,
            'text'         => $text,
            'reply_to_message_id' => $messageId,
            'parse_mode'   => 'HTML'
        ];
        return $this -> curl('sendMessage?' . http_build_query($data));
    }

}

?>
Первое, по списку, у нас приветствие нового участника группы, для этого выполним такую проверку.
PHP:
if (!empty($data['new_member'])) {
    $text = "Добро пожаловать в наш чат. Я Модератор.\n\n<b>Запрещено:</b>\n<pre>1. Реклама.\n2. СПАМ и ФЛУД.\n3. Нецензурная брань и хамство.</pre>\n\n<b>Мои команды:</b>\n/about - о нашем чате\n/news - наши новости\n/help - вызов справки";
}

Так же обработаем и основные команду для нашего "модератора".
PHP:
if (strpos($data['text'], '/about@') !== false) {
    $text = "Небольшой рассказ о нашей группе";
}

if (strpos($data['text'], '/news@') !== false) {
    $text = "Новости нашей группы";
}

if (strpos($data['text'], '/help@') !== false) {
    $text = "<b>Запрещено:</b>\n<pre>1. Реклама.\n2. СПАМ и ФЛУД.\n3. Нецензурная брань и хамство.</pre>\n\n<b>Мои команды:</b>\n/about - о нашем чате\n/news - наши новости\n/help - вызов справки";
}

И сразу весь код вместе
PHP:
<?php

require_once __DIR__ . '/telegram.class.php';

$tgm = new telegram;
$tgm -> token(''); // Токен
$data = $tgm -> connection();


if (!empty($data['new_member'])) {
    $text = "Добро пожаловать в наш чат. Я Модератор.\n\n<b>Запрещено:</b>\n<pre>1. Реклама.\n2. СПАМ и ФЛУД.\n3. Нецензурная брань и хамство.</pre>\n\n<b>Мои команды:</b>\n/about - о нашем чате\n/news - наши новости\n/help - вызов справки";
}

if (strpos($data['text'], '/about@') !== false) {
    $text = "Небольшой рассказ о нашей группе";
}

if (strpos($data['text'], '/news@') !== false) {
    $text = "Новости нашей группы";
}

if (strpos($data['text'], '/help@') !== false) {
    $text = "<b>Запрещено:</b>\n<pre>1. Реклама.\n2. СПАМ и ФЛУД.\n3. Нецензурная брань и хамство.</pre>\n\n<b>Мои команды:</b>\n/about - о нашем чате\n/news - наши новости\n/help - вызов справки";
}

$tgm -> sendMessage($data['id'], $data['message_id'], $text);

?>
Screenshot_1.png

Продолжение следует....
 

ReQ

Местный
Сообщения
115
Реакции
48
0 руб.
Please note, if you want to make a deal with this user, that it is blocked.
То что искал) жду с нетерпением, и уверен что не я один, продолжения.
 

unknowactor

Местный
Сообщения
92
Реакции
107
0 руб.
Telegram
Хоелось бы посмотреть на начинку бота-продавца. Самого примитивного естественно. Очень годные уроки у тебя)
 
  • Мне нравится
Реакции: ElSh

BotHub

Разработчик ботов

BotHub

Разработчик ботов
Резидент
Сообщения
285
Реакции
420
0 руб.
Telegram
Хоелось бы посмотреть на начинку бота-продавца. Самого примитивного естественно. Очень годные уроки у тебя)

Напишите то что хотите продавать, в общий чертах опишу как пишутся боты для продажи. Товар может быть как цифровой, вроде ключей, данных и т.д Так и можно продавать товары получение при покупке какого то премиум доступа. Например, можно купить доступ к Socks на месяц, и продавать потом их поштучно, в этом нам может помочь API их сервиса.
 

BotHub

Разработчик ботов

BotHub

Разработчик ботов
Резидент
Сообщения
285
Реакции
420
0 руб.
Telegram
Для своих проектов разработал Telegram Bot class. Что умеет:
  • Получение данных
  • Отправка данных
  • Отправка файлов
  • Скачивание файлов на ваш сервер
  • Шаблонизатор и языковые пакеты сообщений
  • Клавиатуры, и пакеты клавиатур
  • Массовая работа с командами (есть возможность обрабатывать множество команд одновременно)
  • И многое другое...

Интересно вообще кому то такое? Всего 1 файл.
 

СПА12

Местный
Сообщения
46
Реакции
60
0 руб.
Да интересно ! Однозначно плюс автору. Давно уже бота продажника запустить хочу , если есть какой то архив с командами буду рад принять )
 

BotHub

Разработчик ботов

BotHub

Разработчик ботов
Резидент
Сообщения
285
Реакции
420
0 руб.
Telegram
Да интересно ! Однозначно плюс автору. Давно уже бота продажника запустить хочу , если есть какой то архив с командами буду рад принять )
Опишите требуемый функционал. В рамках данных уроков, могу написать как создать свой телеграм магазин. Но могу конечно и сам магазин скинуть, уже готовый, скрипт паблик, работает нормально или нет я не знаю, скорее всего придется что то допиливать. В общем скину в ЛС. Но его уже 100 раз выкладывали и в телеграм, и даже тут на форуме скорее всего.
 

atomsolt

Участник
Сообщения
21
Реакции
14
0 руб.
предлагаю вам написать идеи для бота, действительно нужного и полезного.
Идея написать бота парсера-постинга статей (парсить rss или сам сайт, на выбор автора). Функционал тут конечно может быть большой:
* постинг постов только по нужным тегам, например спарсили 20 статей с сайта, но постим только нужные
* добавление тегов к постам, например сайт о кодинге в целом, но нам нужны статьи только о питоне и пхп, значит постим только статьи о python и php, к статье про питон добавляем тег питон, про пхп - тег пхп
* нужно проверять чтобы не было дублирующихся постов, то есть при повторном парсинге, посты которые уже были опубликованы, не должны публиковаться снова
* и много другого: парсер по таймингу, постинг с отсрочкой, оформление самих постов и т.д.
или минимальный функционал в рамках урока, просто всё парсим и всё постим.
 

BotHub

Разработчик ботов

BotHub

Разработчик ботов
Резидент
Сообщения
285
Реакции
420
0 руб.
Telegram
Идея написать бота парсера-постинга статей (парсить rss или сам сайт, на выбор автора). Функционал тут конечно может быть большой:
* постинг постов только по нужным тегам, например спарсили 20 статей с сайта, но постим только нужные
* добавление тегов к постам, например сайт о кодинге в целом, но нам нужны статьи только о питоне и пхп, значит постим только статьи о python и php, к статье про питон добавляем тег питон, про пхп - тег пхп
* нужно проверять чтобы не было дублирующихся постов, то есть при повторном парсинге, посты которые уже были опубликованы, не должны публиковаться снова
* и много другого: парсер по таймингу, постинг с отсрочкой, оформление самих постов и т.д.
или минимальный функционал в рамках урока, просто всё парсим и всё постим.
Вполне реализуемо. Только для каждого сайта, нужно писать свой парсер, если нет API или rss. В принципе, можно работать уже не через API телеграм бота, а с Core API и публиковать посты со своего аккаунта. Собственно как появится свободное время, напишу урок по боту автору статей, для автоматизации наполнения канала.
 
Сверху Снизу