Как установить webhook telegram
Для начала что такое Webhook, в контексте телеграм ботов есть два варианта взаимодействия с API:
webhook - Это тоже штука для того что бы бот понимал что изменилось, но в данном случае не бот опрашивает телеграм на наличие изменений, а телеграм "шлет" изменения для телеграм бота. Тут есть несколько важных моментов, для того что бы работал webhook у вашего бота должно быть доменное имя с настроенным ssl сертификатом, иначе не секюрно и телеграм откажется взаимодействовать с вашим ботом, и тут когда я начинал "играться" с webhook у меня возник вопрос, а как вообще это настроить для тестов, да и вообще как это настроить? ниже я попытаюсь это описать, а именно как развернуть это локально для разработки и самообучения. Для работы будет использоваться python, flask, ngrok, telebot
1 - Начнем пожалуй с самого кода (я надеюсь вы уже сделали самого бота в телеграм? нуу через BotFather? если нет, тут мануал), когда нам телеграм будет слать запросы мы должны их не только как-то принять, но и обработать, в этом нам поможет flask ну и естественно python, код базовой и довольно тестовой (то есть не для прода) версии ниже, сори что скрин, я не нашел как тут разместить код в удобочитаемом виде:
В самом верху вы видите 4 константы (по хорошему их бы вынести в отдельный какой-то конфиг):
API_TOKEN - Когда вы создадите бот в BotFather, вам будет выдан токен, вот его нужно добавить сюда
APP_HOST = '127.0.0.1' - Эта и следующая переменная для flask, он будет принимать запросы которые идут на порт и интерфейс указанный в этих переменных
APP_PORT = '8444'
Так же я подключил logger что бы удобней было контролировать то, что хочется видеть в в логах.
Помогает flask понять, какой тип запросов обрабатывать, и описывает то, что ему делать
если запрос который пришел был немного не таким как ожидалось)
видете в блоке json_string = flask.request.get_data().decode('utf-8') ? json_string это как раз
тот объект json который мы приняли от телеграм, он "скармливается" в telebot, и потом в хендлерах (как в данном случае start) будет доступен как аргумент функции (правда без пустых значений) в данном случае в виде message
а вот теперь самое интересное, что по доменному имени? и выход есть, ngrok, переходим на их сайт, создаем аккаунт, следуем всем инструкциям и скачиваем бинарный файл (ну или инсталлируем, как удобно, так как у меня мак, я скачал бинарный файл и просто разместил его в /usr/local/bin/ngrok, в итоге он стал доступен просто вызвав ngrok, не забудьте если делаете так же поставить исполняемый бит на файл chmod +x /usr/local/bin/ngrok, что бы у него было право на исполнение ) потом его нужно запустить, и тут все просто, пишем:
и вы увидите что-то на подобие этого:
Что это значит? ngrok сгенерит адрес который отображается в консоли:
Я тогда давно написал статью про создание Telegram бота, и обещал дополнить её описанием настройки работы через webhook, но так и не дополнил. Вот только сейчас дошли руки.
Как пишут в документации, общаться с серверами Telegram бот может двумя способами:
Разницу можно изобразить следующим образом:
Что нужно сделать:
Сертификат
С доменом и сертификатом просто. Домен у меня уже был, а сертификат я получил по этой инструкции.
Вариант с самоподписанным сертификатом на прямой IP адрес я оставляю вам на самостоятельное изучение.
Серверная часть
Ставим необходимые пакеты:
И сокращённо код бота теперь такой:
Обратите также внимание на отличия от стандартного примера из репозитория:
- в качестве файла сертификата указан fullchain.pem , а не cert.pem ;
- удалён код снятия и установки webhook’а.
Так как бота я запускаю не из-под root’а, сервис начал валиться с такой ошибкой:
То есть, у пользователя, из-под которого выполняется скрипт, нет доступа к /etc/letsencrypt/ , чтобы открыть файл сертификата. Я попытался дать доступ к каталогу для новой группы, включив в неё этого пользователя:
Но он один фиг не мог открыть файлы оттуда, даже простой ls выдавал ошибку доступа. В общем, или мои познания Linux полный отстой, или одно из двух. Пришлось тупо назначить его владельцем:
Тогда сервис запустился нормально.
Теперь осталось самое, как оказалось, сложное - зарегистрировать endpoint бота в Telegram. Сложности возникли потому, что я сначала неправильно понял принцип составления endpoint’а, а также из-за проблем с проверкой сертификата.
Пока я экспериментировал и разбирался с форматом endpoint’а, Telegram возвращал мне нормальный результат:
Но потом я его видимо задолбал, и он стал возвращать мне следующее:
Но оказалось, что это ни на что не влияет, и webhook нормально устанавливается, так что можно даже не дожидаться таймаута, а просто отменять запрос через пару секунд.
Проверить статус webhook’а можно таким запросом:
Если всё нормально, должно вернуть такое:
Как видим, в поле url стоит наш endpoint.
Однако, мне оно сейчас возвращает такое:
Что указывает на некие проблемы с сертификатом. При этом бот работает нормально, то есть эта ошибка ни на что не влияет. Однако, если вместо fullchain.pem оставить cert.pem (как было указано в примере), то бот работать перестанет.
Ну и всё, не так уж и сложно. Если бы в документации (и сторонних манулах из интернетов) была указана такая простая вещь, что для webhook’а всего-то нужен лишь веб-сервер на стороне бота, я бы это сделал уже сто лет назад. Конечно, продвинутым чувакам это скорее всего было очевидно сразу, но мнe - нет.
Важно! Необходимо иметь веские основания, чтобы перейти к опросу Telegram серверов при помощи webhook. Не делайте этого просто потому, что это звучит здорово.
Различие между polling и webhook является:
Содержание:
Что необходимо для подключения к Telegram через webhook .
-
Публичный IP-адрес или домен. Обычно это означает, что запуск бота должен осуществляться на VPS сервере.
Есть два способа сделать это:
- Подключить проверенный сертификат, выданный доверенным центром сертификации (CA)
- Самостоятельно создать самоподписанный сертификат SSL. Это проще, и в этом нет никакого недостатка.
Чтобы создать самоподписанный SSL-сертификат с помощью openssl , выполните следующую команду в терминале:
Однако у этого решения есть ограничение. Telegram в настоящее время поддерживает только четыре порта для веб-перехватчиков: 443, 80, 88 и 8443. В результате можно запускать не более четырех ботов на одном домене/IP-адресе.
Обратный прокси-сервер + встроенный сервер webhook .
Чтобы решить эту проблему, можно использовать обратный прокси-сервер, такой как nginx или haproxy , а также можно использовать Heroku .
В зависимости от того, какой прокси-сервер используется, реализация будет выглядеть немного иначе. Ниже перечислены несколько возможных настроек.
Использование webhook на Heroku.
На Heroku использовать webhook можно на свободном плане, т.к. он будет автоматически управлять временем простоя. Для пользователя Heroku будет настроен обратный прокси и создана среда исполнения. Из этой среды необходимо будет извлечь порт, который бот должен прослушивать. Heroku управляет SSL на стороне прокси-сервера, следовательно не нужно создавать сертификат самостоятельно.
Использование nginx с одним доменом/портом для всех ботов
Все боты устанавливают свой URL-адрес на один и тот же домен и порт, но с другим url_path . Встроенный в python-telegram-bot сервер обычно запускается по адресу localhost или 127.0.0.1, порт может быть любым.
Пример кода для запуска бота:
Пример конфигурации для nginx с двумя настроенными ботами (представлены важные части конфига):
Использование haproxy с одним поддоменом на бота.
Примечание: Необходимо иметь домен привязанный к IP-адресу сервера.
Я тогда давно написал статью про создание Telegram бота, и обещал дополнить её описанием настройки работы через webhook, но так и не дополнил. Вот только сейчас дошли руки.
Что это такое
Как пишут в документации, общаться с серверами Telegram бот может двумя способами:
Разницу можно изобразить следующим образом:
Как настроить
Что нужно сделать:
Сертификат
С доменом и сертификатом просто. Домен у меня уже был, а сертификат я получил по этой инструкции.
Вариант с самоподписанным сертификатом на прямой IP адрес я оставляю вам на самостоятельное изучение.
Серверная часть
Ставим необходимые пакеты:
И сокращённо код бота теперь такой:
Обратите также внимание на отличия от стандартного примера из репозитория:
- в качестве файла сертификата указан fullchain.pem , а не cert.pem ;
- удалён код снятия и установки webhook’а.
Так как бота я запускаю не из-под root’а, сервис начал валиться с такой ошибкой:
То есть, у пользователя, из-под которого выполняется скрипт, нет доступа к /etc/letsencrypt/ , чтобы открыть файл сертификата. Я попытался дать доступ к каталогу для новой группы, включив в неё этого пользователя:
Но он один фиг не мог открыть файлы оттуда, даже простой ls выдавал ошибку доступа. В общем, или мои познания Linux полный отстой, или одно из двух. Пришлось тупо назначить его владельцем:
Тогда сервис запустился нормально.
Пока я экспериментировал и разбирался с форматом endpoint’а, Telegram возвращал мне нормальный результат:
Но потом я его видимо задолбал, и он стал возвращать мне следующее:
Но оказалось, что это ни на что не влияет, и webhook нормально устанавливается, так что можно даже не дожидаться таймаута, а просто отменять запрос через пару секунд.
Проверить статус webhook’а можно таким запросом:
Если всё нормально, должно вернуть такое:
Как видим, в поле url стоит наш endpoint.
Однако, мне оно сейчас возвращает такое:
Что указывает на некие проблемы с сертификатом. При этом бот работает нормально, то есть эта ошибка ни на что не влияет. Однако, если вместо fullchain.pem оставить cert.pem (как было указано в примере), то бот работать перестанет.
Регистрируем бот у @BotFather, устанавливаем WebHook
Последовательность действий для создания любого бота одинаковая:
Если все прошло без замечаний со стороны @BotFather, то по итогу вам выведется на экран Token API, если вы его сразу использовать не будете, то можно его куда-нибудь записать. Также его можно запросить снова если вы его забыли или потеряли. Редактировать бота можно у @BotFather, для этого запросите список ваших ботов /mybots , выберите из списка нужного бота и далее при необходимости вы можете отредактировать его информацию, для этого в меню бота выберите Edit Bot :
Обратите внимание, что поменять имя бота (@) в настройках возможности нет.
Методы взаимодействия с Bot API
Независимо от того, какой вариант вы выбрали, вы получите в результате JSON-сериализованные объекты (WIKI).
В случае с webHook обновления вам будут доставляться Bot API по указанному адресу сразу же как только они появятся. Если в ответ API получит статус обработки его запроса не 200 OK, а другой, например, 500 (ошибка сервера) то обновления подвиснут и будут периодически к вам стучатся, и успокоятся только в случае получения в ответ статуса 200 ОК.
Устанавливаем WebHook
Для установки WebHook есть специальный метод setWebHook . Нам просто необходимо в параметре url передать web-адрес где будут обрабатываться данные отправленные Telegram Bot API. Допустим, что у вас такой же хостинг как у меня, и за работу бота будет отвечать файл index.php , который лежит в директории bots в корне сайта.
Если структура файлов у вас совпадает, и у вас есть доменное имя, а также установленный SSL сертификат, тогда назначаем webHook используя вот этот URL:
Вставляем его в адресную строку браузера и переходим, в случае если все прошло без ошибок, на экране у вас выведется вот такая информация:
Это означает, что все прошло хорошо и WebHook установлен. Теперь можно спокойно начать работать над реализацией бота.
Дополнительные настройки WebHook
Также вместе с параметром url в методе setWebHook можно передать:
В случае если будет необходимо переназначить webHook, то нужно вызвать метод setWebHook еще раз и указать в качестве значения параметра url новый адрес обработчика данных от Bot API.
Для удаления webHook и перехода к getUpdates используйте метод deleteWebhook , параметры передавать не требуется.
Для получения, текущего состояние webHook используйте метод getWebhookInfo , параметры передавать не требуется.
Методы вызываются при помощи
Комментарии
Внимание!
Убедитесь, что эта страница открыта в браузере, а не в приложении Telegram. В противном случае авторизация пройдет только в приложении Telegram.
Telegram Webhook
Что нужно для рабочего коннекта Webhook
Команды работы с методом описаны в Telegram Webhook Bot API. К ним относятся:
Активация Webhook Telegram
Чтобы использовать метод постоянного коннекта сервера и бота, следует запустить программный код, в котором выполняется команда API для Телеграм.
Для официального сертификата SSL :
Для самоподписанного сертификата :
Например, для PHP это будет curl_exec(), а для Python — requests.get().
Для установки сертификата на сервера чаще всего используется криптографический пакет с открытым исходным кодом OpenSSL . Его можно скачать с официального сайта. Настройка зависит от операционной системы и сервера.
Официальные цифровые подписи устанавливаются на хостинге провайдером. Эта одна из услуг большинства компаний.
Прежде чем использовать Webhooks убедитесь, что вам доступен этот функционал.
Читайте также: