Как настроить webhook telegram

Вебхуки

С простым ботом наконец-то разобрались, теперь будем осваивать различные “плюшки”. Первая из них и, пожалуй, самая главная, — вебхуки.

А в чём, собственно, разница?

(Следующий абзац был написан в 2015-2016г., библиотеки с того момента много обновлялись, поэтому в некоторых случаях использовать Long Polling будет не хуже, чем вебхуки).
Давайте для начала разберемся, как боты принимают сообщения. Первый и наиболее простой вариант заключается в периодическом опросе серверов Telegram на предмет наличия новой информации. Всё это осуществляется через т.н. Long Polling, т.е. открывается соединение на непродолжительное время и все обновления тут же прилетают боту. Просто, но не очень надежно. Во-первых, серверы Telegram периодически начинают возвращать ошибку 504 (Gateway Timeout), из-за чего некоторые боты впадают в ступор. Даже pyTelegramBotAPI, используемый мной, не всегда может пережить такое. Во-вторых, если одновременно запущено несколько ботов, вероятность столкнуться с ошибками возрастает. Это вдвойне обидно, если сами боты используются не очень часто.

Вебхуки работают несколько иначе. Устанавливая вебхук, вы как бы говорите серверам Telegram: “Слышь, если кто мне напишет, стукни сюда — (ссылка)”. Отпадает необходимость периодически самому опрашивать серверы, тем самым, исчезает неприятная причина падений ботов. Однако за это приходится платить необходимостью установки полноценного веб-сервера на ту машину, на которой планируется запускать ботов. Что ещё неприятно, надо иметь собственный SSL-сертификат, т.к. вебхуки в телеграме работают только по HTTPS. К счастью, в один прекрасный день появилась поддержка самоподписанных сертификатов. Вот об их применении я и расскажу.

Создаем сертификат

Повторюсь: я не считаю себя супер-мега-крутым специалистом в айти, возможно, я что-то делаю неправильно, тем не менее, это работает и выглядит вполне прилично. Ладно, приступим.
Для начала, установим пакет openssl (для Linux):
sudo apt-get install openssl
Затем сгенерируем приватный ключ:
openssl genrsa -out webhook_pkey.pem 2048
Теперь, внимание, генерируем самоподписанный сертификат вот этой вот длинной командой:
openssl req -new -x509 -days 3650 -key webhook_pkey.pem -out webhook_cert.pem
Нам предложат ввести некоторую информацию о себе: двухбуквенный код страны, имя организации и т.д. Если не хотите ничего вводить, ставьте точку. НО! ВАЖНО! Когда дойдете до предложения ввести Common Name, следует написать IP адрес сервера, на котором будет запущен бот.

В результате получим файлы webhook_cert.pem и webhook_pkey.pem , положим их в какой-нибудь пустой каталог, в котором потом будем создавать бота. Сертификаты готовы, теперь займемся ботом. Чтобы не сильно загружать себе мозги, напишем простого echo-bot’а из урока №1, только теперь с использованием сертификата.

Наш вишнёвый сервер

Выше я упомянул необходимость наличия веб-сервера, для работы с вебхуками. Те, кто умело владеет Apache или Nginx, можете дальше не читать. Лично я никак не мог (и не могу до сих пор) понять, как обрабатывать входящие сообщения от этих серверов в Python. Поэтому, было принято простое и довольно эффективное решение — используем веб-фреймворк CherryPy. Это не самый простой фреймворк по сравнению, например, с Flask, но мы будем использовать именно его.
Итак, установим CherryPy простой командой python3 -m pip install cherrypy

Новый старый бот

Перейдем в каталог с нашими сертификатами и создадим файлы bot.py и config.py . В последнем создадим переменную token , в которую передадим токен нашего бота. Открываем bot.py .
Импортируем 2 библиотеки, зададим необходимые константы и создадим экземпляр бота:

Читайте также:  Как отремонтировать замок зажигания от тойота

Обратите внимание, что Telegram поддерживает всего 4 различных порта при работе с самоподписанными сертификатами. Теоретически, это означает, что на одной машине может быть запущено не больше 4 ботов на вебхуках. Практически, это поправимо, но об этом — в следующий раз.

Создадим класс, реализующий экземпляр веб-сервера. Это, в принципе, стандартный код, который от бота к боту сильно меняться не будет:

