Небольшая история написания бота для Telegram


Вступление

Когда Telegram объявили о запуске API для написания ботов я создал себе "чтобы было" бота @vodmalbot. К тому моменту я уже довольно активно пользовался Telegram: был подписан на массу разных каналов. Поэтому возможность написать своего бота, например, чтобы просто форвардить в него ссылки, а он бы добавлял их в Pocket, ну или чего-то подобного мне была интересна. 

Параллельно с этим мы на коленке за один вечер написали бота для проекта надо которым работаем. Он был очень простой строчек на 100. Код базировался на примере с самого сайта Telegram. Ничего никуда не складывалось и нигде не хранилось. Он поддерживал несколько команд, выводил текущий курс по тикеру инструмента с большинства бирж мира. 

Написание бота сводилось к манипулированию strpos. И было понятно что нет никакого смысла писать бота с нуля т.к. это настолько рутинный набор команд и что обязательно должен быть или сервис или библиотека которую нужно дать возможность просто расширять своими командами. 

WordPress

Прошло время, мой бот так и оставался просто зарезервированным именем. Я поднял себе блог на WordPress и наткнулся на плагин, который позволял создать своего бота в Telegram.

Подключается очень-очень просто. В админке появляется список пользователей чата, можно им написать. Можно создавать свои команды. Однако именно это мне не понравилось. Создание команды сдеално поверх написания постов с особым типом, никакой ясности нет что именно и как туда нужно вбивать. В общем можно сказать что я не осилил и снес этот плагин. 

ChatFuel.com

Следующей попыткой стал сервис ChatFuel.com Он показался очень интересным. Поддерживает два вида ботов: Telegram и Facebook Messenger. Красивый и удобный пользовательский интерфейс. Однако оказалось что боты все-таки разные, нельзя создать через их UI набор правил и чтобы они действовали одинаково и для Telegram и для Facebook Messenger. И вообще оказалось что для Telegram бота нет web-интефейса, а работа и настройка ведется через общение со своим же ботом в режиме администратора. Концептуально, конечно… И я был бы готов с этим мириться, но оказалось что я не могу создать свой программный обработчик пришедшего сообщения. 

php-telegram-bot

Так что в итоге я обратился к Google и нашел несколько библиотек на nodejs и php которые представляют из себя некие фреймворки для написания чатбота. По комментариям и дате последнего обновления я остановился на https://github.com/akalongman/php-telegram-bot/

Установил его с помощью composer на свой сервер vorobyev.name, по примеру сделал hook.php и set.php. Без проблем управление от ChatFuel.com перешло к этой библиотеке. Создал тестовую команду копированием одного из файлов — она сработала. А дальше пришлось убить какое-то время чтобы разобраться каким образом перехватывать обычные сообщения, а не команды. Пишу "123" в чат и хочу чтобы это обработал мой код, а не стандартный.

Нашел что можно сделать свой обработчик команды Genericmessage. Сделал. Не сработало. Начал копаться в коде. Нашел каким образом загружаются файлы с командами. Выяснил что у загруженных команд приоритет выше т.е. они переопределяют дефолтные идущие с библиотекой, но все равно не заработало. 

В итоге после более тщательного изучения кода оказалось, что все дело в том, что я свою команду не расположил в namespace "Longman\TelegramBot\Commands\SystemCommands", а именно этим способом и происходит выбор подходящей команды для обработки сообщения. Крайне неочевидное решение, особенно в свете PSR-4! Я кладу файлики в кастомный каталог, на имена файлов итак накладываются ограничения типа Command должно быть в конце имени. Делать в этом каталоге  иерархию, да еще и от "Longman\TelegramBot" — не укладывалось в моих представлениях об архитектуре. Но в итоге после того как я указал принадлежность моего класса к этому namespace — все заработало. 

Оставил Issue на github для проекта https://github.com/akalongman/php-telegram-bot/issues/323

Теперь останется написать код, который реализует всю необходимую мне логику.

Pocket

Начнем с интеграции с этим сервисом. К сожалению в Telegram нет удобного сохранения в Pocket ссылок, как например это сделано в Tweetbot клиенте для Twitter. Но зато удобно можно делиться ссылкой с любым из контактов в том числе с ботом через пересылку. 

Берем библиотеки:

И очень-очень быстро получаем обработчик, который находит в присланном сообщении ссылки и добавляет их в мой Pocket.

Хотите чтобы я что-то прочитал? Просто пошлите это моему боту в Telegram. 🙂 

TODO: В ответ я пошлю одну случайную статью, которую я прочитал и пометил звездочкой в Pocket. 

TODO: После прочтения этой статьи вам придет ответ от моего бота о том что я ее прочитал и понравилась ли она мне. 😉 

… продолжение следует. 

Полезные ссылки:

… продолжение следует. 

 

Нашли ошибку? Выделите и нажмите Ctrl+Enter.

Оставьте комментарий

Войти с помощью: 

Ваш e-mail не будет опубликован. Обязательные поля помечены *