Как запустить Telegram-бота на PHP: polling, webhook и сервер

Короткий ответ: Telegram-бота на PHP запускают одним из двух способов. Polling — ваш скрипт сам регулярно запрашивает у Telegram новые сообщения через getUpdates. Webhook — Telegram сам отправляет обновления на ваш HTTPS-адрес. Для обучения проще polling, для постоянной работы на сайте чаще используют webhook

Важно не смешивать “написать бота” и “запустить бота”. Код может быть правильным, но бот не будет отвечать, если процесс не работает, webhook не установлен, сервер недоступен, токен неправильный или ошибки PHP скрыты

Вариант 1: запуск через polling

Polling подходит для локальной разработки, тестов и простых серверных запусков. Скрипт запускается в терминале и сам спрашивает Telegram о новых updates

Минимальная схема

<?php

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

while (true) {
    $url = "https://api.telegram.org/bot{$token}/getUpdates?timeout=30&offset={$offset}";
    $response = file_get_contents($url);
    $data = json_decode($response, true);

    foreach ($data['result'] ?? [] as $update) {
        $offset = $update['update_id'] + 1;

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

        if (!$message) {
            continue;
        }

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

        $reply = 'Вы написали: ' . $text;
        $sendUrl = "https://api.telegram.org/bot{$token}/sendMessage?" . http_build_query([
            'chat_id' => $chatId,
            'text' => $reply,
        ]);

        file_get_contents($sendUrl);
    }
}

Запуск

php bot.php

Пока процесс работает, бот отвечает. Если закрыть терминал, бот остановится. Для постоянной работы нужен process manager, systemd, supervisor, Docker или другой способ удерживать процесс

Вариант 2: запуск через webhook

Webhook подходит, когда у вас есть домен, HTTPS и сервер, который доступен Telegram. Вы создаете PHP-файл, например webhook.php, и говорите Telegram отправлять обновления на этот адрес

Пример обработчика

<?php

$token = 'ВАШ_ТОКЕН';
$input = file_get_contents('php://input');
$update = json_decode($input, true);

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

if (!$message) {
    exit;
}

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

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

file_get_contents($url . '?' . http_build_query([
    'chat_id' => $chatId,
    'text' => 'Получил: ' . $text,
]));

Адрес должен открываться по HTTPS

https://example.com/webhook.php

Установка webhook

https://api.telegram.org/botВАШ_ТОКЕН/setWebhook?url=https://example.com/webhook.php

После установки проверьте состояние

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

Если есть ошибка, Telegram обычно покажет last_error_message

Что выбрать новичку

Если вы только проверяете код, выбирайте polling. Он наглядный: запустили файл, написали боту, увидели ответ

Если бот должен жить на сайте и реагировать постоянно, выбирайте webhook. Но для webhook нужен нормальный HTTPS, доступный адрес, рабочий PHP на сервере и логи ошибок

Где хранить токен

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

Пример через переменную окружения

<?php

$token = getenv('TELEGRAM_BOT_TOKEN');

Как отлаживать запуск

Проверьте токен методом getMe. Затем проверьте, отвечает ли sendMessage при ручной подстановке chat_id. После этого проверяйте получение входящих updates. Не пытайтесь отлаживать все сразу

Для webhook полезно писать входящий JSON в лог-файл на время отладки

file_put_contents(__DIR__ . '/telegram.log', $input . PHP_EOL, FILE_APPEND);

После настройки лог лучше отключить или ограничить, чтобы не хранить лишние пользовательские данные

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

Сначала запустите polling-бота в терминале и убедитесь, что он отвечает. Затем перенесите ту же логику в webhook.php, установите webhook и проверьте getWebhookInfo

Если webhook не работает, удалите его и вернитесь к polling

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

Так вы поймете, проблема в коде бота или именно в настройке webhook

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

Оставили старый webhook и пытаются использовать polling. Пока webhook активен, getUpdates может вести себя не так, как ожидается

Запустили polling в терминале и закрыли окно. Процесс завершился, бот перестал отвечать

Webhook стоит на HTTP, а не HTTPS. Telegram требует защищенный адрес для webhook

Файл webhook.php открывается с ошибкой 500. Telegram не сможет передать обновления, пока PHP падает

Токен попал в публичный код. Такой токен нужно перевыпустить

Не смотрят getWebhookInfo. Там часто прямо написано, почему Telegram не доставляет обновления

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

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

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

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