Кнопки клавиатуры на php

Инструкция по созданию Telegram ботов. Часть 6. Делаем пользовательскую клавиатуру для бота

Сегодняшняя статья будет посвящена тому, каким образом можно создать для бота пользовательскую клавиатуру, что это даёт и как со всем этим работать. Все приводимые в статье примеры кода будут на php.

Пользовательские клавиатуры в Telegram бывают двух видов: Inline и Reply.

Inline (встроенные)-клавиатуры просто добавляют кнопки внизу сообщения, вот так:

Эти клавиатуры привязаны к конкретному сообщению (как бы встроены в чат) и не подменяют собой традиционную клавиатуру, которая всё так же всплывает при нажатии на поле ввода текста. Главная особенность inline-клавиатур заключается в том, что нажатие на их кнопки не вызывает отправку в чат каких-либо сообщений, вместо этого генерируется некоторое «закулисное» событие: обратный вызов (callback), открытие URL или другого чата во встроенном режиме.

Интересной фишкой подобных клавиатур является возможность правки «на лету» сообщений, к которым они привязаны.

Reply-клавиатуры (клавиатуры для ответа) напротив, не привязаны к конкретному сообщению и подменяют (или дополняют) в чате с ботом традиционную клавиатуру. Эти клавиатуры вызывают отправку сообщений в чат и выглядят вот так:

Для того, чтобы сгенерировать какую-либо пользовательскую клавиатуру — нужно при обращении к одному из предназначенных для отправки данных API-методов (например, при к SendMessage) задать параметр reply_markup, описывающий объект типа InlineKeyboardMarkup — для создания inline-клавиатуры, или объект типа ReplyKeyboardMarkup — для создания reply-клавиатуры. Подробнее о том, к каким методам можно прицепить reply_markup, а к каким — нет, можно прочитать в документации.

