Код 1 sendMessage - отправка сообщения по команде
В этом примере мы разберем метод отправки сообщения пользователю при определенных командах.
Полную документацию API вы найдете тут
Начнем!
В папке public_html создадим еще один файл и назовем telegrambot.php. В этом файле мы будем создавать класс и методы для работы.
В telegrambot.php пишем такой код:
<?php
error_reporting(E_ALL); // вывод ошибок
###############################################
define(API_TOKEN, 'ВАШ_ТОКЕН'); // тут прописываем свой токен
define(URL, 'https://api.telegram.org/bot'.API_TOKEN); // глобальная ссылка для получение json данных (не трогать)
###############################################
class BOT { // Создаем класс BOT
/* создаем метод sendMessage с аргументами
* $chatid - ид получателя
* $msg - сообщение
* $keyboard - клавиатура
* $keyboard_opt[0] - тип клавиатуры keyboard | inline_keyboard
* $keyboard_opt[1] - спрятать клавиатуру при клике
* $keyboard_opt[2] - авторазмер клавиатуры при клике
* $parse_preview[0]- маркировка html| markdown
* $parse_preview[1]- предпросмотр ссылок
*/
function sendMessage($chatid, $msg, $keyboard = [], $keyboard_opt = [], $parse_preview = ['html', false]) {
if(empty($keyboard_opt)) {
$keyboard_opt[0] = 'keyboard';
$keyboard_opt[1] = false;
$keyboard_opt[2] = true;
}
$options = [
$keyboard_opt[0] => $keyboard,
'one_time_keyboard' => $keyboard_opt[1],
'resize_keyboard' => $keyboard_opt[2],
];
$replyMarkups = json_encode($options);
$removeMarkups = json_encode(['remove_keyboard' => true]);
// если в массиве $keyboard передается [0], то клавиатура удаляется
if($keyboard == [0]) { file_get_contents(URL.'/sendMessage?disable_web_page_preview='.$parse_preview[1].'&chat_id='.$chatid.'&parse_mode='.$parse_preview[0].'&text='.urlencode($msg).'&reply_markup='.urlencode($removeMarkups)); }
// или же если в массиве $keyboard передается [], то есть пустой массив, то клавиатура останется прежней
else if($keyboard == []) { file_get_contents(URL.'/sendMessage?disable_web_page_preview='.$parse_preview[1].'&chat_id='.$chatid.'&parse_mode='.$parse_preview[0].'&text='.urlencode($msg)); }
// если вышеуказанные условия не соблюдены, значит в $keyboard передается клавиатура, которую вы создали
else { file_get_contents(URL.'/sendMessage?disable_web_page_preview='.$parse_preview[1].'&chat_id='.$chatid.'&parse_mode='.$parse_preview[0].'&text='.urlencode($msg).'&reply_markup='.urlencode($replyMarkups)); }
}
}
?>
Давайте разберем все на примере теперь!
В файле hook.php что бы раннее создавали, пишем такой код:
<?php
require "telegrambot.php"; // подключаем telegrambot.php
$bot = new BOT(); // в переменную $bot создаем экземпляр нашего класса BOT
############################################################################
$output = json_decode(file_get_contents('php://input'), true); // Получим то, что передано скрипту ботом в POST-сообщении и распарсим
$chat_id = @$output['message']['chat']['id']; // идентификатор чата
$user_id = @$output['message']['from']['id']; // идентификатор пользователя
$username = @$output['message']['from']['username']; // username пользователя
$first_name = @$output['message']['chat']['first_name']; // имя собеседника
$last_name = @$output['message']['chat']['last_name']; // фамилию собеседника
$chat_time = @$output['message']['date']; // дата сообщения
$message = @$output['message']['text']; // Выделим сообщение собеседника (регистр по умолчанию)
$msg = mb_strtolower(@$output['message']['text'], "utf8"); // Выделим сообщение собеседника (нижний регистр)
$callback_query = @$output["callback_query"]; // callback запросы
$data = $callback_query['data']; // callback данные для обработки inline кнопок
$message_id = $callback_query['message']['message_id']; // идентификатор последнего сообщения
$chat_id_in = $callback_query['message']['chat']['id']; // идентификатор чата
############################################################################
switch($message) { // в переменной $message содержится сообщение, которое мы отправляем боту.
case '/start': $bot->sendMessage($user_id, "Привет"); break;
default: $bot->sendMessage($user_id, "Неизвестная команда");
}
?>
Разберем строку:
case '/start': $bot->sendMessage($user_id, "Привет"); break;
Если мы напишем боту /start, наша переменная $bot обратится к методу sendMessage и скажет, отправь пользователю с $user_id , который только что написал /start, сообщение "Привет"
Если вы хотите что-бы бот поприветствовал вас по имени, то добавьте переменную $first_name,
case '/start': $bot->sendMessage($user_id, "Привет ".$first_name); break;
и тогда вы получите
Так ладно. С этим разобрались!
Вы наверное обратили внимание, что метод sendMessage имеет 5 аргументов, а мы использовали только 2 из них - это $chatid который $user_id и $msg, который "Привет".
Давайте разберем следующие аргументы - это $keyboard, наша клавиатура (кнопки) и $keyboard_opt опции для клавиатуры.
case '/start': $bot->sendMessage($user_id, "Привет ".$first_name, [['Здравствуй бот', 'Как меня зовут ?'], ['Случайное число', 'Удалить кнопки']]); break;
Теперь давайте напишем команду /start и мы увидим что у нас снизу появились кнопки
Если нажать на какую-нибудь из кнопок, то появится такое сообщение: Неизвестная команда, потому что бот не знает такую команду.
Давайте прикрепим команды к кнопкам, указав в case 'текст нашей кнопки'
case 'Здравствуй бот': $bot->sendMessage($user_id, "Здравствуй ".$first_name, []); break;
case 'Как меня зовут ?': $bot->sendMessage($user_id, "Тебя зовут ".$first_name, []); break;
case 'Случайное число': $bot->sendMessage($user_id, "Число ".rand(10, 10000), []); break;
case 'Удалить кнопки': $bot->sendMessage($user_id, "Кнопочки удалены", [0]); break;
Обратите внимание, что мы оставляем массив $keyboard пустым [], это мы специально сделали в методе, что-бы клавиатура стояла на месте если не требуется новых кнопок. Но как вы обратили внимание, при нажатии на кнопку Удалить кнопки , наша клавиатура (кнопки) уничтожились, так как мы в массиве $keyboard передаем [0], так как мы в методе задали такое условие. Если понадобиться уничтожить клавиатуру (кнопки) полностью, то стоит только написать [0].
А теперь давайте познакомимся с четвертым аргументом $keyboard_opt - это опции нашей клавиатуры. Описание также находится над методом.
$keyboard_opt имеет три элемента
- $keyboard_opt[0] Тип клавиатуры (keyboard и inline_keyboard)
- $keyboard_opt[1] Скрыть клавиатуру ? (true - да / false - нет)
- $keyboard_opt[2] Не устанавливать авто-размер кнопок ? (true - да / false - нет)
Если мы заглянем в метод sendMessage, то мы увидим такое условие
if(empty($keyboard_opt)) {
$keyboard_opt[0] = 'keyboard';
$keyboard_opt[1] = false;
$keyboard_opt[2] = true;
}
Если массив $keyboard_opt не передавать, то по умолчанию он будет передавать пустой массив, и у нас есть условие, которое говорит следующее:
Если массив $keyboard_opt пустой, то элементы массива по умолчанию получают такие значения
$keyboard_opt[0] = 'keyboard'; // клавиатура по умолчанию
$keyboard_opt[1] = false; // скрывать (сворачивать) клавиатуру при нажатии ?
$keyboard_opt[2] = true; // не устанавливать авто-размер клавиатуре ?
Тип клавиатуры keyboard создает кнопки клавиатуры под полем ввода сообщения, а тип inline_keyboard отображает кнопки клавиатуры в самом сообщении. Но об этом типе я буду рассказывать в следующей части.
А пока давайте по-экспериментируем с опциями клавиатуры
case 'Здравствуй бот': $bot->sendMessage($user_id, "Здравствуй ".$first_name, [['Здравствуй бот', 'Как меня зовут ?'], ['Случайное число', 'Удалить кнопки']], ['keyboard', true, true]); break;
Значит мы передаем $user_id, передаем сам текст сообщения, передаем клавиатуру с кнопками
[['Здравствуй бот', 'Как меня зовут ?'], ['Случайное число', 'Удалить кнопки']]
и передаем опции
['keyboard', true, true]
Тип keyboard, скрывать клавиатуру (true - да ), не устанавливать авто-размер (true), т.е ДА НЕ УСТАНАВЛИВАЕМ.
При нажатии на кнопку Здравствуй бот, наша клавиатура сворачивается и разворачивается автоматически.
Давайте установим такие опции
['keyboard', false, false]
и нажмем еще раз на кнопку Здравствуй бот, мы увидим изменение размера кнопок
С этим аргументом закончили, остался последний аргумент, это массив $parse_preview, который в себя принимает два элемента, это стиль маркировки html или markdown и скрыть предпросмотр ссылок (true - да или false - нет)
Если массив не указать в методе, то он принимает значение по умолчанию
['html', false]
Вот пример с ['html', true]
case 'Здравствуй бот': $bot->sendMessage($user_id, "Здравствуй <i>".$first_name."</i>! Посмотри этот сайт https://core.telegram.org/", [['Здравствуй бот', 'Как меня зовут ?'], ['Случайное число', 'Удалить кнопки']], ['keyboard', false, true], ['html', true]); break;
Нажимаем Здравствуй бот получим сообщение от бота,
так как у нас во втором элементе стоит (true - да скрыть предпросмотр)
А вот пример с ['html', false]
case 'Здравствуй бот': $bot->sendMessage($user_id, "Здравствуй <i>".$first_name."</i>! Посмотри этот сайт https://core.telegram.org/", [['Здравствуй бот', 'Как меня зовут ?'], ['Случайное число', 'Удалить кнопки']], ['keyboard', false, true], ['html', false]); break;
Нажимаем еще раз Здравствуй бот получим сообщение уже с предпросмотром
На этой мажорной ноте закончим с методом sendMessage.