Telegram Bot на Evolution CMS.

Меня когда-то просили рассказать как сделать бота при помощи Evo. В целом всё затянулось из-за того что я не знал о чём тут написать. По этому решил набросать простые вещи:
  1. Как создать бота;
  2. Как обновить webhook;
  3. Как принять простое сообщение и ответить на него;
  4. Как отправить простую менюшку;
  5. Как отправить картинку.
В целом этого будет достаточно для создания простого бота. Если нужно что-то сложней, то в целом “Читай доку” ©Pathologic . https://core.telegram.org/bots/api

Как создать бота?
В целом всё довольно просто, нужно написать @botfather
По итогу общения мы получим токен для работы с ботом. Ваше общение будет выглядеть примерно так

В целом дальше вам необходимо определится с методами получения сообщений от бота. Их существует два варианта webhook и ручное получение обновлений. Из личного опыта скажу, что самый простой вариант общения это через webhook.

Как обновить webhook?
Фактически вебхук это ваш урл, который будет принимать все уведомления от телеграмма. И для того чтобы его задать, необходимо отправить ваш урл на определенную страницу telegramm-а. Но я бы посоветовал использовать для этих целей какую-либо библиотеку. Например вот эту https://github.com/TelegramBot/Api.
Процесс установки достаточно прост. Ставим из extras дополнение Composer. Там пишем “telegram-bot/api” и жмём кнопку установить.
Дальше, создаём ресурс. В который помещаем наш сниппет. В целом можно сделать и плагин на 404, но это чисто по желанию.
И так код сниппета у нас получается примерно вот такой.
$bot = new \TelegramBot\Api\BotApi('тут наш токен');
if(isset($_GET['update_webhook'])) {
	$hook_url = $modx->makeUrl(2, '', '','full'); //2 - это id нашего ресурса
	$result = $bot->setWebhook($hook_url);
	exit();
}else {
//Остальной код работа с ботом
}

Фактически нам теперь необходимо вызвать нашу вторую страницу, с GET ключом “update_webhook” и после этого все сообщения для нашего бота, будут идти на наш сервер.
Есть два обязательных правила. Сайт должен быть с https и необходимо обновлять урл webhook необходимо каждых 24 часа. У меня просто стоит крон, который делает wget по нужному мне урлу. Именно из-за моей лени придумывать урл я и использую ресурс в качестве места хранения сниппета.

И так после того как вы привязали вебхук, мы можем получать сообщения и отвечать на них.

Как принять простое сообщение и ответить на него?
Все данных из вебхука идут на наш php://input, в виде JSON объекта. Все данные считываем вот таким образом.
$data = json_decode(file_get_contents('php://input'), true);

И фактически текст входящего текстового сообщения хранится в:
$data['message']

А информация о том, кто нам прислал сообщение в:
$data['message']['from']['id']

Это актуально только для общения с ботом 1-1, для общения в группе нам необходимо немного по другому обращаться с данными.
И так у нас есть сообщение, и есть id того кто прислал. И теперь мы можем отправить ответ этому человеку.
$chat_id = $data['message']['from']['id'];
$bot->sendMessage($chat_id, 'Текст ответа');


Как добавить простую менюшку?
Меню которое мы отправляем человеку задаётся в виде массива.
$keyboard = new \TelegramBot\Api\Types\ReplyKeyboardMarkup(array(array("Меню 1", "Меню 2", "Меню 3"), array("Новая строка")), false);
$chat_id = $data['message']['from']['id'];
$text = "Какой-то текст под меню";
$bot->sendMessage($chat_id, $text, null, false, null, $keyboard);

После нажатия на какую-либо кнопку, человек будет отправлять текст этой кнопки на наш сервер.

Как отправить картинку?
В простом случае это выглядит как-то так
$chat_id = $data['message']['from']['id'];
$picture = "http://example.com/picture.jpg"
$description = "Описание под картинку";
$bot->sendPhoto($this->chat_id, $picture, $description, null);

Одно из самых важных о чём нужно помнить описание не может превышать 255 символов.

Вот такими простыми вещами, можно построить простого бота. Котобот(@serious_cat_bot) от меня и @kasick построен на условно этих знаниях.

0 комментариев

Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.