Несколько недель назад я решил попробовать что-нибудь новенькое. 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?.

Это оно. Теперь у вас есть рабочая площадка, и вы можете продолжать наблюдать за другими особенностями вселенной чат-ботов.

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