Вчера мне пришёл в голову, как мне показалось, очень забавный вопрос, а можно ли превратить Телеграм в REPL, то есть, сделать так, чтобы можно было исполнять код прямо в чате? (Спойлер: да)
Чтобы решить эту задачу мне нужно:
1. Получить сообщение, которое я посылаю, чтобы исполнить код содержащийся в его тексте
2. Исполнить сам код
3. Отправить результат кода обратно в чат
Архитектура будет следующая: я хочу получать вебхуки об исходящих сообщениях в Телеграме на мой сервер, который будет исполнять код и отправлять результат.
Получение текста сообщений
Как получать уведомления об исходящих сообщениях в Телеграме? Для этого я буду пользоваться сервисом TaaS (https://www.t-a-a-s.ru). Таас использует библиотеку TDLib, которая разрабатывается самим Телеграмом, и она позволяет по сути создавать свой собственный клиент, открывая доступ ко множеству функций. Её довольно трудно устанавливать и использовать, но Таас является очень удобной оболочкой и делает использование максимально простым. С помощью него я могу подписаться на вебхуки по исходящим (моим собственным) сообщениям.
Я захожу в Таас, нажимаю кнопку New Client, создаю клиент для своего номера телефона, и создаю подписку на вебхук с помощью метода "Create Subscription", который будет отправлять запросы на мой сервер при каждом новом исходящем сообщении. В поле hookUrl я ввожу адрес своего сервера, trigger - outgoing_message, и api_key моего клиента.
Исполнение кода и отправка обратно в чат
Для исполнения кода я быстро создаю сервер на Heroku. Я пишу на руби, поэтому сделаю сервер на Rails. Мне нужно создать только один action для контроллера, который будет выполнять код из сообщения и отправляет его обратно в чат. Так же я сделаю дополнительный метод tglib который я могу вызывать из кода для дополнительной отправки сообщений в чат, из, скажем, цикла.
Вот собственно и всё! По сути, таким образом вы можете создать собственный клиент Телеграма, который работает одновременно с вашим обычным, но выполняет весьма необычные функции.