В третьей части по написанию Telegram-ботов реализуем так называемую предложку. По сути это будет некий репорт-бот, который будет получать обращения/сообщения/новости/репорты от пользователей и отправлять админу. То бишь пользователь вводит команду /start -> бот предлагает ввести сообщение -> пользователь вводит сообщение -> сообщение отправляется админу.
Для сегодняшних задач обновил библиотеку и добавил класс-хранилище. Принцип его работы похож на тот, что я описывал в статье по ВК-боту. Но всё же чутка отличается.
Итак, первым делом необходимо подготовить бота на стороне телеграма. Подробная инструкция есть в этой статье. Далее в папку с проектом добавляем обновлённую версию библиотеки. Её можно скачать сразу. В конце урока также будет полный архив с исходниками.
Далее создаём php-файл, в котором будем писать бота (bot.php) и сразу же подключаем библиотеку:
<?php
require_once __DIR__ . '/telekot/autoload.php'; // Подключение библиотеки
В константу REPORT_CHAT_ID нужно вписать айди чата, в который бот будет скидывать все сообщения юзеров. Я для этих целей буду юзать свою личку.
const REPORT_CHAT_ID = ''; // ID чата, в который будут приходить репорты
Создаём экземпляр класса Bot, попутно инициализируя $chat_id и $message:
$tg = \telekot\Bot::create( 'токен' ) // Создаём экземпляр класса Bot, передаём в метод create() токен бота
->initChatId( $chat_id ) // Инициализируем айди чата, из которого поступают боту сообщения (например, это может быть айди пользователя, написавшего боту)
->initMessage( $message ); // Инициализируем текст сообщения, которе было отправлено боту
И создаём экземпляр класса Storage, передавая в метод start() экземпляр класса Bot (он у нас записан в переменную $tg):
$ctx = \telekot\Storage::start( $tg ); // Создаём экземпляр класса Storage для работы с хранилищем
Поскольку репорт можно будет написать после введения команды /start - добавляем соответствующее условие в код:
if ( $message == '/start' )
{
// Тут продолжим писать код
}
В связи с тем, что отправка репорта осуществляется в два этапа (1 - ввод команды /start, 2 - отправка репорта) - нужно записать статус диалога с написавшим боту пользователем в кэш, а также дать юзеру дальнейшие инструкции:
$ctx->ctx(); // Создаём файл в кэше и ставим статус диалога в положение 1
$tg->reply( 'Привет, напиши своё репорт/новость/обращение в следующем сообщении' ); // Отправляем мессаг юзеру
Метод ctx() создаёт в папке cache новый файл (формата *user_id*.php) и устанавливает статус 1 в сгенерированном массиве.
Значения из кэша можно извлекать методом get() по ключу (в нашем случае ключ - 'status'). Поэтому в блоке elseif проверяем, писал ли уже этот пользователь боту или нет. Если статус равен единице - значит писал, в противном случае условие не выполняется.
else if ( $ctx->get( 'status' ) == 1 )
{
// Тут продолжим
}
Больше никаких данных пользователь вводить не будет, а значит из хранилища запись можно удалять. Делаем это, используя метод delete():
$ctx->delete(); // Удаляем запись из кэша
Ну, и осталось отослать репорт админу и уведомить юзера об успешной отправке:
$tg->sendMessage( REPORT_CHAT_ID, "Новый репорт от @{$data['message']['from']['username']}: \n\n" . $message ); // Отправляем админу репорт
$tg->reply( 'Репорт успешно отправлен админу, если хочешь написать ещё что-нибудь - введи команду /start' ); // Говорим челу, что репорт успешно отправлен
Весь код:
<?php
require_once __DIR__ . '/telekot/autoload.php'; // Подключение библиотеки
const REPORT_CHAT_ID = ''; // ID чата, в который будут приходить репорты
$tg = \telekot\Bot::create( 'токен' ) // Создаём экземпляр класса Bot, передаём в метод create() токен бота
->initData( $data )
->initChatId( $chat_id ) // Инициализируем айди чата, из которого поступают боту сообщения (например, это может быть айди пользователя, написавшего боту)
->initMessage( $message ); // Инициализируем текст сообщения, которе было отправлено боту
$ctx = \telekot\Storage::start( $tg ); // Создаём экземпляр класса Storage для работы с хранилищем
if ( $message == '/start' )
{
$ctx->ctx(); // Создаём файл в кэше и ставим статус диалога в положение 1
$tg->reply( 'Привет, напиши своё репорт/новость/обращение в следующем сообщении' ); // Отправляем мессаг юзеру
}
else if ( $ctx->get( 'status' ) == 1 )
{
$ctx->delete(); // Удаляем запись из кэша
$tg->sendMessage( REPORT_CHAT_ID, "Новый репорт от @{$data['message']['from']['username']}: \n\n" . $message ); // Отправляем админу репорт
$tg->reply( 'Репорт успешно отправлен админу, если хочешь написать ещё что-нибудь - введи команду /start' ); // Говорим челу, что репорт успешно отправлен
}
Нашли ошибку?
Вы можете сообщить об этом администрации.
Выделив текст нажмите CTRL+Enter