Волторнистый Артём
увлечённый php-разработчик

Локальная отладка telegram бота

3 марта 2024 г.

Недавно мне нужно было отладить работу бота телеги в рамках пет-проекта. Суть бота была довольно проста, в личном кабинете создавался QR-код для подтверждения аккаунта. После пользователь его сканирует и в этот момент бот к нему добавляется.
В момент добавления бот отправляет запрос на бекенд (это сделано на стороне самой телеги), где я получаю код подтверждения, который сохранен был в QR и тем самым связываю аккаунт телеги с аккаунтом на сайте.
Собственно я хотел бы поделиться тем, как я прокидывал запрос от бота на локальный сайт.

Неудобство было в том, что вебхук, который я устанавливаю для телеграм бота, должен вести ведь на доступный веб-сайт, а у меня сайт локальный - что делать?

Первый вариант был в генерации внешнего адреса, который я бы установил адресом хука в телеграме. Генерацию я обычно делал на https://requestinspector.com.
Выглядело это так:

volt@mac mydeartutor % ./tmp/webhook.sh "https://01hqnrrk6bptppam5ybbej18x700-acf867f463b832ae0055.requestinspector.com"
{"ok":true,"result":true,"description":"Webhook was set"}%
volt@mac mydeartutor % 

Содержимое webhook.sh (чтобы каждый раз не искать этот адрес для установки):

curl "https://api.telegram.org/bot6333333333:XXXXXX0X_XXXXX/setWebhook?url=$1/rest/v1/confirm-telegram/code"

где 6333333333:XXXXXX0X_XXXXX - ваш токен для бота.

У нас получается нужно подменить домен для запросов, поэтому вместо него стоит $1 (первый аргумент для команды).

После на сайте я вижу сам запрос:

Потом я кидаю содержимое запроса на свой апи. Мне было неудобно.

Как-то на курсах по веб-безопасности мы использовали утилиту ngrok для реверс-шелла. Я зашел на сайт и понял, что весь процесс отладки можно упростить + утилита представляет локальный интерфейс для просмотра запроса.

На странице установки я поставил утилиту для мака, выполнил ngrok config и выполнил команду:

ngrok http http://api.website.ddk:80

Потом я вижу следующее:

Беру проксирующий адрес https://35f1-95-24-14-21.ngrok-free.app и выставляю его веб-хуком:

volt@mac mydeartutor % ./tmp/webhook.sh "https://35f1-95-24-14-21.ngrok-free.app"
{"ok":true,"result":true,"description":"Webhook was set"}%
volt@mac mydeartutor % 

Сканирую свой qr, добавляю бота.

Открываю локальный сайт (http://localhost:4040) с веб инспектором, который предоставляет утилита ngrok:

Запрос приходит на локальный веб-сайт и автоматика срабатывает. Конечно, у бесплатной версии ngrok есть вроде бы ограничение на действие этого временного домена, но можно просто перезапустить команду и снова отлаживать.

Я команду старта ngrok вынес так же в bash-скрипт ./tmp/ngrok.sh:

ngrok http http://api.website.ddk:80  

Теперь когда мне надо отладить работу телеги я в двух разных вкладках выполняю сперва старт ngrok’а и потом копирую полученный адрес во второй скрипт ./tmp/webhook.sh.

Конечно, это можно автоматизировать, но это не такая частая операция :)

Для локальной отладки я всегда завожу отдельного бота. Бот, который используется на production окружении, используется только там.