Посмотрите на название функции: index . Это, по сути, обозначает последнюю часть URL. Поясню на примере: если бы мы хотели получать обновления на адрес 80.100.95.20/webhooksbot , то функцию выше мы бы назвали webhooksbot . index — это аналог отсутствия какой-либо дополнительной маршрутизации. Зачем менять это значение на другое, рассказано здесь 12, сейчас это не нужно.
Итак, что мы видим в коде выше? Принимаем входящие запросы по URL наш.ip.адрес/ , получаем содержимое и прогоняем через набор хэндлеров. Кстати, о них. Т.к. мы реализуем простейших echo-бот, хэндлер нам нужен всего один:

Внимательный читатель всё же заметит одно отличие, о котором я говорить не буду 😉 Заодно ещё один повод открыть документацию.

Далее, отправим серверу наш самоподписанный сертификат и “обратный адрес”, по которому просим сообщать обо всех новых сообщениях:

Наконец, укажем настройки нашего сервера и запустим его!

Обратите внимание на последнюю строку. Наш сервер в качестве “корня” будет прослушивать адрес вида “ip-адрес/токен_бота”, относительно которого index — это и есть этот адрес. Может, немного криво пояснил, но позднее вам всё станет предельно ясно, сейчас не нужно загромождать голову лишней информацией.

Запустим бота и напишем ему парочку сообщений. Затем посмотрим в окно терминала:

Если код статуса равен 200 (OK), значит, всё в порядке и бот получил сообщения от сервера.

Источник

Telegram bot Webhook как настроить и запустить

Все кто начинает писать различных telegram ботов рано или поздно доходят до бота на вебхуках (webhook).

Для чего нужны webhook?

Когда мы пишем telegram бота и запускаем без вебхуков, то наш бот (который крутится на нашем сервере / компьютере) постоянно обращается к серверам телеграмма и спрашивает есть ли для него информация. Иногда сервера телеграмма не отвечают или посылают куда подальше и наш бот перестает работать. Это в принципе не большая проблема, можно же положить наш скрипт под тот же самый supervisor, который будет перезапускать демонок со скриптом и в целом то вся проблема решена. Конечно при таком раскладе будет периодически простой бота в 2-15 сек (а может и больше, зависит еще от тачки на котором крутится бот) и еще наш бот будет постоянно обращаться к серверам телеграмма, создавая на них нагрузку. В принципе это не наша проблема, но почему не сделать по человечески? Почему не увеличить скорость работы бота, отказоустойчивость и убрать создаваемую нагрузку? Для этого и приходят к нам на помощь Webhook. При работе бота на вебхуках сервер телеграмма сам обращается к нашему боту когда есть новые данные. Собственно и на наш сервер нагрузки будет меньше, ведь бот чаще будет простаивать, что рассмотрим как несомненный плюс.

Что необходимо для Webhook?

Нам понадобится сервер с белым IP адресом и SSL сертификат, можно самоподписной. Так же если у вас есть дома статический (белый) IP адрес, то можно сделать проброс портов до компьютера, на котором будет работать телеграмм бот. Но имейте ввиду, что для вебхуков нужен один из портов 80, 443, 8443.

Читайте также:  Как настроить etxt под антиплагиат вуз

Собственно небольшое ТЗ: нужно поднять свой веб-сервер, который висит на порту 443 (например) с открытым SSL сертификатом. Я покажу как это делается на примере python и Flask.

Настраиваем сервер

Вообще в интернете много статей как настроить webhook для телеграмм бота на python, но блииииина, нигде не указана пара нюансов, из-за которых ничего не работает и приходится сидеть и копаться, причем на офф страничке по API Telegram так же ничего интересного не указано для корректной работы сервера.

Сразу же ставим сам 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.

Источник

Регистрируем бот у @BotFather, устанавливаем WebHook

Регистрация бота проходит без каких-либо необходимых навыков, путем взаимодействия в Отцом Ботов @BotFather.

Последовательность действий для создания любого бота одинаковая:

  1. Открываем @BotFather и запускаем его (Старт/Start).
  2. В списке предложенных команд выбираем: /newbot — create a new bot , нажимаем на эту команду, или вводим ее вручную в поле для ввода сообщений.
  3. Вам предложат указать как будут звать бота, в дальнейшем название бота можно будет поменять. Вводите название в поле для ввода сообщений.
  4. Далее вам предложат указать имя, по которому бот будет доступен для пользователей. Имя пишите, используя латинский алфавит, цифры и нижнее подчеркивание. Еще одно важное условие — имя должно оканчиваться на «bot». Можно также с большой буквы «Bot», или «_bot» или «_Bot».

