Короткий ответ: 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. Для соседних задач пригодятся эти разборы:
- PHP-чат своими руками: простой учебный пример без фреймворка
- Как запустить Telegram-бота на PHP: polling, webhook и сервер
- Как изменить адресную строку в PHP: редирект, красивые адрес и History API
- Счетчик на PHP: простой счетчик просмотров страницы



