Telegram-бот на PHP: простой бот через Bot API

Короткий ответ: Telegram-бот на PHP — это скрипт, который обращается к Telegram Bot API, получает входящие сообщения и отправляет ответы. Для начала нужен токен бота, тестовый PHP-файл и понимание двух режимов работы: polling, когда скрипт сам спрашивает Telegram о новых сообщениях, и webhook, когда Telegram отправляет обновления на ваш HTTPS-адрес

Для первого учебного бота проще начать с polling. Он не требует домена, SSL-сертификата и настройки вебхука. Вы сможете запустить файл в терминале, написать боту сообщение и увидеть, как PHP получает текст и отвечает

Что понадобится

Создайте бота через BotFather в Telegram и получите токен. Токен выглядит как длинная строка, которую нельзя публиковать в коде на сайте, в GitHub или в скриншотах

На компьютере или сервере должен быть установлен PHP. Также удобно, если включено расширение curl, но для самого простого примера можно использовать file_get_contents(). В рабочем проекте лучше использовать cURL или HTTP-клиент с обработкой ошибок

Проверка токена

Подставьте токен в адрес

https://api.telegram.org/botВАШ_ТОКЕН/getMe

Если токен правильный, Telegram вернет JSON с данными бота. Если ошибка, проверьте, не вставили ли лишний пробел и не потеряли ли часть строки

Первый скрипт с getUpdates

Создайте файл bot.php

<?php

$token = 'ВАШ_ТОКЕН';
$url = "https://api.telegram.org/bot{$token}/getUpdates";

$response = file_get_contents($url);

echo $response;

Запустите файл

php bot.php

Сначала может быть пустой список. Напишите боту любое сообщение в Telegram, затем снова запустите скрипт. В ответе появится chat.id, текст сообщения и другие данные

Отправка сообщения

Когда вы знаете chat_id, можно отправить ответ

<?php

$token = 'ВАШ_ТОКЕН';
$chatId = 123456789;
$text = 'Привет! Бот на PHP отвечает';

$url = "https://api.telegram.org/bot{$token}/sendMessage";

$params = [
    'chat_id' => $chatId,
    'text' => $text,
];

$query = http_build_query($params);
$response = file_get_contents($url . '?' . $query);

echo $response;

Этот пример показывает сам принцип: метод sendMessage получает chat_id и текст. Для реального проекта добавьте обработку ошибок и не храните токен прямо в открытом файле

Простой обработчик сообщений

Следующий пример берет последнее сообщение и отвечает на него

<?php

$token = 'ВАШ_ТОКЕН';

function telegramRequest(string $method, array $params = []): array
{
    global $token;

    $url = "https://api.telegram.org/bot{$token}/{$method}";
    $query = http_build_query($params);
    $response = file_get_contents($url . ($query ? '?' . $query : ''));

    return json_decode($response, true);
}

$updates = telegramRequest('getUpdates');
$lastUpdate = end($updates['result']);

if (!$lastUpdate) {
    echo "Новых сообщений нет";
    exit;
}

$message = $lastUpdate['message'] ?? null;

if (!$message) {
    echo "Это обновление не похоже на обычное сообщение";
    exit;
}

$chatId = $message['chat']['id'];
$text = $message['text'] ?? '';

telegramRequest('sendMessage', [
    'chat_id' => $chatId,
    'text' => "Вы написали: {$text}",
]);

echo "Ответ отправлен";

Для учебного примера этого достаточно. Но у него есть ограничение: он берет последнее обновление и не хранит offset, поэтому может повторно отвечать на одно и то же сообщение

Почему нужен offset

Telegram хранит обновления, пока бот их не обработал. Чтобы не получать одно и то же сообщение снова, нужно запоминать последний update_id и передавать offset

$nextOffset = $lastUpdate['update_id'] + 1;

В реальном боте offset обычно сохраняют в файл или базу данных. Это следующий уровень после первого запуска

Мини-практика

Создайте бота через BotFather, проверьте токен через getMe, напишите боту сообщение и запустите getUpdates. Найдите chat.id и отправьте себе сообщение через sendMessage

После этого измените текст ответа: если пользователь пишет /start, отправляйте приветствие, а на любой другой текст отвечайте “Я пока умею только команду /start”

Частые ошибки

Публикуют токен в открытом коде. Если токен утек, его нужно перевыпустить через BotFather

Путают chat.id и message_id. Для отправки ответа нужен именно chat_id

Ждут, что бот сам начнет отвечать после создания. Бот отвечает только когда ваш PHP-скрипт получает обновления и отправляет ответ

Не учитывают offset. Из-за этого бот может отвечать на одно и то же сообщение несколько раз

Пытаются сразу делать webhook без HTTPS-домена. Для первого урока polling проще и понятнее

Что почитать дальше по PHP

Если нужен общий маршрут по теме, откройте рубрику PHP. Для соседних задач пригодятся эти разборы:

Оцените статью
0 0 голоса
Рейтинг статьи
Подписаться
Уведомить о
guest

0 комментариев
Старые
Новые Популярные
Межтекстовые Отзывы
Посмотреть все комментарии
0
Оставьте комментарий! Напишите, что думаете по поводу статьи.x