Два с воловиной года назад на сайте была статья о том, как сделать телеграм-бота. Сегодня я решил немного обновить используемую библиотеку и рассмотреть уже в новой части возможность добавления в бота клавиатуры с кнопками.
И сейчас я сразу начну с написания кода, ведь по сути эта статья является продолжением предыдущей (а в ней как раз-таки можно найти подробную инструкцию по подготовке и регистрации нового бота).
Архив с обновлённой библиотекой (работает на версии php >= 8.0):
Первым делом добавляем библиотеку в свой проект и создаём php-файл, в котором, собственно, и будем писать бота. После этого необходимо подключить библиотеку:
<?php
require_once __DIR__ . '/telekot/Bot.php';
Теперь создаём экземпляр класса Bot и инициализируем переменные $data, $chat_id и $message:
$tg = \telekot\Bot::create( 'токен' )
->initData( $data )
->initChatId( $chat_id )
->initMessage( $message );
Создаём массив с нужными нам кнопками:
$kbd = [
'inline_keyboard' => [
[
[
'text' => 'Кнопка #1',
'callback_data' => 'one'
],
[
'text' => 'Кнопка #2',
'callback_data' => 'two'
]
],
[
[
'text' => '🌄 Картинка',
'callback_data' => 'img'
]
]
]
];
Далее напишем проверку на клик по inline-кнопке. Также я добавлю блок else, в него добавим пару команд для демонстрации обновлений библиотеки:
if ( isset( $data['callback_query'] ) )
{
// Тут будем обрабатывать нажатие на кнопки
}
else
{
// Тут будем обрабатывать обычные команды
}
Стоит заметить, что всё содержимое массива $data при наличии callback_query нужно искать уже внутри callback_query ( $data['callback_query']['*а дальше уже как обычно..*'] ).
Ну, а теперь с помощью конструкции switch-case проверим, на какую из кнопок нажал юзер:
switch ( $data['callback_query']['data'] )
{
case 'one':
{
$tg->sendMessage( $chat_id, 'Вы нажали на первую кнопку' );
break;
}
case 'two':
{
$tg->sendMessage( $chat_id, 'Вы нажали на вторую кнопку' );
break;
}
case 'img':
{
$tg->sendImage( 'Держи картинку', 'https://proprikol.ru/wp-content/uploads/2020/10/kartinki-ozero-45.jpeg' );
break;
}
}
При нажатии любую из первых двух кнопок бот просто уведомит пользователя об этом, при нажатии на третью - отправит картинку с помощью метода sendImage().
Да, как и обещал - в блок else добавляем ещё две команды:
if ( $message == '/привет' )
{
$tg->reply( 'Здарова' );
}
else if ( $message == '/кнопки' )
{
$tg->sendMessage( $chat_id, 'Вот твои кнопки:', $kbd );
}
При вводе команды /кнопки - бот будет отправлять клавиатуру пользователю. При вводе команды /привет - здороваться с ним. Однако для первой команды я использовал метод reply(), а для второй - метод sendMessage(). Почему? Разница, на самом-то деле, небольшая: в метод sendMessage() необходимо передавать ID чата, а в метод reply() айди передавать не нужно (ответ придёт тому, кто написал боту). Поэтому в нашем случае, конечно же, удобнее и проще юзать reply().
Весь код:
<?php
require_once __DIR__ . '/telekot/Bot.php';
$tg = \telekot\Bot::create( 'токен' )
->initData( $data )
->initChatId( $chat_id )
->initMessage( $message );
$kbd = [
'inline_keyboard' => [
[
[
'text' => 'Кнопка #1',
'callback_data' => 'one'
],
[
'text' => 'Кнопка #2',
'callback_data' => 'two'
]
],
[
[
'text' => '🌄 Картинка',
'callback_data' => 'img'
]
]
]
];
if ( isset( $data['callback_query'] ) )
{
switch ( $data['callback_query']['data'] )
{
case 'one':
{
$tg->sendMessage( $chat_id, 'Вы нажали на первую кнопку' );
break;
}
case 'two':
{
$tg->sendMessage( $chat_id, 'Вы нажали на вторую кнопку' );
break;
}
case 'img':
{
$tg->sendImage( 'Держи картинку', 'https://proprikol.ru/wp-content/uploads/2020/10/kartinki-ozero-45.jpeg' );
break;
}
}
}
else
{
if ( $message == '/привет' )
{
$tg->reply( 'Здарова' );
}
else if ( $message == '/кнопки' )
{
$tg->sendMessage( $chat_id, 'Вот твои кнопки:', $kbd );
}
}
А вот, собственно, как работает бот:
Нашли ошибку?
Вы можете сообщить об этом администрации.
Выделив текст нажмите CTRL+Enter