Несколько недель назад я решил попробовать что-нибудь новенькое. Telegram Bot привлек мое внимание, и я начал с ним экспериментировать. Первое, что мне нужно было сделать, это настроить локальную среду разработки. Процесс был немного сложным, потому что бот-сервер должен был быть доступен из Интернета, а Telegram требовал только защищенных HTTPS-соединений.
Эта статья представляет собой полное руководство. Выполнив все шаги, вы получите полностью рабочее пространство для разработки чат-бота.
Создать бота
Откройте бота @botfather и следуйте инструкциям по созданию нового бота. В результате у вас должен получиться токен. Через мгновение мы будем использовать его для связи с Telegram API.
Настройка туннеля Ngrok
Telegram требуется конечная точка HTTPS, доступная в Интернете. Когда пользователь что-то делает в боте, он отправляет запрос, содержащий информацию о действиях пользователя, в конечную точку. Ngrok - хорошее решение, потому что его легко настроить и оно бесплатно предоставляет безопасную конечную точку. Одним из недостатков является то, что когда вы останавливаете туннель Ngropk и запускаете его снова, создается новый URL-адрес. Итак, вам нужно снова установить веб-перехватчик. Платная версия Ngrok предлагает статический URL.
Создадим докер-сеть:
docker network create bot_ngrok
и запустите контейнер Ngrok и оставьте его работающим:
docker run --rm -p 4040:4040 --net bot_ngrok \ --name telegram_bot_ngrok wernight/ngrok \ ngrok http telegram_bot:80
Узнайте свой публичный адрес:
curl $(docker port telegram_bot_ngrok 4040)/api/tunnels
Команда должна распечатать данные JSON. Найдите там поле public_url. Содержание могло быть таким https://f2183d0.ngrok.io
.
Настроить веб-перехватчик Telegram
Теперь у нас есть туннель. Давайте проинструктируем Telegram отправлять обновления на этот URL-адрес Ngrok. Для этого нам нужно немного кодировать, создать каталог и установить formapro/telegram-bot
библиотеку:
docker run --rm --interactive --tty --volume $PWD:/$PWD -w $PWD --user $(id -u):$(id -g) composer:1.8 composer req formapro/telegram-bot
Создайте set_webhook.php
скрипт PHP:
<?php // set_webhook.php include_once __DIR__.'/vendor/autoload.php'; use Formapro\TelegramBot\Bot; use Formapro\TelegramBot\SetWebhook; use function GuzzleHttp\Psr7\str; $bot = new Bot(getenv('TELEGRAM_TOKEN')); $response = $bot->setWebhook( new SetWebhook($_SERVER['argv'][1]) ); echo str($response).PHP_EOL;
Выполните сценарий:
docker run --rm -v $PWD:/var/www/html -w /var/www/html \ -e TELEGRAM_TOKEN=telegram_token \ formapro/nginx-php-fpm:latest \ php set_webhook.php "https://f2183d0.ngrok.io/get_updates"
Если все пройдет хорошо, вы должны увидеть:
HTTP/1.1 200 OK ... {"ok":true,"result":true,"description":"Webhook was set"}
Обратите внимание, что если вы остановите контейнер ngrok и снова запустите его, URL-адрес изменится. Итак, вам нужно снова настроить веб-перехватчик.
Создать обработчик обновлений
Создайте index.php
. Это сердце вашего бота - скрипт, содержащий логику бота:
<?php // index.php use Formapro\TelegramBot\Bot; use Formapro\TelegramBot\Update; use Formapro\TelegramBot\SendMessage; include_once __DIR__.'/vendor/autoload.php'; if ('/get_updates' !== $_SERVER['REQUEST_URI']) { echo 'Telegram Bot Demo'.PHP_EOL; exit; } try { $requestBody = file_get_contents('php://input'); $data = json_decode($requestBody, true); $update = Update::create($data); $bot = new Bot(getenv('TELEGRAM_TOKEN')); $bot->sendMessage(new SendMessage( $update->getMessage()->getChat()->getId(), 'Hi there! What can I do?' )); http_response_code(200); echo 'OK'.PHP_EOL; } catch (\Throwable $e) { file_put_contents('php://stderr', (string) $e); http_response_code(500); echo 'Internal Server Error'.PHP_EOL; }
Запустите бот-сервер и оставьте его работать:
docker run --rm -p 80:80 -v `pwd`:/var/www/html --net bot_ngrok \ -e TELEGRAM_TOKEN=telegram_token \ --name telegram_bot \ formapro/nginx-php-fpm:latest
Протестируйте бота
Откройте своего бота в Telegram, введите /start
, и вы должны получить Hi there! What can I do?
.
Это оно. Теперь у вас есть рабочая площадка, и вы можете продолжать наблюдать за другими особенностями вселенной чат-ботов.
Вы также можете посетить наш корпоративный блог, чтобы узнать больше о последних тенденциях в области ИТ и загрузить некоторые полезные аналитические данные.