Telegram bot пример — Написание простейших ботов для Telegram на JavaScript и Python

Как всем уже давно известно, в популярном клиенте для обмена мгновенными сообщениями Telegram появилась возможность создавать специальных ботов, которые могут оказаться весьма полезными, будучи добавленными в групповые чаты. Боты могут показывать участникам конференции различную полезную информацию, будь то последние новости какого-либо интересного сайта, погоду или курс валют. Функциональность программ для ботов практически не ограничена, например, можно реализовать бота, который будет отправлять в приватный или групповой чат фотографию с подключенной к компьютеру Web-камеры или мониторить температуру процессора на сервере. К примеру, запустив программу бота на домашнем компьютере, можно будет следить за какими-нибудь его показателями удалённо, просто отправляя команды боту с любого устройства, на котором установлен клиент Telegram. Однако, существует несколько ограничений, которые реализованы на уровне Telegram Bot API:

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

Это сделано для того, чтобы усложнить жизнь различным мошенникам и спаммерам и предотвратить возможность неконтролируемого флуда множества ботов в чатах. Создавая программу, всегда нужно помнить об этих ограничениях.

Для сообщества любителей мобильных гаджетов от Motorola — MotoFan.Ru существует весьма активная конференция в Telegram, участником которой я также являюсь. Мной было замечено, что для того, чтобы отметить значимое событие, произошедшее в течении дня, или какую-нибудь важную информацию, пользователи часто прибегают к использованию тега #digest. Подобным тегом отмечаются сообщения, которые по мнению участников конференции необходимо добавить в сводку текущий событий. При этом посетители группового чата, которые появляются в конференции достаточно редко, могут не читать огромное количество оставленных ранее сообщений, а выделить с помощью тега #digest только основную информацию. Но для этого им нужно воспользоваться поиском тега по сообщениям и попрыгать по листингу чата, что достаточно неудобно. Поэтому возникла идея создания дайджест-бота, который будет накапливать и сохранять все сообщения участников конференции, отмеченные тегом #digest за какой-либо срок, например, за неделю, а потом выдавать их скопом по команде /digest в чат. Это весьма удобно, в отличие от ручного поиска необходимых сообщений.

Содержание:

1. Знакомьтесь, Гаечка :3 2. Подготовка окружения к созданию бота на JavaScript и Node.js 3. Создаём профиль бота с помощью @BotFather 4. Реализация простейшего Hello World!-бота на JavaScript 5. Реализация дайджест-бота на JavaScript 5.1. Обработчик тега #digest 5.2. Обработчик команды /digest 5.3. Функция deleteObsoleteDigestMessages() 5.4. Генерация ответа бота на команду /digest 5.5. Заключение по дайджест-боту 6. Реализация валютного бота на JavaScript 7. Реализация упрощённого дайджест-бота на Python 8. Реализация бота, отправляющего случайную цитату с bash.im, на JavaScript 9. Реализация JavaScript-ботов, работающих со стикерами, мультимедийными объектами и интерактивными кнопками 9.1. Бот, отправляющий в ответ на стикер свой стикер 9.2. Бот, отправляющий в ответ на команду мультимедийный объект в чат 9.3. Бот, работающий с интерактивными кнопками 10. Заключение, полезные ссылки и ресурсы

1. Знакомьтесь, Гаечка :3

Из идеи, описанной выше, родилась Гаечка, программа, реализующая функциональность простейшего дайджест-бота.

Позже Гаечке были добавлены некоторые другие возможности, которые часто были нужны участникам конференции MotoFan.Ru: например, демонстрация различных финансовых графиков, валютные котировки и курс драгоценных металлов по ЦБ РФ. Команда /digest стала понимать аргументы, например, /digest 2 выводит сводку событий за два дня, а /digest 7 за неделю. Но реализация этого функционала — это уже другая история, которая не будет затронута в рамках этой статьи. Поскольку исходный код бота был выложен под лицензией MIT, любой желающий может посмотреть на то как и каким образом работает программа и, кроме того, поучаствовать в её разработке. Ссылку на исходный код можно найти в конце статьи.

