кнопки телеграм бот 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