У меня есть телеграммный бот с основной функцией бредогенерация. Для поддержания беседы в чате :)

В какой-то момент времени нас начали донимать симочные боты со своей рекламой. Пришла в голову мысль, а почему бы не снабдить бота банилкой таких деятелей?

В этой задаче есть проблема - надо точно знать id пользователя, которого надо забанить. Это прописано в документации.

Parameter   Type                Required    Description
chat_id     Integer or String   Yes         Unique identifier for the target chat or username of the target supergroup or channel (in the format @channelusername)
user_id     Integer             Yes         Unique identifier of the target user

И проблема в том, что нет возможности через bot api вытащить список пользователей в чяте.

Таким образом, реализовать поиск id по пользователю (username, first_name, last_name) можно только коллекционируя и постоянно обновляя данные о пользователях по всем входящим ивентам в чате. Конечно, синхронизацию бд с тем, что есть на диске можно выполнять, например, раз в 15 минут, а не на каждый ивент, но это накладывает другой момент: необходимо держать все данные в памяти.

Это всё неплохо работает на одной-двух комнатах с 10-15 калеками, а вот если их 10+ и человек в каждой комнате по паре сотен персон? Это уже становится дороговато. А дороговато становится потому, что удобнее всего хранить данные во вложенных хэшах, а это жирные структуры.

На диске данные можно организовать как угодно, так как там всё ровно не будет десятков гигабайт информации. От условных json-ов, до berkeley db, sqlite, leveldb и тп. Самый относительно не накладный способ - это bdb с tie-енным хэшем.

Но больше всего, конечно, расстраивает неконсистентность такой базы.

Собственно, основная идея банилки в том, чтобы банить симочных ботов, но проблема в том, что в моей практике такой бот как правило "одноразовый". То есть, он заходит в конференцию, отсиживается пару месяцев молча (в оффлайне), а потом делает вброс. Судя по всему, предполагается, что после этого бота рапартуют, как спаммера, и он исчезает. Такого персонажа формально невозможно отличить от настоящего пользователя. Разве что по поведению, отсутствию телефона, username-а, и что он оффлайн уже более месяца, однако, в этом нет ничего "противозаконного". Вначале я думал, что отсутствие language_code - это характерная особеность ботов, но этой теории не суждено было подтвердиться.

Далее, какой ещё нюанс: пользователя можно записать в бан-лист, но "зарапортовать" его невозможно, bot api так не умеет. Кроме того, чтобы воспользоваться функцией "забанить, зарепортить, удалить все сообщения от юзера", нужно ещё и держать где-то список id сообщений за последние 2 дня, именно за этот период можно удалить сообщения, согласно документации.

Иными словами, какие-то "надзирающие" функции на телеграммного бота возлагать не имея "симочных" возможностей - это ресурсоёмко и не очень надёжно. Конечно, есть в инернетах боты/фреймворки, которые "гарантируют" работоспособность этих функций, но это либо то самое коллекционирование данных по описаному выше методу, либо питонячий telethon или пыховый madeline, которому нужна "симка", то есть за ради этих возможностей нужно сгенерировать ему ключ на живую симку, зарегистрированную в телеграме и дальше он уже будет пользоваться возможностями клиентского api через mtproto, соответственно, чтобы самому не реализовывать mtproto, придётся рядом поднимать что-то работающее с mtproto и ходить в него.

Next Post