После того как мы создали бота в статье Как создать простого бота для телеграм на 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 '';
}
}
Для текста в кнопках меню бота можно использовать Эмодзи. Не все корректно работают, но многие общеупотребительные работают правильно. Вставлять обычным образом копи-паст, а искать в интренете поиском например так: «Эмодзи для сайта».
Добавляем пункты меню в телеграм бота на PHP