Содержание
Блог компании Нетология PHP *Разработка мобильных приложений *API * Tutorial
Шаг 1: регистрация бота у @BotFather
Прежде чем начать писать код, нового бота нужно зарегистрировать у «папы всех ботов» — @BotFather, чтобы получить токен (ключ) для работы с Telegram API. Регистрация проходит в 5 простых этапов: 1) Открываете чат с @BotFather; 2) Вводите или выбираете из списка команду /newbot; 3) Отправляете желаемое название для бота; 4) Пишете юзернейм бота, по которому его будут находить через поиск. Обязательно на конце вашего юзернейма должно быть слово «bot» или «_bot». Например, NetologyRSSbot; 5) По желанию можно сразу настроить полное или краткое описание, список команд и аватарку. По итогу регистрации получаем наш токен — 375466075:AAEARK0r2nXjB67JiB35JCXXhKEyT42Px8s. Будьте осторожны: никогда и никому не показывайте токен, иначе ваш бот может быть скомпрометирован. Если по несчастливой случайности кто-то нехороший все-таки узнал ваш токен, то заменить его можно всё в том же @BotFather, нажав на кнопку «Revoke current token» в разделе «API Token».
Шаг 2: выбираем способ обработки запросов
Исходя из официальной документации, Telegram API основан на простых HTTP-запросах. Существует всего два различных способа обрабатывать запросы, которые пользователи будут посылать боту: 1) проверять «вручную», используя «Long Polling»; 2) доверить всё Telegram, поставив «Webhook». В этом случае любой запрос от пользователя Telegram сам будет посылать нам на сервер. Мы остановимся на втором варианте, но у него есть ограничение: у вас на сайте обязательно должен быть установлен SSL-сертификат, чтобы все запросы проходили через безопасный протокол HTTPS. Самоподписанные и бесплатные сертификаты «Let’s Encrypt», которые поддерживает большинство хостингов, также подходят. Пример настройки самоподписанного сертификата из официальной документации Telegram.
Шаг 3: пишем код
Писать код бота будем на PHP, но чтобы не изобретать заново колесо, воспользуемся уже готовой и очень удобной библиотекой. Перво-наперво привязываем через метод SetWebhook бота к нашему файлу-обработчику. Сделать это можно при помощи библиотеки, но есть вариант быстрее и проще – это построить вот такую ссылку: https:// api. telegram. org/bot375466075:AAEARK0r2nXjB67JiB35JCXXhKEyT42Px8s/setWebhook?url=https:// yoursitehere .ru/directory/bot.php, где 375466075:AAEARK0r2nXjB67JiB35JCXXhKEyT42Px8s — это наш токен, https:// yousitehere. ru/directory/bot.php — ссылка на файл-обработчик на нашем сайте. Открыв в браузере эту ссылку, должен прийти JSON-ответ со значением «Webhook was set», что будет означать, что вебхук установлен, и теперь все запросы от пользователей будут присылаться по адресу файла-обработчика. Переходим к самому главному — обработке этих самых запросов и написанию функционала бота. Ниже представлен полный листинг файла-обработчика:
include('vendor/autoload.php'); //Подключаем библиотеку use TelegramBotApi; $telegram = new Api('375466075:AAEARK0r2nXjB67JiB35JCXXhKEyT42Px8s'); //Устанавливаем токен, полученный у BotFather $result = $telegram -> getWebhookUpdates(); //Передаем в переменную $result полную информацию о сообщении пользователя $text = $result["message"]["text"]; //Текст сообщения $chat_id = $result["message"]["chat"]["id"]; //Уникальный идентификатор пользователя $name = $result["message"]["from"]["username"]; //Юзернейм пользователя $keyboard = [["Последние статьи"],["Картинка"],["Гифка"]]; //Клавиатура if($text){ if ($text == "/start") { $reply = "Добро пожаловать в бота!"; $reply_markup = $telegram->replyKeyboardMarkup([ 'keyboard' => $keyboard, 'resize_keyboard' => true, 'one_time_keyboard' => false ]); $telegram->sendMessage([ 'chat_id' => $chat_id, 'text' => $reply, 'reply_markup' => $reply_markup ]); }elseif ($text == "/help") { $reply = "Информация с помощью."; $telegram->sendMessage([ 'chat_id' => $chat_id, 'text' => $reply ]); }elseif ($text == "Картинка") { $url = "https://68.media.tumblr.com/6d830b4f2c455f9cb6cd4ebe5011d2b8/tumblr_oj49kevkUz1v4bb1no1_500.jpg"; $telegram->sendPhoto([ 'chat_id' => $chat_id, 'photo' => $url, 'caption' => "Описание." ]); }elseif ($text == "Гифка") { $url = "https://68.media.tumblr.com/bd08f2aa85a6eb8b7a9f4b07c0807d71/tumblr_ofrc94sG1e1sjmm5ao1_400.gif"; $telegram->sendDocument([ 'chat_id' => $chat_id, 'document' => $url, 'caption' => "Описание." ]); }elseif ($text == "Последние статьи") { $html=simplexml_load_file('http://netology.ru/blog/rss.xml'); foreach ($html->channel->item as $item) { $reply .= "xE2x9ExA1 ".$item->title." (link."'>читать)n"; } $telegram->sendMessage([ 'chat_id' => $chat_id, 'parse_mode' => 'HTML', 'disable_web_page_preview' => true, 'text' => $reply ]); }else{ $reply = "По запросу "".$text."" ничего не найдено."; $telegram->sendMessage([ 'chat_id' => $chat_id, 'parse_mode'=> 'HTML', 'text' => $reply ]); } }else{ $telegram->sendMessage([ 'chat_id' => $chat_id, 'text' => "Отправьте текстовое сообщение." ]); }
Разберем всё по порядку. 1. Сначала мы подключаем скачанную библиотеку, указав путь (лучше полный) до файла автозагрузчика.
include('vendor/autoload.php'); //Подключаем библиотеку use TelegramBotApi;
2. Создаем экземпляр класса в переменной $telegram и передаем в него наш токен. В переменной $result получаем информацию о сообщении, которое пришлет нам Telegram.
$telegram = new Api('375466075:AAEARK0r2nXjB67JiB35JCXXhKEyT42Px8s'); //Устанавливаем токен, полученный у BotFather $result = $telegram -> getWebhookUpdates(); //Передаем в переменную $result полную информацию о сообщении пользователя
3. Затем определяем главные переменные: текстовое сообщение, уникальный идентификатор пользователя и его юзернейм. Если предстоит работа с БД, то не забывайте про фильтрацию (или лучше используйте PDO).
$text = $result["message"]["text"]; //Текст сообщения $chat_id = $result["message"]["chat"]["id"]; //Уникальный идентификатор пользователя $name = $result["message"]["from"]["username"]; //Юзернейм пользователя
4. Создаем нашу клавиатуру, состоящую из трех кнопок.
$keyboard = [["Последние статьи"],["Картинка"],["Гифка"]]; //Клавиатура
5. Теперь, когда мы обозначили все переменные, можно перейти к обработке полученного сообщения. Для этого можно использовать конструкцию switch-case либо if-else. Так как принципиальной разницы между ними нет, остановимся на втором варианте, как наиболее привычном. В самом начале проверяем, заполнена ли переменная $text и является ли сообщение пользователя текстовым.
if($text){ … //код ... }else{ $telegram->sendMessage([ 'chat_id' => $chat_id, 'text' => "Отправьте текстовое сообщение." ]); }
Если нет, то отправляем пользователю с помощью метода sendMessage сообщение с просьбой ввести текстовое сообщение. 6. Рассмотрим вариант, когда пользователь прислал сообщение с командами /start или /help
if ($text == "/start") { $reply = "Добро пожаловать в бота!"; $reply_markup = $telegram->replyKeyboardMarkup([ 'keyboard' => $keyboard, 'resize_keyboard' => true, 'one_time_keyboard' => false ]); $telegram->sendMessage([ 'chat_id' => $chat_id, 'text' => $reply, 'reply_markup' => $reply_markup ]); }elseif ($text == "/help") { $reply = "Информация с помощью."; $reply_markup = $telegram->replyKeyboardMarkup([ 'keyboard' => $keyboard, 'resize_keyboard' => true, 'one_time_keyboard' => false ]); $telegram->sendMessage([ 'chat_id' => $chat_id, 'text' => $reply, 'reply_markup' => $reply_markup ]); }
В этом случае помимо текста из переменной $reply будет подгружаться клавиатура, состоящая из трёх кнопок: «Последние статьи», «Картинка» и «Гифка». Реализуется это с помощью метода replyKeyboardMarkup, параметрами которого являются:
- ‘keyboard’ => $keyboard, передаем нашу клавиатуру
- ‘resize_keyboard’ => true, клавиатура будет сжата в размерах.
- ‘one_time_keyboard’ => false, клавиатура не исчезнет после нажатия на какую-то кнопку.
7. После появления клавиатуры пользователь явно захочет попробовать потыкать на расположенные на ней кнопки, и вот что у нас «под капотом» в этом случае:
}elseif ($text == "Картинка") { $url = "https://68.media.tumblr.com/6d830b4f2c455f9cb6cd4ebe5011d2b8/tumblr_oj49kevkUz1v4bb1no1_500.jpg"; $telegram->sendPhoto([ 'chat_id' => $chat_id, 'photo' => $url, 'caption' => "Описание." ]); }elseif ($text == "Гифка") { $url = "https://68.media.tumblr.com/bd08f2aa85a6eb8b7a9f4b07c0807d71/tumblr_ofrc94sG1e1sjmm5ao1_400.gif"; $telegram->sendDocument([ 'chat_id' => $chat_id, 'document' => $url, 'caption' => "Описание." ]); }elseif ($text == "Последние статьи") { $html=simplexml_load_file('http://netology.ru/blog/rss.xml'); foreach ($html->channel->item as $item) { $reply .= "xE2x9ExA1 ".$item->title." (link."'>читать)n"; } $telegram->sendMessage([ 'chat_id' => $chat_id, 'parse_mode' => 'HTML', 'disable_web_page_preview' => true, 'text' => $reply ]); }
8. Для отправки картинки используется метод sendPhoto, для отправки гифки – sendDocument. В обоих случаях Telegram позволяет передавать прямую ссылку на файл, что безусловно очень удобно, но не так быстро, как если бы мы передавали file_id уже отправленной на сервера Telegram картинки или гифки. 9. Для получения последних статей используется простой парсинг RSS ленты Нетологии при помощи встроенной в PHP функции simplexml_load_file. В параметрах метода sendMessage можно заметить два новых значения: 1) 'parse_mode' => 'HTML'
, чтобы в сообщение можно было вставить HTML-теги
, , ,
или
2)
'disable_web_page_preview' => true
чтобы к сообщению со ссылкой не подгружалось превью. 10. В качестве смайла (стрелка вправо) используются символы xE2x9ExA1. Список всех смайлов в таком виде можно найти на специальном сайте. 11. После того, как вы протестируете бота и будете уверены в его работоспособности, можно отправлять его на всеобщее обозрение. Благодаря удобному API, боты Telegram могут стать хорошей платформой для автоматизации рутинных действий, настройки уведомлений, удобному и быстрому получению информации и созданию игр. Бесплатными площадками для продвижения могут послужить каталоги ботов Telegram Bot Store, TeleChappy или 50bots. А анализировать активность пользователей можно с помощью бесплатного инструмента для аналитики ботов от Яндекса — Botan.
От редакции
PHP — один из самых популярных языков программирования. Его легко изучать, с ним легко работать, у него мощное сообщество. 5 мая «Нетология» запускает курс «PHP/SQL: back-end разработка и базы данных», где ведущие программисты расскажут об управляющих конструкциях, циклах, функциях, о строках и массивах. Вы узнаете все про реляционные базы данных и язык запросов SQL, научитесь устанавливать и настраивать веб-сервер nginx и php, управлять базами данных различной сложности. Ждем вас!
Бот для телеграм на php.
На данный момент telegram развивается очень активно и является одним из популярных мессенджеров, охватывающих огромную аудиторию. Одной из особенностей данного приложения является наличие ботов, выполняющих различные функции. К таким функциям относятся онлайн-чаты, информирование пользователя (например, о новой записи в блоге), различные игры или помощь пользователю в различных аспектах.
В этой статье будет рассказано о том, как создать самого простого бота на языке php.
А теперь перейдем подробнее к пошаговой инструкции, рассказывающей как создать бот для телеграм на php.
0. Подготовка
Самым первым делом необходимо отметить, что Телеграм позволяет размещать ботов только на доменах, защищенных сертификатом SSL. Если у вас еще нет такого сертификата, вам необходимо его приобрести. Возможно, вам также понадобится хостинг для размещения файлов бота. Для этих целей прекрасно подойдет хостинг от компании Бегет, предоставляющий бесплатные сертификаты. О его преимуществах подробно я расписал в этой статье.
1. Регистрация бота
Первым пунктом, с которого начинается разработка бота — это регистрация его у специального корневого бота — @BotFather. Находим его в списке, жмем кнопку старт, бот приветствует нас, выводя список всех доступных команд.
Вводим команду /newbot
, далее вписываем имя для своего бота и его username — адрес бота для доступа других пользователей. После этого вашему боту будет присвоен уникальный токен, запишите и сохраните его, он еще пригодится. Обратите внимание Username вашего бота должен заканчиваться символами bot или _bot
Все! Ваш бот создан и зарегистрирован в системе. Теперь можно настроить его описание, задать картинку профиля и другое в разделе Edit Bots.
2. Установка библиотеки
Для разработки бота воспользуемся готовой библиотекой telegram-bot-sdk
. Установим ее с помощью composer
:
composer require irazasyed/telegram-bot-sdk ^2.0
Здесь же можно настроить соединение по ftp с вашим сервером, где находится сайт из пункта 0. Я разместил своего бота в папке /bot/ своего сайта, имейте это ввиду при дальнейшем изучении статьи. Теперь настраиваем webhook для того, чтобы дать понять телеграму, где брать информацию о теле бота. Самый простой способ — веб запрос:
https://api.telegram.org/botздесь_вставляем_токен/setWebhook?url=https://anton-mironov.ru/bot/index.php
Соответственно вписываем свои данные на месте сайта и токена и отправляем данный запрос через любой браузер. В ответ должен прийти JSON файл:
{"ok":true,"result":true,"description":"Webhook was set"}
Это означает, что webhook установлен, и все запросы приходящие к боту будут обрабатываться файлом — обработчиком, указанным в параметре url.
3. Написание кода
Наш файл index.php
в папке /bot/
является главным обработчиком запросов бота. Рассмотрим его возможный вид: 1) Прежде всего подключаем библиотеку и инициализируем бота при помощи токена
include('vendor/autoload.php'); use TelegramBotApi; $telegram = new Api('здесь_вставляем_токен');
2) Далее получаем информацию о полученном от пользователя сообщении методом getWebhookUpdates()
:
$message = $telegram->getWebhookUpdates()->getMessage();
В объекте $message будет содержаться вся информация о присланном сообщении и пользователе, который его прислал. Ниже описаны основные методы данного объекта. Подробную информацию можно найти в документации.
getMessageId() // уникальное id сообщения getFrom() // Информация о пользователе getDate() // Дата сообщения getChat() // Информация о чате, из которого отправлено сообщение getText() // Если прислан текстовый файл, текст сообщения getAudio() // Если прислан аудиофайл, информация о нем getDocument() // Если прислан документ, информация о нем getPhoto() // Если прислано фото, информация о нем getSticker() // Если прислан стикер, информация о нем getVideo() // Если прислано видео, информация о нем
Основные методы
Возвращает объект User, содержащий следующие методы:
getId() // id пользователя getFirstName() // Имя пользователя getLastName() // Фамилия пользователя getUsername() // Username пользователя
методы getFrom()
Возвращает объект Chat:
getId() // id чата, из которого пришло сообщение getType() // Тип чата - 'private', 'group', 'supergroup' или 'channel' getTitle() // Заголовок чата (если групповой или канал) getUsername() // Username (если приватный чат)
методы getChat()
Теперь мы можем проанализировать, что прислал нам пользователь
$text = $message->getText(); // Текст присланный пользователем $chat = $message->getChat()->getId(); // id чата с пользователем
3) Теперь мы можем определить какой тип сообщения прислал пользователь. Для простоты, ограничим возможность присылать нам только текстовые сообщения:
if(!empty($text)){ } else{ $telegram->sendMessage([ 'chat_id' => $chat, 'text' => 'Для работы с ботом пришлите текстовое сообщение!' ]); }
Все дальнейшие команды будем записывать внутри блока if()
.
4) Каждый бот должен обязательно отвечать на две команды — /start
и /help.
Это — обязательное условие. Все остальные команды необязательны и могут иметь произвольное название. Опишем эти команды:
switch($text){ case '/start': $message = 'Вас приветствует бот anton-mironov.ru! Для вывода списка доступных команд введите /help'; $telegram->sendMessage([ 'chat_id' => $chat, 'text' => $message ]); break; case '/help': $message = 'Список доступных команд: /start - начало работы с ботом /help - выводит данный список'; $telegram->sendMessage([ 'chat_id' => $chat, 'text' => $message ]); break; default: $telegram->sendMessage([ 'chat_id' => $chat, 'text' => 'Команда не распознана. Для помощи введите /help' ]); break; }
5) Добавим команду, позволяющую получать последние записи из RSS ленты сайта (не забываем добавлять команду в /help !). Обычно RSS лента представляет собой простой xml файл. На моем сайте вы можете увидеть его, открыв ссылку https://anton-mironov.ru/feed/.
Для чтения данного файла на PHP воспользуемся функцией simplexml_load_file, которая превращает xml файл в объект:
case '/rss': $url = 'https://anton-mironov.ru/feed/'; $rss = simplexml_load_file($url); $message = ''; foreach ($rss->channel->item as $item) { $message .= "xE2x9Cx85 " . date('d.m.Y', strtotime($item->pubDate)) . " " . $item->title . " link."'>читатьn"; } $telegram->sendMessage([ 'chat_id' => $chat, 'text' => $message,'parse_mode' => 'HTML', 'disable_web_page_preview' => true ]); break;
Чтение RSS ленты
Обратите внимание, в строке 6 символы xE2x9Cx85
обозначают смайлик с галочкой в байтовом представлении. Полный список таких смайликов.
В строке 8, в методе sendMessage мы используем дополнительные опции: 'parse_mode' => 'HTML'
позволяет передавать внутри сообщения html теги (в данном случае ), а disable_web_page_preview
указывает, что не надо загружать картинку-превью.
Результат работы после выполнения данных операций
В данной статье мы рассмотрели как создается самый простой бот для телеграм на php. В следующей статье я расскажу как использовать отдельные сложные команды и как работать с отличным от текста содержимым.
Доброго времени суток! В данной статье я покажу Вам как просто можно создать Telegram-бота на PHP.
В качестве площадки для хостинга нашего бота мы будем использовать платформу Heroku, о которой я уже ранее писал статью. В качестве библиотеки для разработки бота возьмем вот эту irazasyed/telegram-bot-sdk. Но кроме нам также понадобится библиотека doctrine/annotations для удобной организации команд на которые будет реагировать бот.
Для начала нам нужно будет получить токен для бота. Для этого надо непосредственно в клиенте Telegram перейти к боту @BotFather, где набрав команду /newbot следовать инструкциям. После получения токена нам необходимо будем настроить так называемый веб-хук – URL, на который будут приходить команды, введенные пользователем в чате с ботом. Внизу ссылка в которой нужно заменить <%ТОКЕН_БОТА%> на токен Вашего бота, после чего для активации адреса нужно будет открыть его в браузере. Обратите внимание, что Telegram требует, чтобы адрес веб-хука был c настроенным SSL. К счастью, если бот размещается на Heroku, то все уже настроено и работает.
Вот сама ссылка:
https://api.bot.org/bot<%ТОКЕН_БОТА%>/setWebhook?url=https://myrusakovbot21.herokuapp.com/index.php
Все готово, теперь приступим к написанию кода – вот наш файл composer.json:
{ "name": "myrusakov/php-bot-webhook", "type": "project", "require": { "irazasyed/telegram-bot-sdk": "^2.0", "doctrine/annotations": "^1.13" }, "autoload": { "psr-4": { "": "src/" } } }
Файлы с классами будут лежать в папке src. Вот базовая струтура директорий проекта:
. ├── vendor ├── src │ ├── MainCommand.php │ └── CommandsCollector.php ├── index.php ├── composer.lock ├── composer.json └── .gitignore
Файл index.php
require __DIR__ . '/vendor/autoload.php'; use TelegramBotApi; // в класс передаем наш токен $bot = new Api('%ТОКЕН БОТА%'); function BotApp(Api $bot, array $commands = []) { // получаем обновленные данные $result = $bot->getWebhookUpdates(); $text = $result["message"]["text"]; //Текст сообщения $chat_id = $result["message"]["chat"]["id"]; //Идентификатор пользователя $name = $result["message"]["from"]["username"]; //Имя пользователя // если есть текстовая команда if ($text) { // пробегаемся по массиву команд foreach ($commands as $commandText => $commandAction) { // смотрим, есть ли введенная текстовая команда в списке доступных if ($commandText === $text) { // есть такая команда - получаем ее обработчики - название класса и метода [$class, $method] = $commandAction; // вызываем обработчик $obj = new $class(); $obj->$method($bot, $result); return; } } // если команда не распознана срабатывает обработчик по умолчанию [$class, $method] = $commands['fallback']; $obj = new $class(); $obj->$method($bot, $result); } else { $bot->sendMessage(['chat_id' => $chat_id, 'parse_mode' => 'HTML', 'text' => "Привет $name! Я понимаю только текст."]); } } // массив с классами команд - их может быть столько, сколько необходимо Вам $actions = [MainCommand::class]; // проходится по классу и собирает команды, на которые срабатывает обработчик $collector = new CommandsCollector(); // массива команд и соответствующих им обработчиков $commands = []; foreach($actions as $action) { $classCommands = $collector->collect($action); $commands = array_merge($commands, $classCommands); } // запускаем бота BotApp($bot, $commands);
Сопоставление команд с обработчиком происходит с помощью аннотаций. Для этого как раз и нужен пакет doctrine/annotations
Класс, который содержит обработчики команд
use TelegramBotApi; use TelegramBotObjectsUpdate as ObjectsUpdate; class MainCommand { /** * @Command(text="привет") */ public function welcome(Api $bot, ObjectsUpdate $result) { $chat_id = $result["message"]["chat"]["id"]; $reply = "Информация с помощью."; $bot->sendMessage(['chat_id' => $chat_id, 'text' => $reply]); } /** * @Command(text="вакансии") */ public function vacanciesFeed(Api $bot, ObjectsUpdate $result) { $reply = ''; $url = 'https://career.habr.com/vacancies/rss?currency=RUR&sort=relevance&type=all'; $chat_id = $result["message"]["chat"]["id"]; $rss = simplexml_load_file($url); foreach ($rss->channel->item as $item) { $reply .= "xE2x9ExA1 " . $item->title . " (link . "'>читать)n"; } $bot->sendMessage(['chat_id' => $chat_id, 'parse_mode' => 'HTML', 'disable_web_page_preview' => false, 'text' => $reply]); } /** * @Command(text="fallback") */ public function fallback(Api $bot, ObjectsUpdate $result) { $text = $result["message"]["text"]; $chat_id = $result["message"]["chat"]["id"]; $reply = "По запросу "$text" ничего не найдено."; $bot->sendMessage(['chat_id' => $chat_id, 'parse_mode' => 'HTML', 'text' => $reply]); } }
Формированием команд и их обработчиков занимается класс CommandsCollector:
use DoctrineCommonAnnotationsAnnotationReader; /** * @Annotation * @Target({"CLASS","METHOD"}) */ final class Command { public $text; } class CommandsCollector { /** * Выбирает из класса все публичные методы, затем вытаскивает * из них текст команд, на которые они должны срабатывать и формирует * массив вида: * * [ * 'привет' => ['MainCommand', 'welcome'] * ] * * Т.е. на введенную пользователем команду будет срабатывать метод welcome класса MainCommand */ public function collect($class) { $reader = new AnnotationReader(); $refClass = new ReflectionClass($class); $refMethods = $refClass -> getMethods(ReflectionMethod::IS_PUBLIC); $commands = []; foreach($refMethods as $method) { $command = $reader->getMethodAnnotation($method, Command::class); if($command) { $commands[$command->text] = [$method->class, $method->name]; } } return $commands; } }
После того, как код написан – нужно его разместить на платформе Heroku. Для этого нужно выполнить следующие команды в папке проекта (предполагается, что консольная утилита heroku уже установлена в системе и доступна в консоли как команда heroku):
$ cd myrusakov-telegram-bot # переходим в папку проекта - в моем случае она называется так $ heroku login # вы должны быть зарегистрированы на Heroku и приложение myrusakovbot21 (в моем случае оно так называется) должно создано $ heroku git:remote -a myrusakovbot21 # связываем наше приложение на компьютере с удаленным приложением на сервере $ git add . $ git commit -am "Initial commit" $ git push heroku main
Таким образом, если не возникнет ошибок в ходе размещения бота на Heroku, то Ваш бот успешно размещен на сервере и готов принимать команды. Если же, после всего сделанного бот не запускается, то в папке приложения можно выполнить команду heroku logs -a myrusakovbot21, которая выведет ошибки, возникшие при обработке команд.
- Создано 16.12.2021 08:01:42
- Михаил Русаков
Возможно, кто-то о нас слышал. Мы — популярное интернет-издание по программированию. Мы не только пишем статьи на тему современной разработки, но и ищем способы, как держать аудиторию в постоянной заинтересованности к тому, что мы делаем.
17 132 просмотров
Однажды мы решили, что нам нужно сделать бота. Бот должен был давать логические задачи в групповом чате в Telegram «Развиваем логику», закреплять их на то время, пока её решают, не давать новую, пока ответ кого-то из участников не наберёт десять (потом снизили до пяти) плюсов, а также вывешивать топ наиболее успешных решателей задачек.
Идея не приходит одна
Задача довольно простая, подумали мы, особенно учитывая волну популярности ботов и количество материала в сети по этой теме. Однако материала не очень качественного: кто-то не использует композер, а кто-то даже пишет весь код в одном файле-обработчике, полагая, очевидно, будто количество файлов влияет на скорость работы кода.
Сначала бот должен был просто давать задачи, причём их можно было пропускать, постоянно вызывая одну и ту же команду. Это первая проблема, которую мы стали решать. Выход нашёлся почти сразу: сохранение состояния бота (а точнее, текущей команды) в базе. Другими словами, получая команду /get, бот даёт задачу и сохраняет команду в базе.
В следующий раз, перед тем как отреагировать на сообщения в чате, бот сравнивает команду, которую получил прямо сейчас, с последней командой в базе. Если они совпадают, бот никак не реагирует и вдобавок удаляет команду пользователя, чтобы она не мусорила чат. Согласитесь, это выглядит как хорошее решение.
После запуска бота в работу мы обнаружили ещё одну проблему: хэштеги не очень удобны для поиска. Ведь задача может уйти далеко наверх, а листать до неё или забивать в поиске — достаточно неинтересное занятие, чтобы стравливать его пользователю. Поэтому мы решили сразу же закреплять задачу, которую даёт бот. Причём закрепляет как раз он сам, а не мы (и да, делает это без уведомлений).
Ну и напоследок ещё одна проблема, которую мы с успехом решили. Некоторые задачи предполагали не точное решение, а наиболее подходящее. Как в таком случае должен поступить админ и чей ответ выбрать?
Поэтому мы подумали, что коллективное решение намного справедливее решения одного человека, и дали пользователям выбирать самим, помечая плюсом сообщение, с которым они согласны.
Какое решение быстрее наберёт пять плюсов, то и выбирается ботом как лучшее. Это хорошее решение не только с точки зрения справедливости, но и автоматизации: нам больше не придётся следить за чатом и читать все ответы.
Подготовка к созданию
Дело осталось за малым: написать бота. Мы ограничились Composer, библиотекой telegram-bot-sdk и symfony/dotenv для парсинга .env-файла. Весь код приводить не буду: он большой. Посмотреть на то, что получилось, можно по ссылке.
Composer — это стандарт при разработке на PHP. Он позволяет скачивать сторонние библиотеки на проект и предоставляет удобный механизм по автозагрузке классов. Вся работа с Composer происходит через консоль и в файле composer.json. Обычно он выглядит так:
Если вы разрабатываете не на фреймворке, то во множестве случаев создаёте composer.json самостоятельно и заполняете секцию autoload, которая загружает ваши классы по правилу psr-4, о котором можно найти много информации в интернете.
Далее вы выполняете команду composer install, и автозагрузка начинает работать. Также не забудьте про библиотеки, которые нужно установить, для этого выполните в терминале в папке с проектом следующие две команды:
И тогда ваш composer.json станет похож на тот, что я показывал выше.
Mr. Bot
Сразу же продемонстрирую готовую структуру проекта:
Файл app.php является точкой входа в наше приложение, на который мы вешаем веб-хук (это значит, что бот не будет постоянно опрашивать сервер на наличие обновлений; он их будет получать только тогда, когда они будут). Вот как он выглядит:
Ничего необычного, создаём объекты всех нужных нам классов и делаем проверку на то, в каком чате мы находимся — приватном или супергруппе. Да, разделить код на достаточно независимые части является хорошей практикой. К тому же легче рефакторить и добавлять код, когда проблемы того потребуют.
Мы любим чистый код, поэтому настройки храним в файле .env, что позволит любому пользователю ввести свои, и бот будет работать (разумеется, после создания всех нужных таблиц).
Однако получить переменные окружения из .env можно только в том случае, если вы спарсите этот файл. Делается это крайне просто:
Это тот самый файл, который мы включили в app.php. Там мы просто по ключу достаём нужные нам настройки:
В папках Admin и User хранятся классы по работе как с приватным чатом, так и с супергруппой. Это не только удобно, как я говорил выше, но и даёт возможность отключить деятельность бота в одном из режимов, если мы соберёмся добавлять в него функциональность.
Больше томить вас кодом не буду, повторю только, что теперь он в свободном доступе.
Так мы решили сразу несколько проблем и написали достаточно неплохой, легко поддерживаемый код для бота, который по-прежнему в добром здравии и надёжно выполняет свои функции.
Шукюров Заур, разработчик @KinomanBot и @GaidarForum_bot, написал руководство по созданию простого чат-бота.
24 июня 2015 года разработчики Telegram открыли платформу для создания ботов (программ, которые выполняют определенные действия по заданному алгоритму). За полтора года работы платформы набралось много интересных чат-ботов, решающих множество проблем и позволяющих с пользой провести время в мессенджере.
Шаг 1: регистрация бота у @BotFather
Прежде чем начать писать код, нового бота нужно зарегистрировать у «папы всех ботов» — @BotFather, чтобы получить токен (ключ) для работы с Telegram API. Регистрация проходит в 5 простых этапов:
- Открываете чат с @BotFather.
- Вводите или выбираете из списка команду /newbot.
- Отправляете желаемое название для бота.
- Пишете юзернейм бота, по которому его будут находить через поиск. Обязательно на конце вашего юзернейма должно быть слово «bot» или «_bot». Например, NetologyRSSbot.
- По желанию можно сразу настроить полное или краткое описание, список команд и аватарку.
Результаты
11. После того, как вы протестируете бота и будете уверены в его работоспособности, можно отправлять его на всеобщее обозрение.
Благодаря удобному API, боты Telegram могут стать хорошей платформой для автоматизации рутинных действий, настройки уведомлений, удобному и быстрому получению информации и созданию игр. Бесплатными площадками для продвижения могут послужить каталоги ботов Telegram Bot Store, TeleChappy или 50bots. А анализировать активность пользователей можно с помощью бесплатного инструмента для аналитики ботов от Яндекса — Botan.
От редакции
PHP — один из самых популярных языков программирования. Его легко изучать, с ним легко работать, у него мощное сообщество. 5 мая «Нетология» запускает курс «PHP/SQL: back-end разработка и базы данных», где ведущие программисты расскажут об управляющих конструкциях, циклах, функциях, о строках и массивах. Вы узнаете все про реляционные базы данных и язык запросов SQL, научитесь устанавливать и настраивать веб-сервер nginx и php, управлять базами данных различной сложности. Ждем вас!
Оцените статью
Средняя оценка 3.3 / 5. Всего проголосовало 7
Темы: программирование
ли со статьей или есть что добавить?