Код 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.

results matching ""

    No results matching ""