Введение: почему PHP — отличный выбор для чат-бота?
Вы когда-нибудь задумывались, как работают те умные помощники, которые отвечают на вопросы в Telegram, VK или на сайте? Многие думают, что для создания чат-бота нужно знать Python или Node.js. Но правда в том, что чат-бот на PHP — это не только реально, но и очень удобно. PHP — зрелый язык с огромным комьюнити, и он отлично подходит для быстрого прототипирования и запуска ботов.
В этом руководстве мы пройдем путь от полного нуля до работающего Telegram-бота на PHP. Мы разберем два подхода: простой эхо-бот на Localhost и бота с подключением к базе данных. Спойлер: будет много кода, который вы сможете скопировать и запустить прямо сейчас.
Что такое чат-бот и как он работает?
Прежде чем писать код, давайте разберемся с архитектурой. Чат-бот — это программа, которая получает сообщение от пользователя, обрабатывает его и отправляет ответ. В контексте Telegram (самая популярная платформа для ботов) схема выглядит так:
- Пользователь пишет боту в Telegram.
- Telegram отправляет POST-запрос на ваш сервер (Webhook) или вы сами постоянно опрашиваете сервер (Long Polling).
- Ваш PHP-скрипт обрабатывает запрос и отправляет ответ через API Telegram.
Мы будем использовать Webhook — это современный и быстрый способ. Представьте, что Telegram стучится в дверь вашего сервера каждый раз, когда приходит новое сообщение. Удобно, правда?
Подготовка: что нужно для старта?
Для создания простого чат-бота на PHP вам понадобится:
- Хостинг или локальный сервер (OpenServer, XAMPP, MAMP) с PHP 7.4+.
- Доступ к интернету (для регистрации бота в Telegram).
- Базовые знания PHP (переменные, функции, работа с JSON).
Если у вас нет хостинга, не беда — на этапе тестирования можно использовать Localhost с помощью утилиты ngrok, которая создает временный публичный URL. Но об этом позже.
Шаг 1. Регистрация бота в Telegram
Идем в Telegram, находим BotFather (официальный бот для создания ботов) и пишем команду /newbot. Отвечаем на вопросы: даем имя (например, MyTestBot) и username (обязательно заканчивается на bot, например my_test_pythonlib_bot).
После успешной регистрации BotFather выдаст вам токен — это ключ доступа к API. Выглядит он так: 123456:ABC-DEF1234ghIkl-zyx57W2v1u123ew11. Сохраните его в надежном месте (лучше в .env-файле, но для простоты мы пока захардкодим).
Важно: Никому не показывайте свой токен! Это пароль от вашего бота.
Шаг 2. Простейший эхо-бот на PHP (Webhook)
Создадим файл bot.php в корне вашего сайта. Этот скрипт будет принимать запросы от Telegram и отвечать тем же текстом (эхо).
<?php
// Получаем данные от Telegram
$content = file_get_contents("php://input");
$update = json_decode($content, true);
// Проверяем, есть ли сообщение
if (!$update) {
exit;
}
// Извлекаем ID чата и текст сообщения
$chat_id = $update['message']['chat']['id'];
$text = $update['message']['text'];
// Токен вашего бота
$token = "ВАШ_ТОКЕН_ЗДЕСЬ";
// Отправляем ответ (эхо)
$url = "https://api.telegram.org/bot{$token}/sendMessage";
$data = [
'chat_id' => $chat_id,
'text' => "Вы написали: " . $text
];
// Используем cURL для отправки запроса
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$result = curl_exec($ch);
curl_close($ch);
?>
Как это работает?
- Telegram отправляет POST-запрос на ваш файл
bot.php. - Мы читаем входящий JSON (
php://input) и декодируем его. - Извлекаем
chat_id(уникальный идентификатор чата) и текст сообщения. - Формируем URL для API Telegram и отправляем ответ через cURL.
Важно: Замените ВАШ_ТОКЕН_ЗДЕСЬ на реальный токен, полученный от BotFather.
Установка Webhook
Чтобы Telegram знал, куда отправлять запросы, нужно один раз вызвать метод setWebhook. Откройте в браузере ссылку:
https://api.telegram.org/botВАШ_ТОКЕН/setWebhook?url=https://ваш-сайт.ру/bot.php
Если вы тестируете локально, используйте ngrok:
ngrok http 80
Скопируйте сгенерированный URL (например, https://a1b2c3d4.ngrok.io) и добавьте в конец /bot.php.
Шаг 3. Умный бот с командами
Эхо — это скучно. Давайте добавим обработку команд. Например, команда /start будет приветствовать пользователя, а /help — показывать список доступных команд.
<?php
$content = file_get_contents("php://input");
$update = json_decode($content, true);
if (!$update || !isset($update['message'])) {
exit;
}
$chat_id = $update['message']['chat']['id'];
$text = $update['message']['text'];
$token = "ВАШ_ТОКЕН";
// Функция отправки сообщения
function sendMessage($chat_id, $text, $token) {
$url = "https://api.telegram.org/bot{$token}/sendMessage";
$data = ['chat_id' => $chat_id, 'text' => $text];
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_exec($ch);
curl_close($ch);
}
// Обработка команд
switch ($text) {
case '/start':
sendMessage($chat_id, "Привет! Я тестовый бот с PythonLib. Напиши /help.", $token);
break;
case '/help':
$help_text = "Доступные команды:\n/start - Приветствие\n/help - Помощ