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

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

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

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

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

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

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

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

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

Сразу же ставим сам Flask:

apt install python3-flask

Нужно сделать самоподписной сертификат:

openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /root/cert.key -out /root/cert.crt

Путь до файла ключа и сертификата, как и название, подставьте свои.

Теперь нам нужно сделать своего бота в @BotFather (в телеграмме, уже не раз обсуждалось как его сделать, да и в инете гляньте, там полно статей с картинками) и привязать нашего бота к серверу через API телеграмма:

https://api.telegram.org/botBOT_TOKEN/setWebhook?url=https://IP:PORT

заменяем BOT_TOKEN на токен, который получили при создании бота и IP:PORT на IP адрес нашего сервера и порт, на котором будет поднят наш сервис.

Все готово для того, чтобы закодить наш сервис и принять первое сообщение:

from flask import Flask, request, jsonify
import telebot, time

server = Flask(name)
bot = telebot.TeleBot(bot_token)
bot.remove_webhook()
time.sleep(2)
bot.set_webhook(url="https://IP:PORT", certificate=open('/root/cert.crt', 'r'))

@server.route("/", methods=['POST'])
def getMessage():
  r = request.get_json()
  if "message" in r.keys():
    chat_id = r["message"]["chat"]["id"]
    if "text" in r["message"]:
      text_mess = r["message"]["text"]
    else:
      bot.send_message(chat_id=chat_id, text="Какая то не понятная проблема", parse_mode='HTML')
      return "ok", 200

  if text_mess == '/start':
    bot.send_message(chat_id=chat_id, text="Привет WebHook")
    return "ok", 200

if name == "main":
  server.run(host="IP", port=int(os.environ.get('PORT', '443')), ssl_context=('/root/cert.crt', '/root/cert.key'))

Такой небольшой telegram bot на webhook, который при запросе /start присылает сообщение «Привет WebHook» .

Не забудьте подставить свой IP адрес в host=»IP» и url=»https://IP:PORT», и конечно же указать правильный пути до сертификатов.

Теперь можно запустить бота и отправить ему /start. В логе фласка можно будет увидеть POST запрос в корень «сайта», в котором уже происходит наша обработка.

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

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

Если вы нашли ошибку, пожалуйста, выделите фрагмент текста и нажмите Ctrl+Enter.

Отправить ответ

avatar
  Subscribe  
Уведомить