Как можно создать простого 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("\r\n", $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('#^7\d+#', 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.
-
- Михаил Русаков
Комментарии (0):
Для добавления комментариев надо войти в систему.
Если Вы ещё не зарегистрированы на сайте, то сначала зарегистрируйтесь.