Как сделать кнопки в боте телеграм php
Взаимодействие пользователя с ботом должно быть интуитивным. Пользователь должен понимать, как общаться с ботом чтобы получить необходимый результат. Давайте рассмотрим какие есть способы взаимодействия с ботом.
При открытии бота по умолчанию сразу доступна кнопка Старт, при нажатии, на которую будет начат диалог и в бот будет отправлена команда /start . Уже здесь мы можем поймать эту команду, обработать и выполнить какие-то действия. Вместе с этой командой в бот отправляется минимальная информация о пользователе:
- id - уникальный идентификатор пользователя в Telegram
- last_name - значение поля фамилия, может быть пустым
- first_name - значение поля имя, может быть пустым
- username - уникальное значение текстовый идентификатор, может быть пустым
- language_code - кодовое обозначение выбранного языка интерфейса приложения (en, ru . )
- is_bot - флаг, определяющий пользователя как бота, в случае с ботом равен 1, в случае с пользователем пустое значение
Полезный инструмент
Telegram Bot API рекомендует использовать base64url для кодирования параметров с двоичным и другими типами контента.
По ссылке с параметром start будет открыт диалог с ботом, с кнопкой Старт в месте поля ввода. Если используется параметр startgroup, пользователю будет предложено выбрать группу для добавления бота.
Клавиатуры и их возможности
KeyboardButton
Помимо набора кнопок в объект ReplyKeyboardMarkup можно передать еще ряд параметров:
- keyboard - массив кнопок (объекты KeyboardButton)
- resize_keyboard - если предать true, то клавиатура подгонится по высоте до возможного минимума.
- one_time_keyboard - возможность скрывать клавиатуру после ее использования
- selective - если надо показать клавиатуру только определенным пользователям
При необходимости удалить клавиатуру используйте объект ReplyKeyboardRemove.
InlineKeyboardButton
- text - текст который будет на отображен на кнопке, обязательный параметр, поддерживает текст и смайлики (эмодзи)
- url - адрес на который будет направлен пользователь
- callback_data - строка 1-64 символа будет передан боту через объект CallbackQuery
- switch_inline_query - после нажатия будет предложен выбор чата где будет использован бот во встроенном режиме, пример @gif dog
- switch_inline_query_current_chat - после нажатия вставит команду для использования бота во встроенном режиме в текущем чате
- callback_game - описание игры, которая будет запущена при нажатии пользователем кнопки.
- pay - кнопка будет использована как кнопка оплаты
Теперь немного практики
Предлагаю рассмотреть поближе возможности клавиатур. Для примера я сделаю 4 кнопки: 2 KeyboardButton и 2 InlineKeyboardButton. Для этого будем работать с теми же инструментами, которые были в предыдущей статье. Добавим только несколько новых методов.
Кнопки будем отправлять в параметре reply_markup в методе sendMessage. Набор кнопок идет в таком формате:
Создадим два метода для разных клавиатур, на входе принимают массив строк кнопок, на выходе строку в формате JSON.
Сам набор кнопок будет выглядеть вот так.
Во встроенных кнопках (inlineKeyboardButton) в качестве значения параметра callback_data будем передавать служебную информацию в виде action_type_count1_count2 , где
- action - действие, в нашем случае это vote
- type - тип кнопки: 1 - левая, 0 - правая
- count1 - текущее значение левой кнопки
- count2 - текущее состояние правой кнопки
В значении параметра text передаем бинарный код эмодзи в кодировке UTF-8 (список эмодзи), которые преобразуются из шестнадцатеричных данных в двоичные данные функцией hex2bin, и еще выведем текущее числовое значение счетчика кнопки.
Теперь нам остается только описать механизм определения команды и механизм ее обработки. Поэтому в методе init() создадим конструкцию оператора switch
Для создания новой клавиатуры мы используем метод setParams(), а для отправки изменений мы используем метод changeVote(). Здесь остановим внимание на методах Bot API
Подводим итоги
Мы рассмотрели некоторые способы взаимодействия между пользователем и ботом, в основном это элементы интерфейса бота. Исходный код можно скачать по этой ссылке. Далее нас ждет знакомство с медиа-файлами.
Комментарии
Внимание!
Убедитесь, что эта страница открыта в браузере, а не в приложении Telegram. В противном случае авторизация пройдет только в приложении Telegram.
мне нужно 30 шт вывести из базы
30 in лучше выводить с постраничной навигацией по 10 шт например, у Телеграм если не ошибаюсь установлено ограничение. У меня была ситуация, когда на 32 строке кнопок был косяк, но постраничка решила проблему.
А вывести не сложно если из базы получить массив то стандартными функциями (foreach, for, do while . ) php можно спокойно это сделать.
что нужно дописать этому боту сюда-
чтобы он вел лог отдельно для кажлого чайт айди в папке log ?
Здравствуйте а как кнопкам меню задать стиль ширину и длину? К сожалению Телеграм это не позволяет регулировать. жалко что вам скрин нельзя прислать, может я не правильно спросил, а как их перенести по принципу <br> что б они в столбик были? Если я правильно понял ваш вопрос, то это можно сделать просто - разбить массив на вложенность кратное необходимому кол-во строк. Откройте ветку на форуме, там удобнее. Только вопрос по больше разверните, что именно вам нужно узнать.Значение будет лежать:
1. Если приводить к объекту json_decode(file_get_contents('php://input'))->message->text
2. Если приводить к ассоциативному массиву json_decode(file_get_contents('php://input'), true)['message']['text']
Это значение будет /start 123456789
ТАК я формирую ссылку
но когда я перехожу по ссылке мне выдает ошибку
Старт выглядит также как у вас
1. Просьба оформить топик на форуме все еще актуальна.
2. У вас нет необходимого case поэтому условие проваливается в default, обратите внимание я вам выше писал, какое значение вам будет прилетать /start 123456789, где 123456789 в вашем случае это подставленный $chat_id
Telegram bot создать кнопки и клавиатуру PHP script
пример запроса для Telegram API для создания клавиатуры с кнопками
$bot_token = "********* Бот Токен"; // Telegram bot токен
$chat_id = "TELEGRAM ЧАТ ID"; // не забываем добавить TELEGRAM CHAT ID
$reply = "Working";
$url = "https://api.telegram.org/bot$bot_token/sendMessage";
$keyboard = array(
"keyboard" => array(array(array(
"text" => "/button"
),
array(
"text" => "contact",
"request_contact" => true // Данный запрос необязательный telegram button для запроса номера телефона
),
array(
"text" => "location",
"request_location" => true // Данный запрос необязательный telegram button для запроса локации пользователя
)),
"one_time_keyboard" => true, // можно заменить на FALSE,клавиатура скроется после нажатия кнопки автоматически при True
"resize_keyboard" => true // можно заменить на FALSE, клавиатура будет использовать компактный размер автоматически при True
);
$postfields = array(
'chat_id' => "$chat_id",
'text' => "$reply",
'reply_markup' => json_encode($keyboard)
);
print_r($postfields);
if (!$curld = curl_init()) exit;
>
curl_setopt($curld, CURLOPT_POST, true);
curl_setopt($curld, CURLOPT_POSTFIELDS, $postfields);
curl_setopt($curld, CURLOPT_URL,$url);
curl_setopt($curld, CURLOPT_RETURNTRANSFER, true);
Какая разница между запросом измененного размера клавиатуры (True) и не измененного (False)?
измененный: not resizable:
Можно скрывать клавиатуру после нажатия кнопки автоматически: one_time_keyboard => Ture (для скрытия) or False
Данный array пример финального запроса, который будет отправлен на АПИ телеграма через CURL запрос:
Пример с измененным размером и скрытием клавиатуры:
Что случится, если нажать на кнопку с параметром request_location или request_contact на клавиатуре Telegram. пример:
request_contact: request_location:
Сегодняшняя статья будет посвящена тому, каким образом можно создать для бота пользовательскую клавиатуру, что это даёт и как со всем этим работать. Все приводимые в статье примеры кода будут на php.
Пользовательские клавиатуры в Telegram бывают двух видов: Inline и Reply.
Описывающие клавиатуры объекты представляют собой многомерные массивы, содержащие наборы записей о каждой из кнопок (подпись, данные колбэка, открываемый при нажатии url и так далее).
Таким образом, для генерирования клавиатуры нам нужно сформировать в коде соответствующего типа объект, описывающий создаваемую клавиатуру (назовём этот объект, например, $keyboard), закодировать этот объект в виде json-строки и добавить эту json-строку в качестве параметра reply_markup при отправке запроса (GET или POST) telegram-боту.
// создаём $keyboard - объект, описывающий клавиатуру
$keyboard = [
"inline_keyboard" =>
[ /* первый ряд кнопок - массив из наборов */
[ /* первые две кнопки вызывают колбэк, а третья - открытие url-а */
[ "text" => "button 1",
"callback_data" => "data 1"
],
[ "text" => "button 2",
"callback_data" => "data 2"
],
[ "text" => "button 3",
"url" => $any_url
]
]
/* здесь мог бы быть второй массив для второго ряда кнопок и так далее */
]
];
.
.
// далее нужно просто добавить этот параметр в запрос (GET или POST) в качестве параметра reply_markup
// например, при использовании в GET-запросе:
$keyboard_json = json_encode($keyboard); // перекодируем в json
// формируем url для get-запроса и добавляем к этому url-у параметр reply_markup с описанием нашей клавиатуры
$url=$telegram_api_url.$bot_token.'/sendMessage?chat_id='.$chat_id.'&text='.urlencode($text_message).'&parse_mode=HTML'.'&reply_markup='.$keyboard_json;
// осталось только выполнить GET-запрос, например с помощью file_get_contents (ну или curl :))
file_get_contents($url); // отправляем get-запрос на сформированный url
Для удаления reply-клавиатуры нужно в параметре reply_markup послать объект, типа ReplyKeyboardRemove.
// создаём $remove_keyboard - объект, описывающий удаление reply-клавиатуры
$remove_keyboard = [
"remove_keyboard" => true
];
.
.
// далее нужно просто добавить этот объект в запрос (GET или POST) в качестве параметра reply_markup
// например, при использовании в GET-запросе:
$remove_keyboard_json = json_encode($remove_keyboard); // перекодируем в json
// формируем url для get-запроса и добавляем к этому url-у параметр reply_markup с описывающим удаление клавиатуры объектом
$url=$telegram_api_url.$bot_token.'/sendMessage?chat_id='.$chat_id.'&text='.urlencode($text_message).'&parse_mode=HTML'.'&reply_markup='.$remove_keyboard_json;
// осталось только выполнить GET-запрос, например с помощью file_get_contents (ну или curl :))
file_get_contents($url); // отправляем get-запрос на сформированный url
" [
"update_id":xxxxxxxxxx,
"callback_query":
"id":"xxxxxxxxxxx",
"from":
"id":xxxxxxxxx,
"first_name":"xxxxxxx",
"last_name":"xxxxxxx",
"username":"xxxxxxxxx",
"language_code":"ru"
>,
"message":
"message_id":xxxx,
"from":
"id":xxxxxxxxx,
"first_name":"xxxxxxxx",
"username":"xxxxxxx"
>,
"chat":
"id":xxxxxxxx,
"first_name":"xxxxxxx",
"last_name":"xxxxxxxx",
"username":"xxxxxxx",
"type":"private"
>,
"date":1499854111,
"text":"test"
>,
"chat_instance":"xxxxxxxxxxxx",
"data":"1"
>
>
]
>"
Вот и всё. Как видите, всё достаточно просто и понятно. В telegram вообще всегда всё просто, понятно и подробно описано. Вообще не понимаю, зачем нужны всякие библиотеки и фреймворки. Все они выглядят гораздо страшнее и монструознее, чем исходные описания из API. Это при том, что все эти фреймворки добавляют коду веса, ошибок и нестабильности. Уф, надо вступить в какое-нибудь движение за чистоту кода. Ну ладно, это я уже отвлёкся. Пока!
Создадим простого бота для мессенджера Telegram с использованием PHP. Данная статья создана исключительно в поучительных целях и не претендует на полноту или правильность подхода. Весь код бота очень простой и может быть освоен начинающими PHP-разработчиками.
Предупреждаю сразу профессионалов и перфекционистов от программирования — вам здесь делать нечего . Никаких фреймворков и гитхабов! Все будет очень просто и примитивно, но работать будет. И это главное. Всем счастья
Шаг 1: подготовка
Что нам понадобится:
Да, да. Бот еще даже не создан, но перед этим его уже нужно зарегистрировать, чтобы получить уникальный идентификатор, чтобы в дальнейшем обращаться к BOT API Telegram.
Шаг 3. Создаем код бота
Будем делать прямо в корне сервера (не самый верный подход, можно создать папку bot, а в ней уже файл verysimple_bot.php). Для этого на сервере создадим файл verysimple_bot.php в котором и будет весь код бота. Не забываем, что весь код в файле verysimple_bot.php должен быть в кодировке UTF-8.
Для редактирования файлов кода и заброске их на сервер удобно использовать FAR Manager — в нем есть и подсветка синтаксиса и FTP/SFTP клиент для копирования файла на сервер.
Делаем заготовку бота, который сможет выдавать список команд и информацию о нас:
Шаг 4. Делаем WebHook и конкретизируем код бота
Итак, базовый код бота мы сделали. Он сможет отвечать на 2 команды: /help (Помощь) и /about (Информация о нас). Но как теперь это заставить работать и, как работает функция message_to_telegram?
-
Чтобы все заработало, нужно сособщить сервису Телеграм, что наш бот лежит там-то — используй его код для такого-то бота verysimple_bot.
Для этого нужно сформировать ссылку, которая называется WebHook и её мы и сообщим телеграму:
Не забываем где красное заменяем на свои данные!
Как сформируете эту ссылку — вставьте её в браузер и запустите!
- Пользователь в диалоге с ботом пишет запрос, например /help
- Telegram Bot API через WebHook, что мы установили, берет этот запрос и отправляет в код бота
- Мы в боте получаем его, анализируем, видим например, /help и через Telegram Bot API и
функцию message_to_telegram отправляем ответ — который появлется в диалоге как ответ бота.
Шаг 5. Добавим возможность делать заявки через бота
Получим идентификатор chat_id пользователя кому нужно отсылать заявки:
- Помните наш файл message.txt — вот он сейчас понадобится
- Присоединяемся к нашему боту тем пользователем, кому будем слать заявки (менеджер компании)
- Сразу открываем файл message.txt и смотрим блок: [chat]
Сохраняем состояние бота для каждого пользователя
Далее, важный момент: у нас любой присоединившийся пользователь сможет сделать заявку, и чтобы бот понимал, что находится в режиме ввода заявки именно с этим пользователем, мы должны сохранять и считывать состояния бота для каждого пользователя отдельно!
Напишем две функции: set_bot_state($chat_id, $data) и get_bot_state($chat_id) — которые сохраняют текущее состояние бота и получают соответсвенно, для нужного пользователя. Сохранять будем в подпапке /users на сервере, которую создадим предварительно не забыв дать права на запись. Состояния будут хранится все в тех же текстовых файлах с именами chat_id пользователей и содержать последнюю команду:
Теперь дополним код бота, добавив запись и отлов состояния и отправив заявку менеджеру компании, если состояние отправки заявки.
Теперь, если у вас все работает и бот отзывается на все команды, можно будет зарегистрировать эти команды у отца ботов @BotFather
- Заходим к боту @BotFather
- Запрашиваем установку команд /setcommands
- Выбираем нашего бота
- Вбиваем команды (без слешей вначале):
help - список команд
about - о нас
order - оставить заявку - Все — теперь в вашем боте появится список команд, если нажать в диалоге /
Вот и все — простой бот работает! Всем спасибо, если дочитали и что-то заработало.
Николай Комарков
Читайте также: