# Вступление
Когда 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
Теперь останется написать код, который реализует всю необходимую мне логику.
Location
См. отдельный пост про эту команду Помогающий удаленно работать бот для Телеграм.
Начнем с интеграции с этим сервисом. К сожалению в Telegram нет удобного сохранения в Pocket ссылок, как например это сделано в Tweetbot клиенте для Twitter. Но зато удобно можно делиться ссылкой с любым из контактов в том числе с ботом через пересылку.
Берем библиотеки:
https://github.com/jmrware/LinkifyURL/blob/master/linkify.php — регулярное выражение для выдирания url из текста
https://github.com/djchen/pocket-api-php — API для работы с Pocket
И очень-очень быстро получаем обработчик, который находит в присланном сообщении ссылки и добавляет их в мой Pocket.
Хотите чтобы я что-то прочитал? Просто пошлите это моему боту в Telegram. 🙂
TODO: В ответ я пошлю одну случайную статью, которую я прочитал и пометил звездочкой в Pocket.
TODO: После прочтения этой статьи вам придет ответ от моего бота о том что я ее прочитал и понравилась ли она мне. 😉
… продолжение следует.
Полезные ссылки:
… продолжение следует.
PS: См. пост Косяки мессенджера Telegram для разработчика ботов