1: регистрация бота у @BotFather
Прежде чем начать писать код, нового бота нужно зарегистрировать у «папы всех ботов» — @BotFather, чтобы получить токен (ключ) для работы с Telegram API.
Регистрация проходит в 5 простых этапов:
1) Открываете чат с @BotFather;
2) Вводите или выбираете из списка команду /newbot;
3) Отправляете желаемое название для бота;
4) Пишете юзернейм бота, по которому его будут находить через поиск. Обязательно на конце вашего юзернейма должно быть слово «bot» или «_bot». В моем случаи это @svpt_bot ссылка на него https://t.me/svpt_bot;
5) По желанию можно сразу настроить полное или краткое описание, список команд и аватарку.
По итогу регистрации получаем наш токен — 6604813784:AAHMpxRvi8Dc9M9UlQlUbvchsd_-NYEOtBs
Будьте осторожны: никогда и никому не показывайте токен, иначе ваш бот может быть скомпрометирован. Если по несчастливой случайности кто-то нехороший все-таки узнал ваш токен, то заменить его можно всё в том же @BotFather, нажав на кнопку «Revoke current token» в разделе «API Token».
Шаг 2: выбираем способ обработки запросов
Исходя из официальной документации, Telegram API основан на простых HTTP-запросах. Существует всего два различных способа обрабатывать запросы, которые пользователи будут посылать боту:
1) проверять «вручную», используя «Long Polling»;
2) доверить всё Telegram, поставив «Webhook». В этом случае любой запрос от пользователя Telegram сам будет посылать нам на сервер.
Мы остановимся на втором варианте, но у него есть ограничение: у вас на сайте обязательно должен быть установлен SSL-сертификат, чтобы все запросы проходили через безопасный протокол HTTPS. Самоподписанные и бесплатные сертификаты «Let’s Encrypt», которые поддерживает большинство хостингов, также подходят.
Шаг 3 — Регистрация хука
Регистрация вебхука — это явное указание, по какому https адресу должен вызываться наш php-файл обработчик. Для начала его нужно создать, например index.php в моем случаи po.php или любой другой.
Для установки вебхука(скрипта), который будет обрабатывать команды и отвечать на сообщения, необходимо открыть в браузере такую строку:
https://api.telegram.org/bot6604813784:AAHMpxRvi8Dc9M9UlQlUbvchsd_-NYEOtBs/setWebhook?url=https://sv-pt.ru/1/po.php
Где после слова bot мы вставляем токен выделенный желта красным цветом взятый у бота отца. И выделенное голубым мы вставляем адрес сайта где у нас находится скрипт обработки команд.
В результате открытия этой строки в браузере и нажатии кнопки enter, мы получаем такое сообщение : {«ok»:true,»result»:true,»description»:»Webhook was set»} — это означает, что вебхук установлен и теперь отправленные боту сообщения будут приходить на этот адрес.
4. Задаем список команд.
Теперь создадим список кнопок по которым будут обрабатывается команды. Сообщим о том что они у нас есть в Botfather’а. Идем туда и вбиваем /mybots потом выбираем имя вашего бота в котором будут всплывать команды. Потом Edit Bot и в следующем меню как на картинке выделенное красной точкой Edit Commands. Потом вбиваем в формате как на картинке.
И проверяем в боте появилось ли наше меню.
5. Обработка запросов.
Писать код бота будем на PHP, воспользуемся уже готовой и очень удобной библиотекой c гидхаба или можно скачать у меня с сервера .
Просмотрим сперва полный листинг кода.
<?php header('Content-Type: text/html; charset=utf-8'); require_once("vendor/autoload.php"); $token = "6604813784:AAHMpxRvi8Dc9M9UlQlUbvchsd_-NYEOtBs"; $bot = new \TelegramBot\Api\Client($token); $update = json_decode(file_get_contents('php://input')); file_put_contents(__DIR__ . '/logos',print_r($update,1),FILE_APPEND); $bot->command('start', function ($message) use ($bot) { $answer = 'Добро пожаловать. Посетите наш сайт https://sv-pt.ru. Подробное описание по ссылке'; $bot->sendMessage($message->getChat()->getId(), $answer); }); $bot->command('help', function ($message) use ($bot) { $answer = 'Команды: /start - Начало /help - Помощь /mess - Сообщение /foto - Картинки /doc - Документ /video - Видео /gif - Гиф анимация /knopka - Кнопка '; $bot->sendMessage($message->getChat()->getId(), $answer); }); $bot->command('mess', function ($message) use ($bot) { $mess = 'Текст сообщения'; $bot->sendMessage($message->getChat()->getId(), $mess); }); $bot->command('foto', function ($message) use ($bot) { $siteimg = 'https://sv-pt.ru/download/telegram/svpt_bot/bot.png'; $bot->sendPhoto($message->getChat()->getId(), $siteimg,'Отправляем картинку'); }); $bot->command('doc', function ($message) use ($bot) { $sitedoc = new \CURLFile('file.txt'); //$sitedoc = new \CURLFile('/../telegram/sv-pt.ru/download/telegram/svpt_bot/doc.txt'); //$sitedoc = 'http://sv-pt.ru/download/telegram/svpt_bot/doc.txt'; $bot->sendDocument($message->getChat()->getId(), $sitedoc); }); $bot->command('video', function ($message) use ($bot) { $sitevideo = 'https://sv-pt.ru/download/telegram/svpt_bot/sample.mp4'; $bot->sendVideo($message->getChat()->getId(), $sitevideo); }); $bot->command('gif', function ($message) use ($bot) { $sitegif = 'https://sv-pt.ru/download/telegram/svpt_bot/bot.gif'; $bot->sendVideo($message->getChat()->getId(), $sitegif); }); $bot->command('knopka', function ($message) use ($bot) { $keyboard = new \TelegramBot\Api\Types\Inline\InlineKeyboardMarkup( [ [ ['callback_data' => 'smile4', 'text' => hex2bin('f09f97a1').'Подробная инс.', 'url' => 'https://sv-pt.ru'], ['callback_data' => 'smile4', 'text' => hex2bin('f09f97a2').'Подробная инс. 2', 'url' => 'https://sv-pt.ru'], ['callback_data' => 'smile4', 'text' => hex2bin('f09f97a3').'Подробная инс. 3', 'url' => 'https://sv-pt.ru'] ] ] ); $bot->sendMessage($message->getChat()->getId(),"Перейти на сайт", null, false, null, $keyboard); }); $bot->run(); ?>
Собственно создаем в директорию в моем случаии в папке 1/po.php в котором мы и будем писать код нашего проекта. Внимание: кодировка файла — utf-8 без bom!
6. Код по частям
С помощью команды /start выводим строку приветствия. Выполняется простая работа со строками.
$bot->command('start', function ($message) use ($bot) { $answer = 'Добро пожаловать. Посетите наш сайт https://sv-pt.ru. Подробное описание по ссылке'; $bot->sendMessage($message->getChat()->getId(), $answer); });
С помощью команды /help выводим полную справку команд. Которую можно использовать в данном боте.
$bot->command('help', function ($message) use ($bot) { $answer = 'Команды: /start - Начало /help - Помощь /mess - Сообщение /foto - Картинки /doc - Документ /video - Видео /gif - Гиф анимация /knopka - Кнопка '; $bot->sendMessage($message->getChat()->getId(), $answer); });
С помощью команды $bot->sendMessage. Мы отправляем свободную строковая переменная по вашему желанию. В данном случаи переменную $mess.
$bot->command('mess', function ($message) use ($bot) { $mess = 'Текст сообщения'; $bot->sendMessage($message->getChat()->getId(), $mess); });
Далее обрабатываем фотографии с помощью команды отправки фото $bot->sendPhoto. Используем ссылку на фото и подпись с низу фотографии.
$bot->command('foto', function ($message) use ($bot) { $siteimg = 'https://sv-pt.ru/download/telegram/svpt_bot/bot.png'; $bot->sendPhoto($message->getChat()->getId(), $siteimg,'Отправляем картинку'); });
Далее идет пример отправки документов с помощью команды $bot->sendDocument.
Документы, в отличие от картинок, на сервер телеграма надо оправлять в POST формате, библиотека сделает все за вас. Для начала файл документа нам надо загрузить в папку с ботом:
$bot->command('doc', function ($message) use ($bot) { $sitedoc = new \CURLFile('file.txt'); $bot->sendDocument($message->getChat()->getId(), $sitedoc); });
Далее отправку выполняем с помощью команды отправки видео $bot->sendVideo. Используем ссылку на видео.
$bot->command('video', function ($message) use ($bot) { $sitevideo = 'https://sv-pt.ru/download/telegram/svpt_bot/sample.mp4'; $bot->sendVideo($message->getChat()->getId(), $sitevideo); });
Отправка гиф анимации выполняется аналогично видео форматам с помощью $bot->sendVideo.
$bot->command('gif', function ($message) use ($bot) { $sitegif = 'https://sv-pt.ru/download/telegram/svpt_bot/bot.gif'; $bot->sendVideo($message->getChat()->getId(), $sitegif); });
Обработка кнопок выполняется с помощью InlineKeyboardMarkup библиотеки. А отправка выполняется как и отправку простого текста $bot->sendMessage. В данном примере выводится три кнопки с помощью hex2bin(‘f09f97a1’) можно вставить понравившиеся смайлики. При нажатии выполняется переход на сайт https://sv-pt.ru
$bot->command('knopka', function ($message) use ($bot) { $keyboard = new \TelegramBot\Api\Types\Inline\InlineKeyboardMarkup( [ [ ['callback_data' => 'smile4', 'text' => hex2bin('f09f97a1').'Подробная инс. 1', 'url' => 'https://sv-pt.ru'], ['callback_data' => 'smile4', 'text' => hex2bin('f09f97a2').'Подробная инс. 2', 'url' => 'https://sv-pt.ru'], ['callback_data' => 'smile4', 'text' => hex2bin('f09f97a3').'Подробная инс. 3', 'url' => 'https://sv-pt.ru'] ] ] ); $bot->sendMessage($message->getChat()->getId(),"Выберите вариант", null, false, null, $keyboard); });