Если все прошло без замечаний со стороны @BotFather, то по итогу вам выведется на экран Token API, если вы его сразу использовать не будете, то можно его куда-нибудь записать. Также его можно запросить снова если вы его забыли или потеряли. Редактировать бота можно у @BotFather, для этого запросите список ваших ботов /mybots , выберите из списка нужного бота и далее при необходимости вы можете отредактировать его информацию, для этого в меню бота выберите Edit Bot :

  1. Name — Название бота
  2. About — Что умеет этот бот? (выводится при открытии бота по середине экрана)
  3. Description — Описание (доступно при просмотре профиля бота)
  4. Botpic — Картинка — логотип бота
  5. Commands — набор команд (доступно при вызове в диалоге с ботом командой / )
Читайте также:  Не работает click button jquery

Обратите внимание, что поменять имя бота (@) в настройках возможности нет.

Методы взаимодействия с Bot API

Есть два взаимоисключающих способа получения обновлений для бота — getUpdates и webHook . Входящие обновления хранятся на сервере Telegram до тех пор, пока бот не получит их, но они не будут храниться дольше, чем 24 часа.

Независимо от того, какой вариант вы выбрали, вы получите в результате JSON-сериализованные объекты (WIKI).

В случае с getUpdates вам необходимо будет настроить периодическое снятие (например, 1 раз в секунду) с сервера Telegram обновлений (данных полученных от взаимодействия пользователя с ботом — сообщения, картинки . ).

В случае с webHook обновления вам будут доставляться Bot API по указанному адресу сразу же как только они появятся. Если в ответ API получит статус обработки его запроса не 200 OK, а другой, например, 500 (ошибка сервера) то обновления подвиснут и будут периодически к вам стучатся, и успокоятся только в случае получения в ответ статуса 200 ОК.

Для себя я выбрал WebHook, потому что не придется нагружать сервер постоянной проверкой обновлений, они сами придут, останется только их обработать и отправить в ответ запланированную реакцию. Если решите остановиться на getUpdates, то прочитайте статью про хороший инструмент.

Устанавливаем WebHook

Для установки WebHook есть специальный метод setWebHook . Нам просто необходимо в параметре url передать web-адрес где будут обрабатываться данные отправленные Telegram Bot API. Допустим, что у вас такой же хостинг как у меня, и за работу бота будет отвечать файл index.php , который лежит в директории bots в корне сайта.

Если структура файлов у вас совпадает, и у вас есть доменное имя, а также установленный SSL сертификат, тогда назначаем webHook используя вот этот URL:

Вставляем его в адресную строку браузера и переходим, в случае если все прошло без ошибок, на экране у вас выведется вот такая информация:

Это означает, что все прошло хорошо и WebHook установлен. Теперь можно спокойно начать работать над реализацией бота.

Дополнительные настройки WebHook

Также вместе с параметром url в методе setWebHook можно передать:

  1. max_connections — максимальное разрешенное количество одновременных HTTPS-подключений к webhook для доставки обновления, 1-100. По умолчанию 40.
  2. allowed_updates — можно передать типы обновлений, которые будет получать бот. По умолчанию подписка идет на все обновления.
  3. certificate — сертификат открытого ключа, чтобы проверить используемый корневой сертификат , если у вас например самописный сертификат.

В случае если будет необходимо переназначить webHook, то нужно вызвать метод setWebHook еще раз и указать в качестве значения параметра url новый адрес обработчика данных от Bot API.

Для удаления webHook и перехода к getUpdates используйте метод deleteWebhook , параметры передавать не требуется.

Для получения, текущего состояние webHook используйте метод getWebhookInfo , параметры передавать не требуется.

Методы вызываются при помощи

Комментарии

Авторизуйтесь через Telegram, чтобы оставить комментарий.
Откройте бот @SiteAuthBot, нажмите кнопку Старт/Start. Следуйте инструкциям бота.

Внимание!
Убедитесь, что эта страница открыта в браузере, а не в приложении Telegram. В противном случае авторизация пройдет только в приложении Telegram.

Источник

Оцените статью