кнопки телеграм бот php

Создание Telegram бота на PHP: Кнопки в телеграм боте. Урок 6

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

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

В этом уроке мы рассмотрим пример создания кнопок в Telegram боте на PHP и объединим весь тот код, который изучили ранее. То есть, мы научим нашего бота отправлять пользователю текстовое сообщение, файл, картинку, или видео, если он нажмет на ту или иную кнопку.

Создание меню из кнопок в Telegram

Для создания кнопочного меню в Телеграм боте можно написать следующий код:

<?php
// Приймаємо запит
$data = file_get_contents('php://input');
$data = json_decode($data, true);
file_put_contents(__DIR__ . '/message.txt', print_r($data, true)); //зберігаємо вхідні дані у файл
    
// Константа токен
define('TOKEN', '5741786015:AAGTuEwCBGHmcJP9kO-OzV_xKIduBkbAK6Y');
    
// Функція виклику методів 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;
}

// кнопки меню (2 ряди по 2 кнопки)
$keyboard = [
                [
                    ['text' => 'Кнопка 1'],
                    ['text' => 'Кнопка 2'],
                ],
            [
                    ['text' => 'Кнопка 3'],
                    ['text' => 'Кнопка 4'],
                ]
            ];
$reply_markup = json_encode(["keyboard"=>$keyboard,"resize_keyboard"=>true]);
 
// Відповідь на текстове повідомлення
// Отримуємо текст, який відправив користувач Телеграм боту в месенджері
if (!empty($data['message']['text'])) {
    $text = $data['message']['text'];
 
    // Виводимо кнопки в Telegram, якщо користувач ввів команду /menu
    if (mb_stripos( $text, '/start') !== false) {
        sendTelegram(
            'sendMessage',
                ['chat_id'=> $data['message']['chat']['id'],
                'text'=>'Це кнопкове Меню бота',
                'reply_markup'=>$reply_markup
                ]
        );
        exit();
    }
}
?>

Здесь, мы создаём кнопки, которые нужно показать пользователю в Телеграм, этим фрагментом кода:

// кнопки меню (2 ряди по 2 кнопки)
$keyboard = [
                [
                    ['text' => 'Кнопка 1'],
                    ['text' => 'Кнопка 2'],
                ],
            [
                    ['text' => 'Кнопка 3'],
                    ['text' => 'Кнопка 4'],
                ]
            ];
$reply_markup = json_encode(["keyboard"=>$keyboard,"resize_keyboard"=>true]);

А отправляем эти кнопки Телеграм боту, вот этой строкой кода:

'reply_markup'=>$reply_markup

Реакция на нажатие кнопок Телеграм бота

Теперь давайте сделаем так, чтобы если человек нажмёт на кнопку, то в ответ ему приходило какое-нибудь сообщение. Например, «Вы нажали на кнопку 1», «Вы нажали на кнопку 2» и т.д.

Когда человек нажимает на кнопку №1, то боту отправляется сообщение «Кнопка 1». Соответственно, мы можем отследить текст этого сообщения и в ответ прислать свой текст (это мы уже проходили в уроке №2 «Отправка и получение сообщений»).

Пример кода

if (!empty($data['message']['text'])) {
    $text = $data['message']['text'];

    // Виводимо кнопки в Telegram, якщо користувач ввів команду /menu
    if (mb_stripos( $text, '/start') !== false) {
        sendTelegram(
            'sendMessage',
                ['chat_id'=> $data['message']['chat']['id'],
                'text'=>'Це кнопкове Меню бота',
                'reply_markup'=>$reply_markup
                ]
        );
        exit();
    } else if (mb_stripos( $text, 'Кнопка 1') !== false) {
        sendTelegram(
                'sendMessage', 
                array(
                    'chat_id' => $data['message']['chat']['id'],
                    'text' => 'Ви натиснули кнопку №1'
                )
            );
            exit();
        }
}

То есть мы взяли код из нашего урока по отправке и получению сообщений Телеграм боту (см. Урок №2) и подставили его в конструкцию If…Then…Else If.

Таким же образом давайте сделаем с получением картинок, файлов и видео. Но предварительно давайте поменяем название наших кнопок на «Send text», «Send picture», «Send file» и «Send video». Так будет намного понятнее для чего предназначена каждая из этих кнопок.

Итоговый код Телеграм бота

<?php
// Приймаємо запит
$data = file_get_contents('php://input');
$data = json_decode($data, true);
file_put_contents(__DIR__ . '/message.txt', print_r($data, true)); //зберігаємо вхідні дані у файл
    
// Константа токен
define('TOKEN', '5741786015:AAGTuEwCBGHmcJP9kO-OzV_xKIduBkbAK6Y');

// Функція виклику методів 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;
}

// кнопки меню (2 ряди по 2 кнопки)
$keyboard = [
                [
                    ['text' => 'Send text'],
                    ['text' => 'Send picture'],
                ],
            [
                    ['text' => 'Send file'],
                    ['text' => 'Send video'],
                ]
            ];
$reply_markup = json_encode(["keyboard"=>$keyboard,"resize_keyboard"=>true]);
 
// Відповідь на текстове повідомлення
// Отримуємо текст, який відправив користувач Телеграм боту в месенджері
if (!empty($data['message']['text'])) {
    $text = $data['message']['text'];

    // Виводимо кнопки в Telegram, якщо користувач ввів команду /menu
    if (mb_stripos($text, '/start') !== false) {
        sendTelegram(
            'sendMessage',
                ['chat_id'=> $data['message']['chat']['id'],
                'text'=>'Це кнопкове Меню бота',
                'reply_markup'=>$reply_markup
                ]
        );
        exit();
    } else if (mb_stripos($text, 'Send text') !== false) {
        sendTelegram(
            'sendMessage', 
                array(
                    'chat_id' => $data['message']['chat']['id'],
                    'text' => 'Це текст який ви просили.'
                )
        );
        exit();
    } else if (mb_stripos($text, 'Send picture') !== false) {
        sendTelegram(
            'sendPhoto', 
            array(
                'chat_id' => $data['message']['chat']['id'],
                'photo' => curl_file_create(__DIR__ . '/foto-ua.jpg')
            )
        );
        
        exit();    
    } else if (mb_stripos($text, 'Send file') !== false) {
        sendTelegram(
            'sendDocument', 
            array(
                'chat_id' => $data['message']['chat']['id'],
                'document' => curl_file_create(__DIR__ . '/myFile.xlsm')
            )
        );
 
        exit();    
    } else if (mb_stripos($text, 'Send video') !== false) {
        sendTelegram(
            'sendVideo', 
            array(
                'chat_id' => $data['message']['chat']['id'],
                'video' => curl_file_create(__DIR__ . '/video.mp4')
            )
        );
 
        exit();    
    }
}
?>

Теперь, если пользователь нажмёт на соответствующую кнопку, то от Telegram бота он получит текстовое сообщение, файл, картинку, или видео.

То же самое будет происходить, если человек отправит текстовые сообщения боту в чате: «Send text», «Send picture», «Send file», «Send video».

Примечание.

Данный код получился достаточно громоздким. И намного проще было бы использовать конструкцию Switch Case для проверки условий. Но я выбрал именно такой вариант (конструкцию If Then Else If), поскольку я считаю, что такой способ записи кода намного понятнее новичкам, которые начали программировать с нуля.

Те же, кто разбираются в программировании, легко смогут преобразовать тот пример, который я вам предоставил, в PHP код с конструкцией Switch Case.

Main Menu