Notiscriber: Telegram-бот, позволяющий не пропускать важное

Telegram давно стал любимым мессенджером для многих. Можно предположить, что помимо безопасности и анонимности популярность мессенджер сыскал благодаря возможности создавать каналы и групповые чаты и богатому API, которое позволяет создавать функциональных чат-ботов.

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

Проблема

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

Лично я в какой-то момент начал просто игнорировать большинство чатов/каналов, но при этом все еще не отписываюсь от них, так как предполагаю, что они полезные. Хотя предположение безосновательное, потому что я их долгое время уже не читаю, а просто помечаю их прочитанными, чтоб не раздражали циферки с непрочитанными сообщениями (перфекционисты, привет!).

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

NotiscriberBot

На помощь решения этой проблемы приходит сам Telegram с богатым API и возможностью создания ботов.

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

Механика работы

Бот позволяет создать подписку, согласно которой он будет уведомлять пользователя. Подписка состоит из нескольких частей:
1. канал или чат, на сообщения в котором хочет подписаться пользователь;
2. подписка, есть два типа: на сообщения (бот ищет сообщения, удовлетворяющие правилу) или на пользователя (бот уведомляет о всех сообщениях от пользователя).
для каналов возможна только подписка на сообщения;
3. правило подписки. Если подписка на пользователя, то это его username, если подписка на сообщение -- это либо слово/фраза целиком, которое бот будет искать в сообщениях, либо регулярное выражение (не самая удобная механика, но пока так).

Примеры

Дальше будет несколько примеров по взаимодействию с ботом.

Как добавить бота в чат

При добавлении бота в чат (и публичный, и приватный) никакие дополнительный действия [обычно] не требуются, так как API Telegram'а позволяет получать события добавления бота в чат, что позволяет ему автоматически зарегистрировать новый источник сообщений.
с каналами, к сожалению, это так не работает: Telegram не отсылает никакие события при добавлении бота в канал. Поэтому после добавления необходимо в канале опубликовать пост (его сразу же можно удалить) вида /register@notiscriber_bot.
иногда автоматическая механика не отрабатывает и с чатами, поэтому можно так же использовать команду /register@notiscriber_bot. Так же есть команда /check@notiscriber_bot, чтоб убедиться, что все хорошо.

еще один важный нюанс с каналами -- боту необходимо быть администратором. К сожалению, опять же, так работает Telegram. Но можно отозвать у него все привилегии, так как бот в них не нуждается и не производит никаких действий с каналом.

Например, так это выглядит в канале NotiscriberBotChannel.

Notiscriber: Telegram-бот, позволяющий не пропускать важное

Как завести подписку

С подпиской на примерах все должно стать понятнее.

Для этого возьмем публичный чат NotiscriberBotGroup, в котором состоит бот и участником которого необходимо стать. Следом заходим в бот, пишем /start (простая формальность), если раньше ботом не пользовались. Теперь можно создать подписку.

Набираем команду /create_rule, отвечаем боту на вопрос.

Notiscriber: Telegram-бот, позволяющий не пропускать важное

Так как я выбрал групповой чат, бот предлагает выбрать один из доступных чатов. Доступный чат -- это чат, в котором состоит бот и Вы. В данном случае это NotiscriberBotGroup.

Notiscriber: Telegram-бот, позволяющий не пропускать важное

На что бот предложит выбрать тип подписки. В данном случае я хочу подписаться на сообщения.
Для каналов доступен только один тип подписки: на сообщения, так как все сообщения в канал приходят от имени канала. Поэтому при создании правила для канала этого этапа не будет.

Notiscriber: Telegram-бот, позволяющий не пропускать важное

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

Notiscriber: Telegram-бот, позволяющий не пропускать важное

Подписка успешно создана, можно тестить.

Если в чате написать сообщение, в котором будет слово "notiscriber", бот обязательно об этом сообщит.

Если захотите протестировать сами -- не забудьте присоединиться к чату NotiscriberBotGroup.

еще из полезного -- правила можно мьютить. Набираем команду /manage_my_rules, жмем кнопку Mute под правилом. Тут же можно правило удалить.

Notiscriber: Telegram-бот, позволяющий не пропускать важное

Доступ к сообщениям

Да, бот имеет доступ ко всем сообщениям в чате. Но он их никуда не сохраняет и использует только с целью проверки на соответствие подпискам. Исходный код бота закрыт (возможно, это только пока), поэтому остается верить только на слово.

Стал бы я добавлять такой бот приватные чаты -- да, так как я точно знаю, что данные никуда не уходят. В публичный -- более чем да.

Гарантии

Пока гарантии не самые высокие и есть вероятность пропуска уведомлений по некоторым причинам. Особенно сложно предсказать поведение бота при увеличения числа подписок и источников сообщений. Нагрузочное тестирование было, но довольно синтетическое.
Хотелось бы в будущем соответствовать хотя б at least-once семантике, а в идеале -- exactly-once при работе в штатном режиме. Простым языком про данные семантики есть тут, видео смотреть не обязательно.

Что дальше

Бот уже позволяет отказаться от уведомлений от чатов/каналов в пользу только актуальных уведомлений от бота. Но стоит понимать, что это первая публичная версия бота и не совсем понятно как он себя поведет под органичным трафиком. До этого были только синтетические тесты. Поэтому не исключена вероятность технических проблем или багов, которые придется решать.

Очевидно, нужен более дружелюбный и гибкий механизм для создания правил, так как регулярные выражения нельзя назвать хорошим решением. Думаю, есть возможность сделать процесс подписки более приятным с точки зрения UX, но мой инженерный склад ума говорит "и так сойдет".

Так же планируется возможность создания подписок с расписанием. Например, чтоб не получать уведомления ночью.

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

И повышение гарантий, о которых уже было сказано.

Все вопросы можно писать либо мне напрямую, либо в группу бота.

11
3 комментария

Предложения начинаются с заглавной буквы

Ответить

правда?

Ответить

Прописная истина

Ответить