<< Перейти к содержанию

2. Подготовка окружения к созданию бота на JavaScript и Node.js

Благодаря тому, что команда разработчиков Telegram реализовала простой и хорошо документированный API для работы с ботами, привязки к различным языкам программирования и популярным современным технологиям не заставили себя ждать. Для реализации задуманной идеи я выбрал связку языка программирования JavaScript и фреймворка Node.js, поскольку для Node.js был доступен хорошо документированный пакет node-telegram-bot-api, являющийся абстракцией и удобной надстройкой над официальным Telegram Bot API. С языком программирования JavaScript я уже сталкивался и немного знаком с ним вкупе с технологией QtQuick/QML. Именно поэтому мной и был выбран Qt Creator в качестве IDE для разработки. Эта среда предоставляет базовую поддержку JavaScript, которую с лихвой хватило для удобной навигации по коду проекта. Кроме самого JavaScript’а меня прельстила простота установки необходимых зависимостей в Node.js с помощью специального менеджера пакетов, а также лёгкость разворачивания приложения на любом GNU/Linux-сервере. Реализация дайджест-бота на языке программирования Python отошла в «долгий ящик» и была написана лишь по просьбе одного из участников конференции, её можно будет посмотреть ниже. Выбор языка и технологии для имплементации вашего бота это дело вкуса, вы сами должны решить что для вас наиболее предпочтительно.

Итак, подготовим окружение, необходимое для запуска и написания бота. Предполагается, что вы работаете в любом deb-based дистрибутиве GNU/Linux и имеете навык работы с консолью. Пользователи дистрибутивов, отличных от deb-based могут самостоятельно найти аналоги устанавливаемых пакетов в своих репозиториях и инсталлировать их с помощью соответствующего системного пакетного менеджера. Пользователи MS Windows тоже могут произвести инсталляцию необходимых программ, но идеологически правильнее будет развернуть виртуальную машину с любым GNU/Linux дистрибутивом в специальной программе виртуализации, например, в бесплатном VMWare Player.

Установку Node.js и сопутствующего ему пакетного менеджера можно произвести следующими командами, введя их в терминале:

Затем, необходимо создать директорию, в которой можно будет ставить эксперименты и разворачивать бота и перейти в неё. Это тоже проще всего сделать из терминала:

Тильда (~) перед названием директории означает обращение к вашему домашнему каталогу. Вы можете создать директорию для экспериментов в любом удобном для вас месте. Теперь в свежесозданный каталог нужно установить необходимые пакеты с помощью пакетного менеджера Node.js:

Заметьте, что пакеты установятся локально в ту директорию, в которой вы находитесь. В нашем случае это ~/Deploy/. Вы можете установить их глобально в систему, для этого у npm install существует специальный ключ −−global. Пакет node-telegram-bot-api, как было сказано выше, необходимая обёртка над официальным Telegram Bot API, связывающая его с Node.js, а пакет request может пригодиться нам для получения различных файлов из Интернета. В общем случае он не нужен и обычно уже идёт в стандартной поставке вместе с Node.js, но это зависит от дистрибутива. Скорее всего вам вовсе не потребуется эта зависимость, но на всякий случай установим и её.

Итак, окружение готово к работе. Теперь ваш компьютер является сервером для различных приложений на Node.js, частным случаем которых являются боты для Telegram. При желании бота можно будет перенести на какой-нибудь вменяемый хостинг, поддерживающий Node.js и запускать его оттуда. Для отладки Node.js приложений можно воспользоваться специальной облачной Web-платформой Cloud9 IDE.

И ещё нужно отметить кое-что важное, существует две разновидности ботов для Telegram: WebHook-боты с подписанным HTTPS-сертификатом и так называемые Polling-боты. Первых ботов дёргает главный сервер Telegram’а, а вторые сами постоянно ходят на сервер и сканируют чаты на предмет новых сообщений в них. Для реализации ботов первого типа нужен специальный валидный HTTPS-сертификат, причём самоподписанный не годится, поэтому рассматривать в этой статье мы их не будем. Для экспериментов и для простеньких ботов с головой хватит и Polling-режима, задержка в полсекунды не слишком критична на мой взгляд. Эти режимы регламентируются официальным Telegram Bot API и имеют полную реализацию во всех популярных пакетах-обёртках, в node-telegram-bot-api в том числе. При желании и наличии подходящего сертификата вы можете переделать Polling-бота в WebHook-бота, использующего HTTPS-сертификат, следуя официальной документации.

