Содержание
Telegram Webhook – это технология, позволяющая отслеживать в чате события в реальном времени и отправлять информацию о нем на указанный адрес. Если вы создали бот, то метод необходим, чтобы система могла реагировать на сообщения и действия пользователей. Получая информацию о них, сервер отправляет ее программе бота, в алгоритм которой заложена обработка.
Что нужно для рабочего коннекта Webhook
- Адрес (URL) страницы с программным кодом;
- Поддержка IPv4, но рекомендуем поддержка IPv6 из-за частой блокировки телеграмма по IPv4;
- Возможность сервера обрабатывать HTTPS трафик;
- Наличие SSL сертификата.
Команды работы с методом описаны в Telegram Webhook Bot API. К ним относятся:
- setWebhook – установка соединения. При этом необходимо передать адрес, на который будут отправляться сообщения из чата;
- deleteWebhook – удаление соединения. Указание предыдущей команды без параметров также удалит его;
- getWebhookInfo – получение текущего статуса соединения.
Активация Webhook Telegram
Чтобы использовать метод постоянного коннекта сервера и бота, следует запустить программный код, в котором выполняется команда API для Телеграм.
Для официального сертификата SSL:
https://api.telegram.org/botТОКЕН/setWebhook?url=ВАШ_ДОМЕН
Для самоподписанного сертификата:
https://api.telegram.org/botТОКЕН/setWebhook?url=ВАШ_ДОМЕН&certificate=ФАЙЛ_СЕРТИФИКАТА
Какая команда будет использоваться для отправки сообщения в мессенджер зависит от языка программирования.
Например, для PHP это будет curl_exec(), а для Python — requests.get().
Для установки сертификата на сервера чаще всего используется криптографический пакет с открытым исходным кодом OpenSSL. Его можно скачать с официального сайта. Настройка зависит от операционной системы и сервера.
Официальные цифровые подписи устанавливаются на хостинге провайдером. Эта одна из услуг большинства компаний.
Прежде чем использовать Webhooks убедитесь, что вам доступен этот функционал.
Создание бота для Telegram на Webhooks предпочтительнее, чем использования метода getUpdates. Во втором случае приходится закладывать в код постоянное обращение этой команды к боту. Это делается в циклическом режиме. В конце концов начинаются баги, и он подвисает. Webhook же держит постоянное соединение, но запросы отправляются только когда произошло событие, например, пользователь ввел сообщение.
Все кто начинает писать различных telegram ботов рано или поздно доходят до бота на вебхуках (webhook).
Для чего нужны webhook?
Когда мы пишем telegram бота и запускаем без вебхуков, то наш бот (который крутится на нашем сервере / компьютере) постоянно обращается к серверам телеграмма и спрашивает есть ли для него информация. Иногда сервера телеграмма не отвечают или посылают куда подальше и наш бот перестает работать. Это в принципе не большая проблема, можно же положить наш скрипт под тот же самый supervisor, который будет перезапускать демонок со скриптом и в целом то вся проблема решена. Конечно при таком раскладе будет периодически простой бота в 2-15 сек (а может и больше, зависит еще от тачки на котором крутится бот) и еще наш бот будет постоянно обращаться к серверам телеграмма, создавая на них нагрузку. В принципе это не наша проблема, но почему не сделать по человечески? Почему не увеличить скорость работы бота, отказоустойчивость и убрать создаваемую нагрузку? Для этого и приходят к нам на помощь Webhook. При работе бота на вебхуках сервер телеграмма сам обращается к нашему боту когда есть новые данные. Собственно и на наш сервер нагрузки будет меньше, ведь бот чаще будет простаивать, что рассмотрим как несомненный плюс.
Что необходимо для Webhook?
Нам понадобится сервер с белым IP адресом и SSL сертификат, можно самоподписной. Так же если у вас есть дома статический (белый) IPадрес, то можно сделать проброс портов до компьютера, на котором будет работать телеграмм бот. Но имейте ввиду, что для вебхуков нужен один из портов 80, 443, 8443.
Собственно небольшое ТЗ: нужно поднять свой веб-сервер, который висит на порту 443 (например) с открытым SSL сертификатом. Я покажу как это делается на примере python и Flask.
Настраиваем сервер
Вообще в интернете много статей как настроить webhook для телеграмм бота на python, но блииииина, нигде не указана пара нюансов, из-за которых ничего не работает и приходится сидеть и копаться, причем на офф страничке по APITelegram так же ничего интересного не указано для корректной работы сервера.
Сразу же ставим сам Flask:
Нужно сделать самоподписной сертификат:
Путь до файла ключа и сертификата, как и название, подставьте свои.
Теперь нам нужно сделать своего бота в @BotFather (в телеграмме, уже не раз обсуждалось как его сделать, да и в инете гляньте, там полно статей с картинками) и привязать нашего бота к серверу через API телеграмма:
заменяем BOT_TOKEN на токен, который получили при создании бота и IP:PORT на IP адрес нашего сервера и порт, на котором будет поднят наш сервис.
Все готово для того, чтобы закодить наш сервис и принять первое сообщение:
Такой небольшой telegram bot на webhook, который при запросе /start присылает сообщение «Привет WebHook» .
Не забудьте подставить свой IP адрес в host=»IP» и url=»https://IP:PORT», и конечно же указать правильный пути до сертификатов.
Теперь можно запустить бота и отправить ему /start. В логе фласка можно будет увидеть POST запрос в корень «сайта», в котором уже происходит наша обработка.
Вроде ничего сложного, но первый раз я потратил достаточно времени чтобы понять что нужно затирать вебхуки перед новым запуском и заново их привязывать, при этом открыв файл с сертификатом на чтение и передав в API телеграмма.
Если кому то вообще ничего не понятно, то просто копируйте команды терминала и код python, и все будет работать.
Если вы нашли ошибку, пожалуйста, выделите фрагмент текста и нажмите Ctrl+Enter.
Боты «Телеграма» быстро вошли в обиход абонентов. Их создание на Webhooks предпочтительней, нежели используемый ранее метод getUpdates. Это объясняется, прежде всего, наличием постоянного соединения. Способ имеет разные пути реализации, легок в понимании, надежен.
Зачем нужны боты
Роботы – небольшие программы с рядом возможностей, которые значительно упрощают жизнь пользователей мессенджера. Диапазон применения обширен. Они могут получать новости, искать аудио, видео, торговать ценными бумагами, отслеживать курс валют.
Основная задача bota api – отвечать на поступившую команду путем имитации действий живого человека.
Как ими пользоваться
Алгоритм работы бота Webhooks прост в понимании.
Телеграм Webhook.
Процесс взаимодействия между человеком и роботом производится через ряд последовательных команд:
- Абонент пишет команду.
- Робот обрабатывает и отправляет ее на сервер.
- Команда обрабатывается и отправляется обратно в виде ответа.
- Bot выводит ее на экран.
Такая последовательность повторяется при каждом контакте с телеграм-ботом.
Категории ботов
Используемые в Telegram боты имеют общий вид. Их единственное отличие от обычных профилей – наличие приставки «bot» в конце имени.
Существующие помощники делятся на следующие виды:
- Игровые.
- Ассистенты.
- Чат-боты.
- Информаторы.
Что такое WebHooks
Webhooks – метод отслеживания отдельно взятых событий в реальном времени. Работает на системе eSputnik. «Вебхук» доставляет данные обо всех активностях контактов без дополнительных запросов с вашей стороны. Получаемая информация регулярно поступает на указанный URL POST.
Как настроить
Настройка Telegram Webhook – сложный процесс.
Он выполняется в следующей последовательности:
- Устанавливаем программу Node.js, создаем новый проект.
- Для создания нужных файлов и зависимостей необходимо прописать команду: https://ibb.co/Zgx0FM2.
- Если все верно, то каталог setWebhook будет иметь вид: https://ibb.co/sVHcttC.
- В файле index.js пишем: https://ibb.co/V2Y9kch.
- В файл index.js прописываем: https://ibb.co/VJJnvq6.
- Создаем проверку Вебхук. Добавляем следующий код: https://ibb.co/2hsrk8m.
Данный код дает возможность «Вебхук» пройти проверку на мессенджер-платформе, которая подтверждает работоспособность и подлинность Webhook Telegram bot.
Как прописать бот на Вебхук
Создание помощника для Telegram на Webhooks несколько отличается от процесса создания обычного робота. Его настройка выполняется путем использования самоподписанных сертификатов.
Правильный ключ и самоподписанный сертификат.
Операции имеют определенную последовательность:
- Устанавливаем пакет openSSl.
- Генерируем правильный ключ и самоподписанный сертификат.
- При предложении ввести Common Name необходимо ввести адрес сервера: https://ibb.co/GpDF2dy.
- Перемещаемся в каталог сертификатов, создаем bot.py и config.py.
- Во втором каталоге прописываем переменную токен бота.
- Открываем bot.py, выполняем импорт двух библиотек.
- Создаем следующий экземпляр робота: https://ibb.co/zJQ9Jb0.
- Реализуем веб сервер: https://ibb.co/k578dNR.
- Отправляем полученный ранее самоподписанный сертификат и обратный адрес на сервер: https://ibb.co/qCfc4vR.
- Указываем его настройки, производим запуск: https://ibb.co/rsntJMR.
- Запускаем bot Telegram setWebhook, активируем его, отправляем несколько сообщений: https://ibb.co/dKQ6HpQ.
- Смотрим открывшееся окно. Если код статуса равен 200, значит все хорошо, помощник получил сообщение и он работоспособный.
Что делать, если бот не работает
Малознающие пользователи, создавшие робота по примеру или существующему алгоритму, часто сталкиваются с ситуацией, когда помощник перестает работать.
При каких-либо неполадках Webhook Python на Telegram или на других языках программирования следует придерживаться рекомендаций:
- Пропишите роботу команду @Botfather. Она позволит избавиться от имеющихся технологических проблем. При необходимости будет создан новый исправленный бот.
- Для активации чата напишите /setprivacy. Укажите адрес своего робота, дождитесь ответа. Он подготовит список имеющихся ошибок, укажет пути их исправления.
- В случае, если вы заметили, что bot работает, а чат не отвечает – обратитесь в службу поддержки.
- Если вышел из строя созданный вами помощник – ищите ошибку в коде.
Выводы
Как видим, создание бота для Telegram на методе Webhooks не сложный, но скрупулезный процесс, требующий предельной внимательности. Указанные выше инструкции помогут вам разобраться в данном вопросе. Процесс создания собственного помощника займет около получаса времени и не вызовет затруднений.
Детальная инструкция видна на видео:
Недавно назрела необходимость создать простого бота, который бы взаимодействовал с классами и методами из материнского проекта (сайта). В принципе можно было бы писать на любом языке, а потом написать некий коннектор, взаимодействие между этим всем. Но лично для меня было в разы проще написать самого бота также на PHP.
Впрочем приступим к делу. Первым делом обсудим что нам понадобится:
- PHP 5.6+
- NGINX или Apache в качестве веб-сервера.
- В случае с Nginx понадобится ещё php-fpm, например.
- Сертификат от LetsEncrypt (то есть без домена никак, но разве это проблема в 2016 году? Сейчас можно с легкостью купить домен в зоне
.xyz
за доллар-два). - ОПЦИОНАЛЬНО: MySQL-совместимая база данных. То есть непосредственно MySQL или MariaDB.
То есть вам нужен готовый вебсервер, с настроенным PHP и SSL-соединением. База данных опциональна и будет использоваться для создания интерактивных диалогов, в которых бот будет учитывать прошлые сообщения. Как настроить SSL в случае с NGINX, вы можете прочитать здесь.
Для чего SSL спросите вы? Для того чтобы работать с Telegram, используя вебхуки. Они надежней и удобнее, классического Long Polling. Для тех кто совсем не понимает о чем я, поясняю:
- Long Polling: Наш сервер бы постоянно опрашивал Telegram об обновлениях.
- Webhooks: Telegram сам будет посылать эти обновления нам на сервер.
То есть ваш сервер будет отвечать как минимум быстрее, будет меньше нагружен и не будет делать лишнюю работу. Помимо этого этот метод надежнее в работе.
Итак, вы настроили сервер, для проверки можете создать в корне (к примеру у вас он может быть здесь: /var/www/project1
) файл test.php
и в теле написать:
phpinfo();
Теперь перейдите в браузере на https://domain.xyz/test.php
, вы должны получить страницу с конфигурацией вашего PHP. Помимо этого убедитесь, что SSL настроен корректно (к примеру на сайте SSLLabs).
Сервер готов, можно начинать создание бота.
akalongman/php-telegram-bot — самая удобная библиотека
Кому-то эта библиотека может показаться даже немного перегруженной, но на мой взгляд для экспресс создания бота — самое то. Библиотека уже имеет набор различных команд для вашего бота.
Интересно также то, что есть команды администратора бота, которые позволяют быстро узнать список пользователей, которые им пользуются, возможность рассылки объявлений и т.д.
Разумеется большинство этих команд будут использовать базу даннах, так что настоятельно рекомендую настроить. Поэтому, изучив эти команды, вы сможете написать бота практически любой сложности. В последствии эти команды можно будет отключить и использовать только свои.
Для меня PHP был изначально новым языком, поэтому все что я делал — я делал, по сути, в первый раз. Поэтому для некоторых вещи, описанные ниже, будут весьма очевидными. Первым делом нам потребуется Composer, нечто вроде пакетного менеджера для PHP, с его помощью мы сможем легко поддерживать актуальную версию библиотеки:
cd /var/www/project1 curl -sS https://getcomposer.org/installer | php
Разумеется не забудьте указать свой путь до проекта.
После выполнения этой команды Composer автоматически установится в директорию проекта. Теперь установим саму библиотеку php-telegram-bot
:
php composer.phar require longman/telegram-bot
Библиотека установлена и теперь мы можем переходить непосредственно к созданию самого бота. Создайте файл hook.php
в корневой директории и каталог commands
. Наполните файл hook.php
следующим содержимым:
require_once __DIR__ . "/vendor/autoload.php"; // Получите токен у бота @BotFather $API_KEY = your_token; // Получите свой User ID у бота @MyTelegramID_bot $USER_ID = your_userid; // Придумайте своему боту имя $BOT_NAME = "Your Bot"; // Данные базы данных $mysql_credentials = [ 'host' => 'localhost', 'user' => 'db_user', 'password' => 'db_pass', 'database' => 'db', ]; use LongmanTelegramBotTelegram; use LongmanTelegramBotTelegramLog; try { // Инициализация бота $telegram = new Telegram($API_KEY, $BOT_NAME); // Подключение базы данных $telegram->enableMySQL($mysql_credentials); // Добавление папки commands, // в которой будут лежать ваши личные комманды $telegram->addCommandsPath(__DIR__ . "/commands"); // Добавление администратора бота $telegram->enableAdmin((int)$USER_ID); // Включение логов TelegramLog::initUpdateLog($BOT_NAME . '_update.log'); // Опционально. Здесь вы можете указать кастомный объект update, // чтобы поймать ошибки через var_dump. //$telegram->setCustomInput(""); // Основной обработчик событий $telegram->handle(); } catch (LongmanTelegramBotExceptionTelegramException $e) { // В случае неудачи будет выведена ошибка var_dump($e); }
Внимательно прочитайте комментарии, я описал каждую строчку.
Обработчик готов, теперь укажите Telegram вебхук. Другими словами адрес вашего сервера, на который Telegram должен посылать обновления. Просто введите в адресную строку подобный запрос, не забыв указать вместо YOURTOKEN свой токен, который вам выдал @BotFather: https://api.telegram.org/botYOURTOKEN/setwebhook?url=https://domain.xyz/hook.php
Бот почти готов, наберите в браузере https://domain.xyz/hook.php
. Вы должны увидеть вывод и ошибку Input is empty!
. Если всё так, то вероятно ваш бот настроен и готов к работе. Попросту напишите ему в Telegram и отправьте, к примеру команду /help
. Если бот вам ответит — настройка завешена.
В созданном вами каталоге commands
создайте новый файл с названием вашей команды, например, myNewCustomCommand.php
и наполните её следующим содержимым:
namespace LongmanTelegramBotCommandsUserCommands; use LongmanTelegramBotCommandsUserCommand; use LongmanTelegramBotRequest; class myCustomCommand extends UserCommand { protected $name = 'mycustomcommand'; protected $description = 'Для тестирования'; protected $usage = '/mycustomcommand'; protected $version = '1.0.0'; public function execute() { // Основной код return Request::sendMessage($data); } }
Используйте эту базу во всех своих командах. Смотрите примеры уже написаных команд, коих, благо, множество и пишите свои!
Telegram — быстро развивающийся мессенджер, множество программистов уже попробовали себя в создании ботов для telegram.
В данной статье мы разберёмся с созданием самоподписанного сертификата, научимся устанавливать этот сертификат в nginx и научим нашего бота получать обновления с помощью способа WebHook.
Методы взаимодействия с ботом:
Телеграмм разрешает устанавливать свои сертификаты https, что позволит нас не покупать дорогостоящий сертификат.
Для взаимодействия с пользователем в телеграмме используются 2 принципиально разных способа.
Существует ещё один способ получения сообщений от бота. Это использование WebHook. Идея заключается в том, что сервер сам будет присылать нам сообщения пользователя, а мы будем решать, что с ними делать. Каждый раз при получении обновления на этот адрес будет отправлен HTTPS POST с сериализованным в JSON объектом Update. В основном мы будем работать с объектом Message, который, соответственно, получим из Update.
Настройка синхронизации бота telegram с помощью setWebHook:
Приступим к настройке данного способа синхронизации. Для начала нам будет необходимо создать и настроить ssl сертификат.
Генерация и установка ssl сертификата:
Чтобы создать сертификат нам необходимо выполнить следующие действия:
Создадим папку в которую поместим наши полученные сертификаты:
Генерируем наш сертификат с помощью OpenSSL.
Обратите внимание, что вместо
Вы должны написать имя своего домена, в моём случае это
После выполнения данных действий в папке /ssl/, должны появится 2 файла: YOURPRIVATE.key и YOURPUBLIC.pem
Если всё получилось, то переходим к следующему шагу. Так как телеграмм передаёт всё по безопасному протоколу ssl мы должны настроить свой сервер, чтобы он поддерживал его. У меня установлен nginx, соответственно, мы будем работать с ним.
Конфигурация веб-сервера:
Переходим к конфигурации веб-сервера. Нам понадобится файл конфигурации nginx — nginx.conf. У меня он находится в папке: /usr/local/etc/nginx.
Открываем файл и переходим к разделу с нашим веб сервером.
У меня он выглядит следующим образом:
Мы должны добавить несколько строк, чтобы сервер начал поддерживать https.
В итоге у нас должно получится следующие:
После выполнения всех пунктов необходимо перезапустить nginx
Отлично. На данные момент мы имеем установленный и работающий сертификат. У нас всё готово для перехода к setWebhook.
Метод setWebHook:
Для начала разберёмся, что принимает на вход метод:
Параметры | Тип | Описание |
url | String | HTTPS url для отправки запросов. Чтобы удалить вебхук,
отправьте пустую строку. |
certificate | InputFile | Загрузка публичного ключа для проверки
корневого сертификата. Подробнее в разделе про самоподписанные сертификаты. |
URL — адрес до нашего скрипта-обработчика, куда будут приходить сообщения от сервера telegram.
certificate — наш полученный файл YOURPUBLIC.pem.
Установка метода синхронизации telegram bot с помощью setWebHook:
Теперь переходим на наш веб-сервер. Для удобства создадим папку telegram и в ней файл installhandler.php
У нас должно получится следующее:
kostyakulakov.ru/telegram/installhandler.php
Для безопасности я удалил все файлы, ссылка предоставлена для ознакомления с расположением файла инициализации обработчика.
Теперь вставим в наш файл следующий php код, который позволит зарегистрировать ссылку обработчика с помощью метода setWebhook
Не забудьте установить токен и путь до обработчика.
Для начала мы устанавливаем токен и путь до вашего публичного ключа сертификата.
Потом в функции regHandler, мы формируем POST-запрос с сылкой на обработчик и прикреплённым ключом. Отправляем. Выводим результат.
Если всё прошло хорошо, то вы должны получит на экран следующее:
Если всё так и прошло, то переходим к следующему шага. Если нет, то пишите в комментарии, мы обязательно разберёмся и поможем вам.
Пример обработчика пользовательских сообщений:
Теперь создадим сам обработчик пользовательских сообщений. Мы уже указывали путь в функции до него: «https://kostyakulakov.ru/telegram/handler.php»
Создадим в папке telegram файл handler.php
и наполним его следующим кодом, который будет отвечать на пользовательские сообщения:
На каждое сообщение пользователя, она будет отвечать следующим образом: «{Имя пользователя}, я получила ваше сообщение!».
Выглядит это так:
Дальше играет роль только ваша фантазия, можете обрабатывать сообщения и отвечать на них. Вы свободны в ваших действиях.
В конечном итоге мы смогли синхронизировать нашего бота с сервером, теперь мы можем обрабатывать сообщения от пользователя Telegram с помощью Web Hook.
Спасибо за внимание.
Используемые источники:
- https://telegramzy.ru/webhook/
- https://be-miner.info/telegram-bot-webhook-kak-nastroit-i-zapustit/
- https://stelegram.ru/faq/kak-sozdat-bota-dlya-telegram-na-webhook
- https://krasovsky.me/it/2016/09/telegram-php-bot/
- https://kostyakulakov.ru/telegram-bot-setwebhook/