Telegram бот на PHP: с нуля до первого приветствия
Когда речь заходит о создании ботов для Telegram, первое, что приходит в голову — Python. И это логично: там есть элегантная библиотека python-telegram-bot, куча туториалов и огромное сообщество. Но что делать, если ваш основной стек — PHP? Или вы хотите быстро набросать простого бота для уведомлений, не разворачивая отдельный сервер на Python?
Хорошая новость: Telegram Bot API не привязан к языку. Это обычный HTTP-интерфейс, и PHP справляется с ним ничуть не хуже. В этой статье мы разберём, как создать Telegram бота на PHP с нуля: от регистрации у BotFather до полноценного бота, который отвечает на команды, шлёт сообщения и умеет обрабатывать callback-запросы. Всё с реальными примерами кода, без воды.
Почему PHP для Telegram бота — это нормально?
Многие разработчики скептически относятся к PHP в контексте ботов. Мол, это язык для «сайтов на коленке», а не для реального API. На деле PHP отлично справляется с ролью серверного обработчика: он прост, предсказуем и работает на любом хостинге. Для бота, который не требует суперпроизводительности (а большинство ботов именно такие), PHP — идеальный выбор.
Плюс, если у вас уже есть сайт на PHP, вы можете разместить бота на том же хостинге. Никаких дополнительных воркеров, демонов или сложных конфигураций. Просто файл bot.php, который висит на webhook'е и обрабатывает запросы от Telegram.
Что нужно для старта
- Хостинг с PHP 7.4+ (подойдёт любой, даже самый дешёвый shared-хостинг).
- Доступ к HTTPS — Telegram требует, чтобы webhook работал по защищённому протоколу. Можно использовать Let's Encrypt.
- Аккаунт в Telegram — очевидно, но без него никуда.
- Базовое знание PHP — достаточно понимать, как работают функции, массивы и cURL.
Если всё это есть — поехали.
Шаг 1. Регистрируем бота у BotFather
Запустите в Telegram диалог с @BotFather — это главный «заводчик» ботов. Отправьте команду:
/newbot
Вас попросят ввести имя бота (оно будет отображаться в контактах) и username (должен заканчиваться на bot). После этого вы получите токен — длинную строку вида:
1234567890:ABCdefGhIJKlmNoPQRsTUVwXYZ
Это ключ доступа к вашему боту. Никому его не показывайте — любой, кто знает токен, может управлять ботом.
Также рекомендую сразу задать аватарку и описание командами /setuserpic и /setdescription. Это не обязательно, но делает бота более дружелюбным.
Шаг 2. Выбираем способ получения обновлений
Telegram Bot API предлагает два варианта:
- Polling (long polling) — вы постоянно дёргаете сервер Telegram с вопросом «Есть новые сообщения?». Работает, но требует постоянного выполнения скрипта (например, через cron).
- Webhook — Telegram сам отправляет POST-запрос на ваш сервер, когда приходит новое сообщение. Это удобнее и быстрее.
Мы будем использовать webhook. Для начала давайте проверим, что ваш сервер доступен из интернета по HTTPS. Если у вас нет SSL-сертификата, воспользуйтесь Cloudflare (у них есть бесплатный SSL) или купите сертификат за копейки.
Устанавливаем webhook
Отправьте GET-запрос на URL (можно просто открыть в браузере):
https://api.telegram.org/bot<ТОКЕН>/setWebhook?url=https://ваш_сайт/bot.php
Замените <ТОКЕН> на ваш настоящий токен, а https://ваш_сайт/bot.php — на реальный путь к вашему скрипту. В ответ вы должны получить JSON:
{"ok": true, "result": true, "description": "Webhook was set"}
Готово. Теперь Telegram будет слать все обновления на bot.php.
Шаг 3. Пишем базовый обработчик на PHP
Создайте файл bot.php в корне вашего сайта. Начнём с простого — бот, который отвечает «Привет!» на любое сообщение.
<?php
// Токен вашего бота
$token = '1234567890:ABCdefGhIJKlmNoPQRsTUVwXYZ';
// Получаем входящие данные от Telegram
$content = file_get_contents('php://input');
$update = json_decode($content, true);
if (!$update) {
exit;
}
// Извлекаем chat_id и текст сообщения
$chat_id = $update['message']['chat']['id'] ?? null;
$text = $update['message']['text'] ?? '';
if (!$chat_id) {
exit;
}
// Формируем ответ
$reply = "Привет! Я бот на PHP. Ты написал: " . $text;
// Отправляем ответ через Bot API
$url = "https://api.telegram.org/bot{$token}/sendMessage";
$data = [
'chat_id' => $chat_id,
'text' => $reply,
];
$options = [
'http' => [
'header' => "Content-Type: application/json\r\n",
'method' => 'POST',
'content' => json_encode($data),
],
];
$context = stream_context_create($options);
file_get_contents($url, false, $context);
Это минимальный рабочий бот. Проверьте: напишите ему любое сообщение — он должен ответить тем же текстом, но с префиксом «Привет!».
Как это работает?
file_get_contents('php://input')— читает сырые POST-данные, которые присылает Telegram.json_decode— преобразует JSON в массив PHP.- Из массива мы достаём
chat_id(идентификатор чата) и текст сообщения. - Формируем ответ и отправляем его обратно через
sendMessage.
Обратите внимание: мы используем stream_context_create вместо cURL. Это встроенная функция PHP, которая не требует дополнительных расширений. Однако для более сложных запросов (например, с файлами) лучше использовать cURL — он гибче.
Шаг 4. Обрабатываем команды
Просто отвечать на сообщения — скучно. Давайте добавим поддержку команд: /start, /help и свою команду /joke.
<?php
$token = 'ВАШ_ТОКЕН';
$content = file_get_contents('php://input');
$update = json_decode