На этом теоретическая часть закончена. Переходим к следующим действиям.

<< Перейти к содержанию

3. Создаём профиль бота с помощью @BotFather

Для экспериментов нам потребуется «физическая сущность» бота в сети Telegram, его профиль, который можно добавлять в групповые чаты или просто начать с ним персональную беседу. Бот должен быть связан с запущенной на вашем компьютере программой посредством специального индивидуального и уникального токена. Заметьте, что этот токен предоставляет доступ к «физической сущности» вашего бота, а следовательно должен быть секретным. К счастью, если токен скомпрометирован, функционал Telegram позволяет его отозвать.

@BotFather является специальным ботом, который может создавать профили других ботов, а так же выдавать их токены. Для создания собственного профиля будущего бота, просто начните разговор с @BotFather, после чего он добавится вам в список контактов. Небольшой совет: отправив сообщение, содержащее «@BotFather» в любой чат, вы получите ссылку на профиль бота и возможность начать разговор с ним, просто нажав кнопку «Send Message».

Для создания бота @BotFather‘у в чат необходимо отправить команду /newbot, после чего задать его имя, которое будет отображено в профиле и username, через который пользователи Telegram смогут получить ссылку на профиль. Заметьте, что username обязательно должен заканчиваться на «_bot», например, @MySuperTest_bot. Выберите тот username, который нравится вам и не занят. После того, как вы отправите всю необходимую информацию, @BotFather должен выдать вам уникальный токен бота. Рекомендую записать его в текстовый файл, сохранить и спрятать куда-нибудь в укромное местечко.

Далее, отправляя @BotFather‘у команды, начинающиеся с «/set» можно настроить различные параметры бота, например: установить ему имя, аватар, текст в профиль и описание. Всё достаточно интуитивно и прозрачно, но есть пара важных моментов.

Разберёмся сначала с командой /setcommands; она устанавливает команды, которые будут отображены в чате по нажатию специальной пиктограммы быстрого доступа (см. изображение выше). Кроме того, пользователь может быстро выбрать необходимую ему команду бота во всплывающей подсказке, просто набрав в чате «/». Весьма важно заполнить эту информацию, пример формата заполнения следующий:

Рекомендую сохранить текст описания команд в какой-нибудь файл, так как при изменении этого списка вам придётся его отправлять заново.

Следующие команды, на которые надо обратить особое внимание, это /setjoingroups и /setprivacy. Первая команда даёт возможность пользователям добавлять вашего бота в групповые чаты (если мне не изменяет память, по дефолту эта возможность включена), а вторая запрещает боту просматривать все сообщения в группе, кроме команд. Обязательно отключите эту способность, так как для дайджест-бота критически важна возможность мониторинга всех сообщений пользователей на предмет присутствия в них тега #digest. В общем, выставите настройки так, чтобы пользователи могли добавлять бота в групповые чаты (/setjoingroups в ENABLED) и бот мог мониторить сообщения в них (/setprivacy в DISABLED).

Теперь у нас есть токен и настроенный профиль. Самое время взяться за написание Hello World!-бота!

<< Перейти к содержанию

4. Реализация простейшего Hello World!-бота на JavaScript

Перейдём в созданную ранее директорию ~/Deploy/, создадим там файл «HelloWorldBot.js» с помощью любого, удобного вам текстового редактора с поддержкой и подсветкой синтаксиса JavaScript. Вставим в этот файл следующий текст:

Поделиться:
Нет комментариев

Добавить комментарий

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

Этот сайт использует Akismet для борьбы со спамом. Узнайте как обрабатываются ваши данные комментариев.