Вивчаючи тему "Створення 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.
