Accordion with symbols
In this example we have added a "plus" sign to each button. When the user clicks on the button, the "plus" sign is replaced with a "minus" sign.
Зачем мне нужен Telegram-bot?
Сферы применения:
— Просто, чтобы был — современные тренды 🙂
— Система уведомлений (как информатор в CRM, для информирования о вас и ваших услугах и сборе заявок, события…). Как показала практика — это действительно удобно.
— Смотреть услуги, продукты, оставлять заявки — простой вариант;
— Заказывать продукт (товары, информационные услуги, мероприятия) с возможностью оплаты (в перспективе);
— Что-то еще…
Раз вы здесь, то пришли вы сюда из поиска по фразе «бот для телеграм на php». Создадим простого бота для мессенджера Telegram с использованием 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, а в ней уже файл newtest_bot.php. Для этого на сервере создадим файл newtest_bot.php в котором и будет весь код бота. Не забываем, что весь код в файле newtest_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?
- Чтобы все заработало, нужно сособщить сервису Телеграм, что наш бот лежит там-то — используй его код для такого-то бота newtest_bot.
Для этого нужно сформировать ссылку, которая называется WebHook и её мы и сообщим телеграму:https://api.telegram.org/bot1234567899:AAKJhkkjhkjhKhKhjkhkhk_kJhgkjhJhgjghjhG/setWebhook?url=https://www.mysite.ru/newtest_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 '';
}
}
ШАГ 6. РЕГИСТРАЦИЯ КОМАНД БОТА
Теперь, если у вас все работает и бот отзывается на все команды, можно будет зарегистрировать эти команды у отца ботов @BotFather
- Заходим к боту @BotFather
- Запрашиваем установку команд /setcommands
- Выбираем нашего бота
- Вбиваем команды (без слешей вначале):
help — список команд
about — о нас
order — оставить заявку - Все — теперь в вашем боте появится список команд, если нажать в диалоге /
https://www.novelsite.ru/kak-sozdat-prostogo-bota-dlya-telegram-na-php.html
- Основные понятия
- Как отправлять HTTP запросы на PHP
- Виды взаимодействия с приложением через API
- Документация для работы с API Telegram
- Работа с документацией для Telegram
- Структура URL для отправки запросов в Telegram
- Примеры URL для запросов
Для отправки и получения запросов через API, вам лучше использовать виртуальный хостинг, так как локальный хостинг не сможет получать данные через хуки.
Основные понятия
Давайте рассмотрим основные понятия для работы с API
API (Application Programming Interface) — это набор способов и правил, по которым различные программы общаются между собой и обмениваются данными.
Метод API — это определённое действие, которое должно выполнить приложение основываясь на полученных данных (отправить сообщение, вернуть список чатов, отправить картинку и т.д.)
Token (токен) — это уникальный ключ бота, необходимый для отправки запросов.
Как отправлять HTTP запросы на PHP
Для отправки HTTP запросов можно использовать функцию file_get_contents(), где в качестве первого главного параметра указывается ссылка. Данная функция отлично подходит для отправки GET запросов, но к сожалению с помощью функции file_get_contents() нельзя отправлять POST запросы и поэтому для отправки POST запросов мы будем использовать библиотеку Curl.
Curl — это библиотека предназначенная для получения и передачи данных через такие протоколы, как HTTP, FTP, HTTPS.
Виды взаимодействия с приложением через API
Существует 2 вида взаимодействия с приложением через API. Первое это от клиента к серверу, а второе от сервера к клиенту. Клиентом в данном случае является ваше приложение (сайт), а в качестве сервера выступает сайт на который вы отправляете запросы (в нашем случае, это Telegram).
API запрос — это способ общения с программой, по средствам отправки данных от клиента — серверу.
Hooks (Хуки) — это способ общения с программой, по средствам отправки данных от сервера — клиенту. То есть при определённых изменениях в программе, сервер (приложение) будет отправлять данные на указанный скрипта клиента.
Документация для работы с API Telegram
Все методы и параметры для запросов вы можете найти в официальной документации Telegram.
Telegram Bot API — https://core.tlgr.org/bots/api
К данному сайту мы будем ссылаться на протяжение всего курса.
Работа с документацией для Telegram
Документация для создания Telegram ботов разделена на несколько разделов.
В разделе Recent changes вы можете найти информацию об обновлениях Telegram. Здесь описаны версии и нововведения которые были внесены в функционал мессенджера.
Разделы Authorizing your bot и Making requests описывают способы авторизации ботов и способы создания запросов для работы с ботами.
Раздел Getting updates описывает способы получения обновлений взаимодействия с ботами. При взаимодействие пользователя с ботов, все его действия, по стандарту, записываются на сервера Telegram, и для того чтобы получить к ним доступ, необходимо отправить запрос getUpdates.
Отправив запрос getUpdates вы можете получить id последнего пользователя который написал боту, узнать его ник, текст сообщения и дату отправки. Если бот добавлен в сообщество, то вы можете получить id сообщества.
В разделе Getting updates так же описаны правила настройки хуков, что позволяет отправлять любые изменения на сервер разработчика. Но об этом мы поговорим позднее, сейчас давайте продолжим знакомство с документацией.
Следующий раздел, который нас интересует называется — Available types. Данный раздел описывает все типы данных которые возвращает нам Telegram. Когда ваш скрипт отправляет запрос, то обработав его, Telegram вернёт вам ответ в формате JSON строки, в котором описаны специальные параметры.
Например если вы отправляете сообщение, то Telegram вернёт вам массив в котором указаны id созданного сообщения, id пользователя, дата создания сообщения и много другое. Все эти данные вы можете разобрать и записать в базу данных.
Далее описан раздел, с которым нам придётся работать больше всего — это Available methods, методы для взаимодействия с ботом. Советую вам пройтись по всем методам и изучить все возможности работы с ботами.
В крации скажу что здесь описаны методы для отправки сообщений, файлов, изображений и многое другое. Все методы имеют понятные названия и описанные параметры, что позволяет легко читать документацию, даже без знания английского языка.
Ну и в конце у нас описаны методы для работы со стикерами, играми в Telegram, методы для работы с оплатой в Telegram.
Структура URL для отправки запросов в Telegram
API Telegram имеет простую и понятную структуру урлов для отправки запросов.
Вот пример URL для создания запросов к боту
https://api.telegram.org/bot{token}/{method}
{token} — это уникальный ключ, который выдаётся при создание бота
{method} — это метод запроса по которому мы будем получать или отправлять определённые данные. В зависимости от названия метода, мы будем выполнять разные действия.
Примеры URL для запросов
Данные примеры используются только для наглядности построения URL, токен указанный в URL не привязан не к одному боту!
Вот так выглядит отправка сообщений методом GET. Первая часть URL содержит домен api.telegram.org, далее прописываем строку bot с токеном который нам даётся при создание бота, после чего указываем метод sendMessage и перечисляем GET параметры.
https://api.telegram.org/bot546445612928:AAHjk6643OYgWHim_TICgsaF9NDDVXYnKzA/sendMessage?chat_id=<ID чата>&text=<text>
Отправка файлов в чат выглядит аналогично, только метод sendMessage заменяется на sendDocument. И здесь не перечисляются GET параметры, после указания метода, так как мы отправляем данные методом POST.
https://api.telegram.org/bot543264456928:AAHjk6643OYgWHim_TICgsaF9NDDVXYnKzA/sendDocument
Отправка изображений в чат
https://api.telegram.org/bot546413456928:AAHjk6643OYgWHim_TICgsaF9NDDVXYnKzA/sendPhoto
Во втором уроке я вам покажу как создать бота для Telegram и мы с вами попробуем отправить сообщения в чат в Telegram.
Для того чтобы создать бота для Telegram, нам необходимо сделать несколько последовательных действий.
1) Вам нужно авторизоваться в Telegram аккаунте
2) В поиске найти пользователя @BotFather
3) Отправить сообщение боту — /newbot
4) После отправки запроса , нужно указать имя бота (на английском языке)
5) После этого дублировать название бота, но только суффиксом _bot
6) После успешной регистрации бота, @BotFather пришлёт вам сообщение с токеном, который вам нужно сохранить, в дальнейшем он нам понадобится.
7) Теперь нам нужно создать чат в который мы добавим нашего бота
8) Далее нам нужно получить id
нашего бота. Для этого нужно перейти по следующей ссылке, где за место символов X нужно подставить ваш токен:
https://api.telegram.org/botXXXXXXXXXXXXXXXXXX/getUpdates
Не закрывайте эту страницу, после 9 пункта, её нужно будет обновить.
9) Теперь вам необходимо отправить команду /join
в чат для активации бота. После отправки команды, вам нужно обновить страницу, чтобы сделать повторный запрос.
Здесь вам нужно записать следующий фрагмент кода — id вашего бота.
Вам нужен id со знаком минус.
"my_chat_member":{"chat":{"id":-594377170, ...
Пример отправки сообщения боту в Telegram
Теперь давайте попробуем отправить сообщение нашему боту методом GET запроса.
Здесь мы создаём переменные в которые заносим токен, id чата и сообщение. Сообщение мы прогоняем через функцию urlencode() для формирования специальный кодировки, для создания запросов.
А в конце мы используем функцию file_get_contents() для отправки запроса.
$token = "5340791844:AAEXXD786InvQrlWHRXykV91USOQSevrPVU";
$chat_id = -594377170;
$textMessage = "Тестовое сообщение";
$textMessage = urlencode($textMessage);
$urlQuery = "https://api.telegram.org/bot". $token ."/sendMessage?chat_id=". $chat_id ."&text=" . $textMessage;
$result = file_get_contents($urlQuery);
Данный метод рабочий, но он не удобен для создания сложной структуры приложения. Для более гибкой настройки лучше использовать библиотеку Curl. Давайте посмотрим код для запросов, с использованием Curl.
$token = "5340791844:AAEXXDduvInvQrlykV91USOQSevrPVU";
$getQuery = array(
"chat_id" => 1424625511,
"text" => "Новое сообщение из формы",
"parse_mode" => "html",
);
$ch = curl_init("https://api.telegram.org/bot". $token ."/sendMessage?" . http_build_query($getQuery));
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_HEADER, false);
$resultQuery = curl_exec($ch);
curl_close($ch);
echo $resultQuery;
Теперь мы получили более удобочитаемый код, благодаря записи параметров в массив $getQuery. При такой структуре, вам не нужно переписывать URL запроса, изменения вносятся только в массив $getQuery, а функция http_build_query() сама добавит строку параметров в URL запроса.
В дальнейших уроках, мы будем пользоваться библиотекой Curl, но вы должны понимать что многие запросы можно отправлять через функцию file_get_contents. Нужно просто составить правильный URL.
У нас получилось отправить сообщение в Telegram с помощью нашего бота. Теперь давайте посмотрим на ответы которые отправляет нам Telegram.
Разбор ответа от Telegram.
При создании запроса к боту, Telegram всегда отправляет ответ, который вы можете записать в переменную и вывести на экран.
Если вы допустили ошибку, то вам придёт сообщение с параметрами, в которых указан код ошибки с описанием.
В зависимости от метода работы, вам будут возвращаться разные ответы. В прошлом уроке мы с вами рассматривали документацию, где я рассказывал о типах данных которые вам могут прийти в ответе.
Сейчас давайте попробуем сделать запрос на отправку сообщения и разобрать полученный ответ.
{
"ok": true,
"result": {
"message_id": 12,
"from": {
"id": 5340791844,
"is_bot": true,
"first_name": "test_prog_time",
"username": "test_prog_time_bot"
},
"chat": {
"id": 1424646511,
"first_name": "Илья",
"last_name": "Лящук",
"username": "iliyalyachuk",
"type": "private"
},
"date": 1658907913,
"text": "Новое сообщение из формы"
}
}
В ответе мы видим следующее:
- Параметр «ok» — описывает успешность отправки запроса
- «result» — возвращает массив с данными ответа, в которых:
- «message_id» — id созданного сообщения
- «from» — кто отправил сообщение
- «chat» — данные о чате в который попало сообщение
- «date» — дата создания сообщения
- «text» — текст сообщения
Подведём итог.
- Все боты для Telegram создаются через BotFather
- Для отправки запросов вы можете использовать функцию file_get_contents или воспользоваться библиотекой Curl
- Каждый запрос в Telegram возвращает ответ с описание результата запроса.
В следующих урокам мы будем создавать более сложные запросы и по окончанию курса, мы создадим полноценный класс для создания запросов и обработки ответов.
После того как мы создали бота в статье Как создать простого бота для телеграм на PHP, мы можем создать меню для бота.
ДЛЯ ЭТОГО ПЕРЕПИШЕМ ФУНКЦИЮ ОТПРАВКИ СООБЩЕНИЯ ОТ БОТА MESSAGE_TO_TELEGRAM
- Для вывода меню снизу сообщения бота, нужно при каждой передачи сообщения от бота в диалог, передавать массив $reply_markup в формате json.
- Мы будем использовать тип меню, который привязан к сообщению, поэтому и нужно передавать каждый раз, а бывает меню привязанное ко всему диалогу.
- При этом будем выводить меню по-умолчанию, если мы не передали массив.
- Это нужно для организации меню второго уровня.
- Сделаем это на примере входа в раздел Услуги и там выведем подменю в виде нескольких услуг.
- Общее меню будет: О нас, Услуги, Контакты, Заявка
- Меню раздела Услуги будет содержать: Услуга 1, Услуга 2
- При этом при нажатии на меню будет происходить передача команды в диалог бота, например при нажатии на «О нас» будет передана команда /about — это наиболее простой способ организации диалогового меню.
function message_to_telegram($bot_token, $chat_id, $text, $reply_markup ='')
{
$ch = curl_init();
if ($reply_markup =='') {
$btn[] = ["text"=>"О нас", "callback_data"=>'/about'];
$btn[] = ["text"=>"Услуги", "callback_data"=>'/srv'];
$btn[] = ["text"=>"Контакты", "callback_data"=>'/contact'];
$btn[] = ["text"=>"Заявка", "callback_data"=>'/order'];
$reply_markup = json_encode(["keyboard" => [$btn], "resize_keyboard" => true]);
}
$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);
}
ТЕПЕРЬ ПЕРЕПИШЕМ БОТА, ДОБАВИВ ОБРАБОТКУ МЕНЮ БОТА
- В частности выведем раздел Услуги и подменю в нем.
- И дополним обработку вывода текста по Услуга 1 и Услуга 2.
/**
* Very simple chat bot @verysimple_bot_menu by Novelsite.ru
* + menu
* 22.06.2022
*/
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 =''; // состояние бота, по-умолчанию пустое
// который можно смотреть и понимать, что происходит при запросе к боту
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);
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
также есть дополнение статиь про добавление пунктов меню в бота:
https://www.novelsite.ru/dobavlyaem-punkty-menyu-telegram-bota-na-php.html
";
message_to_telegram($bot_token, $chat_id, $text_return);
set_bot_state ($chat_id, '/about');
}
elseif ($text =='/srv') {
$num = (int)$text_array[array_key_last($text_array)];
if ($num == 1) {
$ret = ["text"=>"⬅️ Вернуться", "callback_data"=>'/srv'],;
$text_return ="Услуга 1:
---------------------
Текст об услуга 1 услуга 1 услуга 1 услуга 1 услуга 1 услуга 1 услуга 1.
";
}
elseif ($num == 2) {
$ret = ["text"=>"⬅️ Вернуться", "callback_data"=>'/srv'],;
$text_return ="Услуга 2:
---------------------
Текст об услуга 2 услуга 2 услуга 2 услуга 2 услуга 2 услуга 2 услуга 2.
";
}
else {
$ret = [];
$text_return ="Услуги:
---------------------
1. Услуга 1
2. Услуга 2
";
}
$reply_markup = json_encode([
"inline_keyboard" => [
[
["text"=>"Услуга 1", "callback_data"=>'/srv 1'],
["text"=>"Услуга 2", "callback_data"=>'/srv 2'],
],
$ret,
]
]);
message_to_telegram($bot_token, $chat_id, $text_return, $reply_markup);
set_bot_state ($chat_id, '/srv');
}
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();
if ($reply_markup =='') {
$btn[] = ["text"=>"О нас", "callback_data"=>'/about'];
$btn[] = ["text"=>"Услуги", "callback_data"=>'/srv'];
$btn[] = ["text"=>"Контакты", "callback_data"=>'/contact'];
$btn[] = ["text"=>"Заявка", "callback_data"=>'/order'];
$reply_markup = json_encode(["keyboard" => [$btn], "resize_keyboard" => true]);
}
$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 '';
}
}
Для текста в кнопках меню бота можно использовать Эмодзи. Не все корректно работают, но многие общеупотребительные работают правильно. Вставлять обычным образом копи-паст, а искать в интренете поиском например так: «Эмодзи для сайта».
https://core.telegram.org/bots/api#inlinekeyboardmarkup
Справочник по Bot API
https://tlgrm.ru/docs/bots/api#chat