Как сделать кнопки в телеграм?

В телеграм боте сейчас 3 кнопки, по клику пишут в чат простой текст. Как сделать 4 кнопки, но расположить их по 2 в ряд? И по клику по первой кнопке /help вывести еще 4 кнопки, типа многоуровнего меню.

введите сюда описание изображения

$data = file_get_contents('php://input');
$data = json_decode($data, true);
 
if (empty($data['message']['chat']['id'])) {
    exit();
}
 
define('TOKEN', '7444555:AAHomfgjN0mM');
 
// Функция вызова методов API.
function sendTelegram($method, $response)
{
    $ch = curl_init('https://api.telegram.org/bot' . TOKEN . '/' . $method);  
    curl_setopt($ch, CURLOPT_POST, 1);  
    curl_setopt($ch, CURLOPT_POSTFIELDS, $response);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_HEADER, false);
    $res = curl_exec($ch);
    curl_close($ch); 
    return $res;
}
 
// Ответ на текстовые сообщения.
if (!empty($data['message']['text'])) {
    $text = $data['message']['text'];


$keyboard = [
    [ "/start" ],
    [ "/help" ],
    [ "Кнопка 3" ]
];

$reply_markup = json_encode([
    "keyboard"=>$keyboard,
    "resize_keyboard"=>true
]);


// Команда /start.
    if (mb_stripos($text, '/start') !== false) {
        sendTelegram(
            'sendMessage', 
            array(
                'chat_id' => $data['message']['chat']['id'],
                'text'=>'Добро пожаловать в бота! /help /photo',
                'reply_markup'=>$reply_markup
        
            )
        ); 
        exit(); 
    } 
 
    if (mb_stripos($text, '/help') !== false) {
        sendTelegram(
            'sendMessage', 
            array(
                'chat_id' => $data['message']['chat']['id'],
                'text' => 'Помощь!'
            )
        );
        exit(); 
    } 
 
    // Отправка фото.
    if (mb_stripos($text, '/photo') !== false) {
        sendTelegram(
            'sendPhoto', 
            array(
                'chat_id' => $data['message']['chat']['id'],
                'photo' => curl_file_create(__DIR__ . '/img/edem.jpg'),
                'caption' => "Подпись к изображению",
                'parse_mode' => 'HTML',
            )
        );      
        exit(); 
    }
 
}

Ответы (1 шт):

Автор решения: Арсен

Вам нужно использовать inline_keyboard:

$keyboard = [];
$keyboard[] = [['text' =>'Название кнопки', 'callback_data' => 'button_1']];

text - Название кнопки

callback_data - ключ, который будет отправлен вам при нажатии (или /command - которая будет выполнена)

Для размещения кнопок по горизонтали можете сделать так:

$keyboard[] = [['text' =>'Название кнопки', 'callback_data' => 'button_1'],['text' =>'Название кнопки 2', 'callback_data' => 'button_2']];


$replyMarkup = [
    'inline_keyboard' => $keyboard
];

При нажатии на /help вам нужно обработать это действие и возвратить пользователю второй подготовленный набор inline_keyboard

Сам запрос, это как пример

sendTelegram('sendMessage', [
    'chat_id' => 'your_chat_id',
    'text' => 'Сообщение',
    'reply_markup' => json_encode($replyMarkup),
    'parse_mode' => 'HTML'
]);

UPD

Для добавления кнопок в 'футере' можно сделать так:

$keyboard = [
    'keyboard' => [
        [['text' => 'Кнопка 1'], ['text' => 'Кнопка 2']],
        [['text' => 'Кнопка 3'], ['text' => 'Кнопка 4']]
    ],
    'resize_keyboard' => true, // Изменяем размер под количество кнопок
    'one_time_keyboard' => false // Оставляем клавиатуру после нажатия
];

$data = [
    'chat_id' => $chat_id,
    'text' => 'Выберите действие:',
    'reply_markup' => json_encode($keyboard)
];
→ Ссылка