Недавно мне нужно было отладить работу бота телеги в рамках пет-проекта. Суть бота была довольно проста, в личном кабинете создавался 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 окружении, используется только там.