Как создать простого бота для Телеграм на PHP
05.07.2021 👁 46994
Здравствуйте, дорогие читатели. Раз вы здесь, то пришли вы сюда из поиска по фразе "бот для телеграм на пхп". И работающего бота вы сделать сможете, прочитав данную статью. Вопросы для чего вам бот в Телеграм, здесь не обсуждаются, хотя мы сами используем собственного публичного бота @novelsite_bot для информирования о нас и наших услугах и сборе заявок. А также у нас есть закрытый бот, который мы используем как информатор в CRM (уведомления, свои задачи) и как показала практика — это действительно удобно.
Итак,
Создадим простого бота для мессенджера Telegram с использованием PHP. Данная статья создана исключительно в поучительных целях и не претендует на полноту или правильность подхода. Весь код бота очень простой и может быть освоен начинающими PHP-разработчиками.
Предупреждаю сразу профессионалов и перфекционистов от программирования — вам здесь делать нечего . Никаких фреймворков и гитхабов! Все будет очень просто и примитивно, но работать будет. И это главное. Всем счастья
Шаг 1: подготовка
Что нам понадобится:
- Веб-сервер с работающим PHP 5.6 и выше — не локальный веб-сервер, а веб-сервер на хостинге, что важно! Так как сервисы Telegram должны будут видеть вашего бота по внешней URL-ссылке;
- Веб-сервер должен работать через https — то есть на веб-сервере должен быть установлен давно (больше суток назад) зарегистрированный SSL-сертификат. Достаточно будет бесплатного Let's Encrypt SSL-сертификата;
- Доступ к файлам на этом сервере, конечно же — иначе как мы что-то сделаем;
- Установленная кодовая страница UTF-8 на сервере по-умолчанию или добавьте в файл .htacces в корне сайта строку AddDefaultCharset utf-8;
- Аккаунт в мессенджере Telegram;
Шаг 2. Регистрация вашего бота в Телеграм
Да, да. Бот еще даже не создан, но перед этим его уже нужно зарегистрировать, чтобы получить уникальный идентификатор, чтобы в дальнейшем обращаться к BOT API Telegram.
- Для этого заходим в Телеграм в специального бота @BotFather и присоеденяемся к нему — кнопка Присоединится, при этом бот выдаст команду /start — это базовая команда любого бота;
- @BotFather вас поприветствует и можно посмотреть все команды, введя /help
- Создаем бота, введя /newbot
- И вводим имя бота и username, чтобы не заморачиваться — введите одинаково, но помните, что username вводится на латинице и в конце должно быть _bot, например:
username: verysimple_bot — подходит
username: verysimplebot — не подходит - Далее @BotFather вас поздравит и выдаст ключ или токен бота для HTTP API — по сути это строка из номера (ID) бота и набора случайных символов, примерно в таком виде:
1234567899:AAKJhkkjhkjhKhKhjkhkhk_kJhgkjhJhgjghjhG
Запомните свой токен — он нам понадобится дальше. - Далее можно задать картинку (аватар) бота, введя /setuserpic
- Можно использовать любую вашу картинку в формате JPG, PNG, загрузив её после этой команды. - Можно приступать к программированию...
Шаг 3. Создаем код бота
Будем делать прямо в корне сервера (не самый верный подход, можно создать папку bot, а в ней уже файл verysimple_bot.php). Для этого на сервере создадим файл verysimple_bot.php в котором и будет весь код бота. Не забываем, что весь код в файле verysimple_bot.php должен быть в кодировке UTF-8.
Для редактирования файлов кода и заброске их на сервер удобно использовать FAR Manager — в нем есть и подсветка синтаксиса и FTP/SFTP клиент для копирования файла на сервер.
Делаем заготовку бота, который сможет выдавать список команд и информацию о нас:
/**
* Very simple chat bot @verysimple_bot by Novelsite.ru
* 05.07.2021
*/
header('Content-Type: text/html; charset=utf-8'); // на всякий случай досообщим PHP, что все в кодировке UTF-8
$site_dir = dirname(dirname(__FILE__)).'/'; // корень сайта
$bot_token = '1234567899:AAKJhkkjhkjhKhKhjkhkhk_kJhgkjhJhgjghjhG'; // токен вашего бота
$data = file_get_contents('php://input'); // весь ввод перенаправляем в $data
$data = json_decode($data, true); // декодируем json-закодированные-текстовые данные в PHP-массив
// Для отладки, добавим запись полученных декодированных данных в файл message.txt,
// который можно смотреть и понимать, что происходит при запросе к боту
// Позже, когда все будет работать закомментируйте эту строку:
file_put_contents(__DIR__ . '/message.txt', print_r($data, true));
// Основной код: получаем сообщение, что юзер отправил боту и
// заполняем переменные для дальнейшего использования
if (!empty($data['message']['text'])) {
$chat_id = $data['message']['from']['id'];
$user_name = $data['message']['from']['username'];
$first_name = $data['message']['from']['first_name'];
$last_name = $data['message']['from']['last_name'];
$text = trim($data['message']['text']);
$text_array = explode(" ", $text);
if ($text == '/help') {
$text_return = "Привет, $first_name $last_name, вот команды, что я понимаю:
/help - список команд
/about - о нас
";
message_to_telegram($bot_token, $chat_id, $text_return);
}
elseif ($text == '/about') {
$text_return = "verysimple_bot:
Я пример самого простого бота для телеграм, написанного на простом PHP.
Мой код можно скачивать, дополнять, исправлять. Код доступен в этой статье:
https://www.novelsite.ru/kak-sozdat-prostogo-bota-dlya-telegram-na-php.html
";
message_to_telegram($bot_token, $chat_id, $text_return);
}
}
// функция отправки сообщени в от бота в диалог с юзером
function message_to_telegram($bot_token, $chat_id, $text, $reply_markup = '')
{
$ch = curl_init();
$ch_post = [
CURLOPT_URL => 'https://api.telegram.org/bot' . $bot_token . '/sendMessage',
CURLOPT_POST => TRUE,
CURLOPT_RETURNTRANSFER => TRUE,
CURLOPT_TIMEOUT => 10,
CURLOPT_POSTFIELDS => [
'chat_id' => $chat_id,
'parse_mode' => 'HTML',
'text' => $text,
'reply_markup' => $reply_markup,
]
];
curl_setopt_array($ch, $ch_post);
curl_exec($ch);
}
Шаг 4. Делаем WebHook и конкретизируем код бота
Итак, базовый код бота мы сделали. Он сможет отвечать на 2 команды: /help (Помощь) и /about (Информация о нас). Но как теперь это заставить работать и, как работает функция message_to_telegram?
- Чтобы все заработало, нужно сособщить сервису Телеграм, что наш бот лежит там-то — используй его код для такого-то бота verysimple_bot.
Для этого нужно сформировать ссылку, которая называется WebHook и её мы и сообщим телеграму:
https://api.telegram.org/bot1234567899:AAKJhkkjhkjhKhKhjkhkhk_kJhgkjhJhgjghjhG/setWebhook?url=https://www.mysite.ru/verysimple_bot.php
Не забываем где красное заменяем на свои данные!
Как сформируете эту ссылку — вставьте её в браузер и запустите!
Если все пройдет правильно, то ответ на эту ссылку в браузере будет примерно такой:
{"ok":true,"result":true,"description":"Webhook was set"}
- Функция message_to_telegram отправляет сообщение через Telegram Bot API в диалог бота, формируя массив в нужном формате через вызов библиотеки CURL (обычно встроена в PHP). С CURL более правильно и структурировано работает с https-запросами.
То есть мы обращаемся к телеграм бот API, указав ему нашего бота и сделав запрос /sendMessage и передав наш текст, а бот Api уже "запихает" это сообщение в мессенджер Телеграм — и мы увидем реультат. Получается цепочка:- Пользователь в диалоге с ботом пишет запрос, например /help
- Telegram Bot API через WebHook, что мы установили, берет этот запрос и отправляет в код бота
- Мы в боте получаем его, анализируем, видим например, /help и через Telegram Bot API и
функцию message_to_telegram отправляем ответ — который появлется в диалоге как ответ бота.
Шаг 5. Добавим возможность делать заявки через бота
Заявкой будем считать сообщение или вопрос, которое можно будет отправить через нашего бота какому-то пользователю, назовем его менеджер компании. То есть нам нужно организовать такую цепочку:
- Пользователь запрашивает у бота "Оставить заявку", например набрав команду /order
- Бот входит в режим ожидания текста Заявки
- Если пользователь ввел текст и нажал Enter, только тогда отослать это сообщение заранее запрограммированному по менеджеру компании.
Получим идентификатор chat_id пользователя кому нужно отсылать заявки:
- Помните наш файл message.txt — вот он сейчас понадобится
- Присоединяемся к нашему боту тем пользователем, кому будем слать заявки (менеджер компании)
- Сразу открываем файл message.txt и смотрим блок: [chat]
[chat] => Array
(
[id] => 123456789
[first_name] => manager
[last_name] => company
[username] => username
[type] => private
) - Сохраняем это в коде бота сверху и добавим переменную состояния бота:
$order_chat_id = '123456789'; //chat_id менеджера компании для заявок
$bot_state = ''; // состояние бота, по-умолчанию пустое
Сохраняем состояние бота для каждого пользователя
Далее, важный момент: у нас любой присоединившийся пользователь сможет сделать заявку, и чтобы бот понимал, что находится в режиме ввода заявки именно с этим пользователем, мы должны сохранять и считывать состояния бота для каждого пользователя отдельно!
Напишем две функции: set_bot_state($chat_id, $data) и get_bot_state($chat_id) — которые сохраняют текущее состояние бота и получают соответсвенно, для нужного пользователя. Сохранять будем в подпапке /users на сервере, которую создадим предварительно не забыв дать права на запись. Состояния будут хранится все в тех же текстовых файлах с именами chat_id пользователей и содержать последнюю команду:
// сохранить состояние бота для пользователя
function set_bot_state ($chat_id, $data)
{
file_put_contents(__DIR__ . '/users/'.$chat_id.'.txt', $data);
}
// получить текущее состояние бота для пользователя
function get_bot_state ($chat_id)
{
if (file_exists(__DIR__ . '/users/'.$chat_id.'.txt')) {
$data = file_get_contents(__DIR__ . '/users/'.$chat_id.'.txt');
return $data;
}
else {
return '';
}
}
Теперь дополним код бота, добавив запись и отлов состояния и отправив заявку менеджеру компании, если состояние отправки заявки.
/**
* Very simple chat bot @verysimple_bot by Novelsite.ru
* 05.07.2021
*/
header('Content-Type: text/html; charset=utf-8'); // на всякий случай досообщим PHP, что все в кодировке UTF-8
$site_dir = dirname(dirname(__FILE__)).'/'; // корень сайта
$bot_token = '1234567899:AAKJhkkjhkjhKhKhjkhkhk_kJhgkjhJhgjghjhG'; // токен вашего бота
$data = file_get_contents('php://input'); // весь ввод перенаправляем в $data
$data = json_decode($data, true); // декодируем json-закодированные-текстовые данные в PHP-массив
$order_chat_id = '123456789'; //chat_id менеджера компании для заявок
$bot_state = ''; // состояние бота, по-умолчанию пустое
// Для отладки, добавим запись полученных декодированных данных в файл message.txt,
// который можно смотреть и понимать, что происходит при запросе к боту
// Позже, когда все будет работать закомментируйте эту строку:
file_put_contents(__DIR__ . '/message.txt', print_r($data, true));
// Основной код: получаем сообщение, что юзер отправил боту и
// заполняем переменные для дальнейшего использования
if (!empty($data['message']['text'])) {
$chat_id = $data['message']['from']['id'];
$user_name = $data['message']['from']['username'];
$first_name = $data['message']['from']['first_name'];
$last_name = $data['message']['from']['last_name'];
$text = trim($data['message']['text']);
$text_array = explode(" ", $text);
// получим текущее состояние бота, если оно есть
$bot_state = get_bot_state ($chat_id);
// если текущее состояние бота отправка заявки, то отправим заявку менеджеру компании на $order_chat_id
if (substr($bot_state, 0, 6) == '/order') {
$text_return = "
Заявка от @$user_name:
Имя: $first_name $last_name
$text
";
message_to_telegram($bot_token, $order_chat_id, $text_return);
set_bot_state ($chat_id, ''); // не забудем почистить состояние на пустоту, после отправки заявки
}
// если состояние бота пустое -- то обычные запросы
else {
// вывод информации Помощь
if ($text == '/help') {
$text_return = "Привет, $first_name $last_name, вот команды, что я понимаю:
/help - список команд
/about - о нас
/order - оставить заявку
";
message_to_telegram($bot_token, $chat_id, $text_return);
set_bot_state ($chat_id, '/help');
}
// вывод информации о нас
elseif ($text == '/about') {
$text_return = "verysimple_bot:
Я пример самого простого бота для телеграм, написанного на простом PHP.
Мой код можно скачивать, дополнять, исправлять. Код доступен в этой статье:
https://www.novelsite.ru/kak-sozdat-prostogo-bota-dlya-telegram-na-php.html
";
message_to_telegram($bot_token, $chat_id, $text_return);
set_bot_state ($chat_id, '/about');
}
// переход в режим Заявки
elseif ($text == '/order') {
$text_return = "$first_name $last_name, для подтверждения Заявки введите текст вашей заявки и нажмите отправить.
Наши специалисты свяжутся с вами в ближайшее время!
";
message_to_telegram($bot_token, $chat_id, $text_return);
set_bot_state ($chat_id, '/order');
}
}
}
// функция отправки сообщения от бота в диалог с юзером
function message_to_telegram($bot_token, $chat_id, $text, $reply_markup = '')
{
$ch = curl_init();
$ch_post = [
CURLOPT_URL => 'https://api.telegram.org/bot' . $bot_token . '/sendMessage',
CURLOPT_POST => TRUE,
CURLOPT_RETURNTRANSFER => TRUE,
CURLOPT_TIMEOUT => 10,
CURLOPT_POSTFIELDS => [
'chat_id' => $chat_id,
'parse_mode' => 'HTML',
'text' => $text,
'reply_markup' => $reply_markup,
]
];
curl_setopt_array($ch, $ch_post);
curl_exec($ch);
}
// сохранить состояние бота для пользователя
function set_bot_state ($chat_id, $data)
{
file_put_contents(__DIR__ . '/users/'.$chat_id.'.txt', $data);
}
// получить текущее состояние бота для пользователя
function get_bot_state ($chat_id)
{
if (file_exists(__DIR__ . '/users/'.$chat_id.'.txt')) {
$data = file_get_contents(__DIR__ . '/users/'.$chat_id.'.txt');
return $data;
}
else {
return '';
}
}
-
Скачать данный пример: verysimple_bot.php (2 kb)
Шаг 6. Регистрация команд бота
Теперь, если у вас все работает и бот отзывается на все команды, можно будет зарегистрировать эти команды у отца ботов @BotFather
- Заходим к боту @BotFather
- Запрашиваем установку команд /setcommands
- Выбираем нашего бота
- Вбиваем команды (без слешей вначале):
help - список команд
about - о нас
order - оставить заявку - Все — теперь в вашем боте появится список команд, если нажать в диалоге /
Вот и все — простой бот работает! Всем спасибо, если дочитали и что-то заработало.
Николай Комарков