Добавляем пункты меню в телеграм бота на PHP

После того как мы создали бота в статье Как создать простого бота для телеграм на PHP, мы можем создать меню для бота.

ДЛЯ ЭТОГО ПЕРЕПИШЕМ ФУНКЦИЮ ОТПРАВКИ СООБЩЕНИЯ ОТ БОТА MESSAGE_TO_TELEGRAM

  1. Для вывода меню снизу сообщения бота, нужно при каждой передачи сообщения от бота в диалог, передавать массив $reply_markup в формате json.
  2. Мы будем использовать тип меню, который привязан к сообщению, поэтому и нужно передавать каждый раз, а бывает меню привязанное ко всему диалогу.
  3. При этом будем выводить меню по-умолчанию, если мы не передали массив.
  4. Это нужно для организации меню второго уровня.
  5. Сделаем это на примере входа в раздел Услуги и там выведем подменю в виде нескольких услуг.
  6. Общее меню будет: О нас, Услуги, Контакты, Заявка
  7. Меню раздела Услуги будет содержать: Услуга 1, Услуга 2
  8. При этом при нажатии на меню будет происходить передача команды в диалог бота, например при нажатии на «О нас» будет передана команда /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. И дополним обработку вывода текста по Услуга 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
Пролистать наверх