Синхронизация бота Telegram с помощью setWebhook

Telegram — быстро развивающийся мессенджер, множество программистов уже попробовали себя в создании ботов для telegram.

В данной статье мы разберёмся с созданием самоподписанного сертификата, научимся устанавливать этот сертификат в nginx и научим нашего бота получать обновления с помощью способа WebHook.

Методы взаимодействия с ботом:

Телеграмм разрешает устанавливать свои сертификаты https, что позволит нас не покупать дорогостоящий сертификат.

Для взаимодействия с пользователем в телеграмме используются 2 принципиально разных способа.

  1. getUpdates 

Этот метод используется для получения обновлений через long polling (wiki). Ответ возвращается в виде массива объектов Update. У данного способа обновлений есть масса недостатков. Мы должны сами запрашивать с сервера список сообщений пользователей, что не очень удобно. Для этого мы должны запрашивать каждые n секунд с сервера телеграмма данные. Это ресурсоёмко и не рационально. Лично я, не рекомендую без крайне необходимости использовать данный способ.

  1. setWebHook

Существует ещё один способ получения сообщений от бота. Это использование WebHook. Идея заключается в том, что сервер сам будет присылать нам сообщения пользователя, а мы будем решать, что с ними делать. Каждый раз при получении обновления на этот адрес будет отправлен HTTPS POST с сериализованным в JSON объектом Update. В основном мы будем работать с объектом Message, который, соответственно, получим из Update.

Настройка синхронизации бота telegram с помощью setWebHook:

Приступим к настройке данного способа синхронизации. Для начала нам будет необходимо создать и настроить ssl сертификат.

У меня на сервере установлен дистрибутив FreeBSD, соответственно все дальнейшие действия описаны для этой системы.



Генерация и установка ssl сертификата:

Чтобы создать сертификат нам необходимо выполнить следующие действия:

Создадим папку в которую поместим наши полученные сертификаты:

Генерируем наш сертификат с помощью OpenSSL.

Обратите внимание, что вместо

Вы должны написать имя своего домена, в моём случае это

После выполнения данных действий в папке /ssl/, должны появится 2 файла: YOURPRIVATE.key и YOURPUBLIC.pem

Если всё получилось, то переходим к следующему шагу. Так как телеграмм передаёт всё по безопасному протоколу ssl мы должны настроить свой сервер, чтобы он поддерживал его. У меня установлен nginx, соответственно, мы будем работать с ним.

Конфигурация веб-сервера:

Переходим к конфигурации веб-сервера. Нам понадобится файл конфигурации nginx — nginx.conf. У меня он находится в папке: /usr/local/etc/nginx.

Открываем файл и переходим к разделу с нашим веб сервером.

У меня он выглядит следующим образом:

Мы должны добавить несколько строк, чтобы сервер начал поддерживать https.

В итоге у нас должно получится следующие:

После выполнения всех пунктов необходимо перезапустить nginx

Отлично. На данные момент мы имеем установленный и работающий сертификат. У нас всё готово для перехода к setWebhook.

Метод setWebHook:

Для начала разберёмся, что принимает на вход метод:

ПараметрыТипОписание
urlStringHTTPS url для отправки запросов. Чтобы удалить вебхук,

отправьте пустую строку.

certificateInputFileЗагрузка публичного ключа для проверки

корневого сертификата.

Подробнее в разделе про самоподписанные сертификаты.

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.

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

16 Комментарии “Синхронизация бота Telegram с помощью setWebhook

  1. Есть вопрос, сделал все как у вас, но webhook не получает данные. Сертификат стоит, можно делать запросы curl на api. Помогите

    1. Проверьте ещё раз, отправили ли вы сертификат на сервера телеграмма. И проверьте, что регистрация webhook прошла успешно

  2. К сожалению не работает
    Сделал все как описано, но бот со мной не общается
    Если вызвать напрямую handler выдает предупреждение
    failed to open stream: HTTP

    Не очень понимаю как должен бот дергать handler.php

  3. Упорно выдает:
    {«ok»:true,»result»:true,»description»:»Webhook is already deleted»}
    1

    Проблемы с сертификатом?

    Попробовал проверить:
    echo file_get_contents( realpath($path) );
    выдает содержимое сертификата, т.е. по идее все ок.

    ‘certificate’ => ‘@’ . realpath($cert)
    означает передачу содержимого файла по адресу realpath($cert) или пути до файла?

    Как проверить, что не так?

  4. Приветствую. правильно ли я понимаю , что связав БОТ с моим бэкендом по ВЭБХУКУ, вся обработка команд происходит только на моем бэкенде, и вся «типовая» настройка кнопочек и команд через @Manybot будет не активна?! во всяком случае у меня так произошло … а как только деактивировался ВЕБХУК , снова появились кнопки(меню).
    А как сделать , чтобы из меню БОТА команды передавались в бэкенд???

  5. Сделали как описано в данной статье, но увы ничего не заработало. В чем может быть проблема? Куда дальше копать?

  6. А Если бот на phython3.6 с методом getUpdates? как его через WebHook разместить на APACHE centos6/7 ?

  7. на хостинге джино у меня заработало без всяких файлов.
    а как сделать шрифт жирным или курсив и в ответ написать?

Добавить комментарий

Ваш e-mail не будет опубликован.