Описывающие клавиатуры объекты представляют собой многомерные массивы, содержащие наборы записей о каждой из кнопок (подпись, данные колбэка, открываемый при нажатии 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

// создаём $keyboard — объект, описывающий клавиатуру
$keyboard = [
«keyboard» =>
[ /* первый ряд кнопок — массив из наборов <подпись кнопки>*/
[ /* перва кнопка отправляет команду /any_command в виде текстового сообщения, вторая — данные геолокации */
[ «text» => «/any_command»
],
[ «text» => «my location»,
«request_location» => true
]
]
/* здесь мог бы быть второй массив для второго ряда кнопок и так далее */
]
];
.
.
// далее нужно просто добавить этот параметр в запрос (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

Поскольку inline-клавиатуры привязаны к конкретным сообщениям, то с каждым новым сообщением нужно генерировать новую inline-клавиатуру. С reply-клавиатурами ничего подобного делать не нужно. Будучи однажды сгенерированной, такая клавиатура будет заменять дефолтную до тех пор, пока её не удалят или не заменят другой reply-клавиатурой.

Для удаления 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

Одна из прикольных фишек inline-клавиатур — возможность «на лету» править сообщения, к которым эти клавиатуры привязаны. Как я уже писал выше, нажатие на кнопки inline-клавиатур не вызывает отправку сообщений в чат, но то же время, получив callback мы всегда можем понять, к какому сообщению была привязана нажатая кнопка. Остаётся только исправить это сообщение при помощи одного из методов Updating messages.

Как получить callback? Для этого просто нужно запросить, получить и обработать очередной update, если бот работает через longpolling, или выполнить только два последних пункта, если бот работает через webhook (в этом случае, как вы помните, ничего запрашивать не нужно, так как телега сама знает по какому адресу отправлять апдейты). Данные колбэка будут содержаться в поле «callback_query» полученного апдейта.

» <"ok":true,"result":
[
<
«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″
>
>
]

Остаётся только выделить из апдейта данные, однозначно указывающие на само это сообщение (идентификатор чата и идентификатор сообщения), а также на нажатую кнопку и, собственно, отредактировать исходное сообщение. Понять какую именно кнопку нажали можно по содержимому поля «data» в полученном «callback_query». В этом поле будет содержаться информация, которую мы вписали
в поле «callback_data» для соответствующей кнопки при создании inline-клавиатуры.

// если мы определили, что нам прилетел именно колбэк (по наличию поля «callback_query»), то:
// выделяем из этого колбэка необходимые для редактирования сообщения данные
$chat_id = $input_array[‘callback_query’][‘message’][‘chat’][‘id’]; // идентификатор чата
$message_id = $input_array[‘callback_query’][‘message’][‘message_id’]; //идентификатор сообщения
$data = $input_array[‘callback_query’][‘data’]; // данные, которые были отправлены при нажатии на кнопку
.
.
// далее нужно просто выполнить запрос (GET или POST), обратившись, например, к методу editMessageText
$url=$telegram_api_url.$bot_token.’/editMessageText?chat_id=’.$chat_id.’&message_id=’.$message_id.’&text=’.urlencode($edited_message).’&reply_markup=’.$keyboard_json;
// $edited_message — отредактированный текст сообщения
// $keyboard_json — клавиатура, которая будет содержаться в отредактированном сообщении
file_get_contents($url); // отправляем get-запрос на сформированный url

Вот и всё. Как видите, всё достаточно просто и понятно. В telegram вообще всегда всё просто, понятно и подробно описано. Вообще не понимаю, зачем нужны всякие библиотеки и фреймворки. Все они выглядят гораздо страшнее и монструознее, чем исходные описания из API. Это при том, что все эти фреймворки добавляют коду веса, ошибок и нестабильности. Уф, надо вступить в какое-нибудь движение за чистоту кода. Ну ладно, это я уже отвлёкся. Пока!

Источник

Создание простого Telegram-бота с клавиатурой и inline-кнопками [Часть 2]

Два с воловиной года назад на сайте была статья о том, как сделать телеграм-бота. Сегодня я решил немного обновить используемую библиотеку и рассмотреть уже в новой части возможность добавления в бота клавиатуры с кнопками.

И сейчас я сразу начну с написания кода, ведь по сути эта статья является продолжением предыдущей (а в ней как раз-таки можно найти подробную инструкцию по подготовке и регистрации нового бота).

Архив с обновлённой библиотекой (работает на версии php >= 8.0):

Первым делом добавляем библиотеку в свой проект и создаём php-файл, в котором, собственно, и будем писать бота. После этого необходимо подключить библиотеку:

Теперь создаём экземпляр класса Bot и инициализируем переменные $data, $chat_id и $message:

Создаём массив с нужными нам кнопками:

Далее напишем проверку на клик по inline-кнопке. Также я добавлю блок else, в него добавим пару команд для демонстрации обновлений библиотеки:

Стоит заметить, что всё содержимое массива $data при наличии callback_query нужно искать уже внутри callback_query ( $data[‘callback_query’][‘*а дальше уже как обычно..*’] ).

Ну, а теперь с помощью конструкции switch-case проверим, на какую из кнопок нажал юзер:

При нажатии любую из первых двух кнопок бот просто уведомит пользователя об этом, при нажатии на третью — отправит картинку с помощью метода sendImage().

Да, как и обещал — в блок else добавляем ещё две команды:

При вводе команды /кнопки — бот будет отправлять клавиатуру пользователю. При вводе команды /привет — здороваться с ним. Однако для первой команды я использовал метод reply(), а для второй — метод sendMessage(). Почему? Разница, на самом-то деле, небольшая: в метод sendMessage() необходимо передавать ID чата, а в метод reply() айди передавать не нужно (ответ придёт тому, кто написал боту). Поэтому в нашем случае, конечно же, удобнее и проще юзать reply().

Источник

Как создать бота Вконтакте с кнопками (keyboard)


В этой статье мы рассмотрим как просто и быстро создать кнопки для управления ботом. Кнопки упрощают использование бота и делают управление им удобнее, чем писать текстовые команды.
Требования:
PHP +5.6
VK API v5.126

Статья обновлена до последней версии API 5.126 на сегодняшний день.

Загружаем папку с файлами на сервер, туда же где будем создавать файл, для работы бота нужен будет сервер, для начала можете использовать бесплатный, на сайте есть статья как запустить вк бота на бесплатном хостинге

Создаем файл с названием bot.php в том же месте, где лежит наша библиотека и начинаем писать следующий код.

Этот код мы писали ранее, в статье как создать простого бота вк, там же мы рассматривали как его подключать к сообществу.

Теперь создаем переменные кнопок, в этой статье их будет всего 4, но по этим примерам, Вы с легкостью сможете добавить еще. В коде выше они уже есть

Рассмотрим их подробнее.
$btn_1 — Название переменной, далее вызываем функцию из библиотеки и пишем параметры = $vk->buttonText(‘Кнопка 1’, ‘green’, [‘command’ => ‘btn_1’]); btn_1 название кнопки, «Кнопка 1» любой текст в кнопке, может повторятся, «green» цвет кнопки, всего доступно 4 варианта:
green — Зеленый
blue — Синий
red — Красный
white — Белый
Теперь давайте вызовем кнопки и посмотрим как они смотрятся. Создаем проверку события на новое сообщение:

Проверим работу в Вконтакте

Кнопки появились, но если на них нажимать, бот снова их будет присылать, давайте привяжем их к определенному тексту, по умолчанию это кнопка Начать, это и будем использовать.

В код добавим переменную которая содержит текст сообщения и будем проверять, если это слово Начать, то покажем кнопки, все другое игнорируется.

Теперь для каждой кнопки сделаем свои ответы, так как сейчас они не работают. Для этого нужно получить payload и сделать проверку на выбранную кнопку


Сразу же сделали и скрытие кнопок по команде Отключить, кнопок может быть сколько угодно, отображать на странице за раз можно 10 кнопок, используя кнопки можно сделать переход в разные разделы и быстрое обращение к боту, исходник с библиотекой можете скачать в самом низу.
Для того что бы выставить кнопки столбцом, а не в ряд, нужно:
Заменить:
на
Получаем вот такой вариант:

Вид кнопок может быть разным, что бы разместить 1 кнопку в столбец, 2 и 3 в строку, а 4 тоже в столбец, нужно взять в квадратные скобки 2 и 3 кнопки


Я думаю с этим все понятно, дальше быстро пробежимся по запуску бота, не смотря на то, что на сайте уже есть статья на эту тему.
Созданные файлы мы загружаем на хостинг, советую выделить для этого 100 рублей, цена 1 пачки сигарет, ну или 2 шоколадки 🙂 покупаем готовый хостинг, если не нужна база данных в будущем, то стоимость падает в 2 раза, до 40 рублей

Это стоимость на HostLine.ru

Переходим в ISPManager прямо из личного кабинета

Далее выбираем наш сайт, HostLine создает автоматически домен 3 уровня, и переходим в каталог

И закачиваем наши 2 файла

Теперь перейдя по нашему домену, в моем случае это http://vh328199.hostline.su/bot.php, если домен не отвечает, нужно немного подождать, пока ваш провайдер не начнет его видеть, обычно это занимает не более 24 часов.

Теперь эту ссылку вставляем в настройки VK API самой группы

И не забывайте включить Тип событий на входящие сообщения

Источник

TypeRus
Adblock
detector