Как можно создать простого Telegram-бота используя официальное Telegram Bot API

Как можно создать простого Telegram-бота используя официальное Telegram Bot API

Как можно создать простого Telegram-бота используя официальное Telegram Bot API

Доброго времени суток! Сегодня мы рассмотрим с Вами пример, того как можно создать простого Telegram-бота
используя официальное Telegram Bot API, без использования сторонних библиотек.

Итак, для начала необходимо создать бота через «отца всех ботов» @BotFather. Там Вы получите API-токен, который
затем понадобиться для работы бота. Этот токен необходимо держать в секрете.

Общение с ботом идет с помощью сообщений. Поэтому давайте создадим PHP-класс, который будет представлять часть
ответа бота — сообщение — Message.



<?php



class Message

{

    public function __construct(

        public readonly int $id, // идентификатор сообщения

        public readonly int $chat_id, // идентификатор чата - сюда можно будет слать сообщения пользователю

        public readonly string $first_name, // имя пользователя, если установлено

        public readonly string $username, // никнейм

        public readonly int $date, // дата сообщения

        public readonly ?string $text, // текст сообщения

        public readonly ?string $type, // тип сообщения

        public readonly ?string $phone, // номер- телефона

    )

    {}





    public static function from(array $data)

    {

        return new self(

            $data['message_id'],

            $data['chat']['id'],

            $data['chat']['first_name'],

            $data['chat']['username'],

            $data['date'],

            $data['text'] ?? null,

            $data['entities'][0]['type'] ?? null,

            $data['contact']['phone_number'] ?? null

        );

    }



    public function isBotCommand() : bool 

    {

        return $this->type === 'bot_command';    

    }



    public function __toString()

    {

        return json_encode($this, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE);

    }

}





Так как Telegram-сервер возвращает нам ответ в виде JSON, то мы преобразуем его в тип — Message, для дальнейшего удобного
использования.

Теперь рассмотрим файл bot.php

В данном файле располагается все логика работы скрипта. Обратите внимание, что скрипт работает в режиме лонг-поллинга, т.е.
запускается бесконечный цикл, в котором, через равные промежутки времени отправляется запрос на Telegram-сервер, который возвращает
ответ, который содержит все сообщения отправленный пользователем боту. Но, так как нам не нужны постоянно одни и те же сообщения, то
мы этот случай также обрабатываем с помощью переменной-счетчика $offset. В коде ниже есть комментарий.

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

<?php



require __DIR__ . '/Message.php'; // класс, созданный выше



const BOT_API_TOKEN = '1111111111:BsQsaaaaaaaaaaaaaaaaaaax-kNnnjsjj5d'; // токен вашего бота

const BOT_API_BASE_URL = 'https://api.telegram.org/bot' . BOT_API_TOKEN; // адрес откуда будут получаться сообщения и куда будут отправляться сообщения

const BOT_API_METHOD_SEND_MESSAGE = BOT_API_BASE_URL. '/sendMessage'; // url-адрес (метод Telegram Bot API) куда будут отправляться сообщения





// функция для отправки http-сообщений

function fetch(string $method, string $url, string $body, array $headers = []) {



    $context = stream_context_create([

        "http" => [

            "method"        => $method,

            "header"        => implode("rn", $headers),

            "content"       => $body,

            "ignore_errors" => true,

        ],

    ]);





    $response = file_get_contents($url, false, $context);



    $status_line = $http_response_header[0];



    preg_match('{HTTP/S*s(d{3})}', $status_line, $match);



    $status = $match[1];



    if ($status !== '200') {

        throw new RuntimeException("unexpected response status: {$status_line}n" . $response);

    }



    return $response;

}



// получаем последние сообщения, отправленный боту

// параметр $offset - позволяет получать только последние сообщения

function getUpdates(int $offset)

{

    $updates = file_get_contents(BOT_API_BASE_URL . '/getUpdates?offset=' . $offset);

    return json_decode($updates, true);

}



// отправка сообщений в чат

function sendMessage(int $chat_id, string $message)

{

    $send_url = BOT_API_BASE_URL . "/sendMessage?chat_id=$chat_id&text=$message";

    return file_get_contents($send_url);

}



// отправка клавиатуры ботом

// запрашивает у пользователя номер телефона

function sendMarkup(int $chat_id, string $text)

{

    $keyboard = [

        'keyboard' => [[

            ['text' => '⚡️ Получить код по номеру ⚡️','request_contact' => true,]

        ]],

        'resize_keyboard' => true,

        'one_time_keyboard' => true,

    ];





    $data = [

        'chat_id' => $chat_id,

        'text' => $text,

        'reply_markup' => $keyboard

    ];



    return fetch('POST', BOT_API_METHOD_SEND_MESSAGE, json_encode($data), [

        'Content-Type: application/json',

    ]);

}





// глобальная переменная - смещение - необходима для получения только последний сообщений

$offset = -1;



// запускаем бесконечный цикл

while (true) 

{

    // получаем сообщения 

    $response = getUpdates($offset);



    // если все хорошо и есть сообщение

    if ($response['ok'] && !empty($response['result'][0])) {

        $item = $response['result'][0]; // получаем сообщение

        $offset = ++$item['update_id']; // увеличиваем глобальный счетчик сообщений на 1, чтобы при следующем запросе получить только последние сообщения



        // если сообщение не пустое

        if (!empty($item['message'])) 

        {

            // создаем объект класса сообщения и далее уже работаем с типизированный ответом (работает автодополнение)

            $message = Message::from($item['message']);

            $chat_id = $message->chat_id;



            // если это команда для бота, то реализуем необходимую нам логику

            if ($message->isBotCommand()) 

            {

                $chunks = explode(' ', $message->text);

                $command = $chunks[0];

                $args = !empty($chunks[1]) ? $chunks[1] : [];



                switch ($command) {

                    case '/start':

                        sendMessage($chat_id, "Привет, рады видеть Вас, $message->first_name");

                        break;



                    case '/debug':

                        sendMessage($chat_id, json_encode($response, JSON_UNESCAPED_SLASHES | JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE));

                        break;



                    case '/verify':

                        $response_message = preg_match('#^7d+#', trim($args)) ? "Отлично, Вы зарегистрированы с номером $args" : "Формат номера неверный";

                        sendMessage($chat_id, $response_message);

                        break;



                    case '/contact':



                        sendMarkup($chat_id, 'Для завершения регистрации необходимо предоставить номер боту, чтобы получить код');

                        break;



                    default:

                        sendMessage($chat_id, "Хммм... Не могу ответить на данный вопрос.");

                        break;

                }

            } else {

                print_r($response['result']);

                sendMessage($chat_id, "Возвращаю: $message");

            }





            print $message;

            print PHP_EOL;

        }

    }



    // останавливаем скрипт на 3 секунды

    sleep(3);

}





Запускается скрипт крайне просто:



$ php bot.php



Вот таким образом мы создали простого бота на PHP, использую только официальное Bot API от Telegram.

Источник

НЕТ КОММЕНТАРИЕВ

Оставить комментарий