Привет. Я автор нескольких популярных ботов для администрирования телеграм групп: @daysandbox, @watchdog_robot и других. Каждый день в группе поддержки и в личных сообщениях я вижу один и тот же вопрос: как мне защититься от спам-ботов, добавляемых в группу. Обычно ещё уточняют, что это арабские спам-боты. Люди пытаются найти анти-спам бота, который будет удалять ссылки, удалять сообщения с арабскими символами, удалять пользователей с арабскими символами в именах и всё в таком духе. Но это всё следствия, а причина во многих случаях одна и та же и её легко поправить. Причина простая, но не очевидная.
В чём уникальность проблемы спам-ботов, добавляемых в группу? Телеграм боты не видят сообщения от других телеграм ботов. Даже если у вас в группе уже установлены боты, удаляющие ссылки, арабские символы и прочие штуки, даже если они запрещают новым участникам группы писать собщения до тех пор, пока новые участники не нажмут на кнопку или пройдут какой-то тест, это не помогает предотвратить спам.
Спам появляется по следующему сценарию:
- участник группы добавляет спам-бота в группу
- анти-спам бот видит факт добавления бота
- анти-спам бот, вызывает метод telegram API, ограничивающий спам-бота в правах записи сообщений в группу. Например, он делает это для всех новых пользователей или только для тех, логин которых содержит в конце слово "bot". Это не суть важно.
- Проходит некоторое время между моментами захода спам-бота в группу и обработкой телеграм сервера запроса об ограничении этого бота в правах записи в чат. В этот момент спам-бот может отправить сообщение в чат.
- Анти-спам бот не видит это сообщение, потому что боты не видят сообщения других ботов. Так устроен телеграм.
Рассмотренный сценарий показывает, что не всегда возможно бороться с последствиями добавляемых ботов. Эффективнее бороться с причиной — возможностью добавления ботов в группу участниками группы.
Существует два типа телеграмм групп: публичная и частная. От типа группы зависит, что и как могут делать внутри группы администраторы, простые пользователи и боты. Обязательное условие для публичной группы — существование ссылки вида "https://t.me/XXX", по которой можно зайти в группу. Для частной группы наличие ссылки для входа не обязательно.
Рассмотрим процесс создания группы с нуля. Создадим группу с настройками по-умолчанию. У нас получится частная группа без ссылки-приглашения. Попробуем добавить любого бота простым участником группы. Добавился! Как решить проблему? Единственный способ запретить добавлять ботов в частную группу — это запретить добавлять вручную вообще каких-либо новых участников, это делается с помощью галочки "Управление группой -> Разрешения -> Добавление участников". Это ограничит только простых пользователей, администраторы группы по прежнему смогут добавлять новых участников (и ботов) руками.
С самым простым случаем разобрались. Теперь создадим ссылку-приглашение для входа в группу: "Управление группой-> Информация о группе -> Ссылка-приглашение -> Создать ссылку-приглашение". Получим ссылку вида "https://t.me/joinchat/...". Для каждого администратора создаётся своя ссылка-приглашение, изначально её знает только администратор, её создавший. Теперь администратор может разместить эту ссылку там, где он посчитает нужным, и любой пользователь может присооединиться к чату по этой ссылке. В любой момент времени администратор может сгенерировать новую ссылку-приглашение, при этом старая ссылка перестанет работать.
Важное замечание: спам-боты не могут зайти в группу по ссылке-приглашению. Спам-бот (и вообще любой бот) может попасть в чат только, если кто-то добавит туда бота вручную. Самая частая причина появления спам-ботов в частных чатах — это когда администраторы создают ссылки-приглашения, но не отключают (через Управление группой -> Разрешения) возможность добавлять новых пользователей вручную.
Теперь посмотрим, что будет, если мы переведём группу из частного режима в публичный с помощью "Управление группой -> Информация о группе -> Публичная группа". Нам также придётся придумать публичный адрес вида "https://t.me/XXX", без этого не получится сделать группу публичной. Пусть это будет "https://t.me/habr_test". В чём отличие публичной группы от частной группы, имеющей ссылку-приглашение? Публичную группу можно найти через внутренний поиск телеграма, а также можно посмотреть любое сообщение группы через веб по адресу "https://t.me/habr_test/X", где X — это порядковый номер сообщения в группе.
Итак, наша группа стала публичной, у неё изменились свойства видимости, и не только. Самое интересное, что в неё больше нельзя приглашать ботов. Если в "Управление группой -> Разрешения" разрешено приглашать новых пользователей, то пользователи могу приглашать новых пользователей, но только обычных людей, не ботов. При попытке добавить бота будет возникать ошибка "Не удалось добавить пользователя. Попробуйте позже". То что надо!
Вывод. Иммунитет от заражения группы ботами даёт одно из двух действий:
- запрет обычным участникам добавлять ботов (Управление группой -> Разрешения)
- перевод группы в публичный режим т.е. назначение группе адреса вида "https://t.me/habr_test"
P.S. Заголовок статьи получился немного кликбейтовым. Конечно, множество телеграм-спама генерируется не bot-API ботами, а ботами использующими обычные пользовательские аккаунты, но проблема и её решение, описанные в статье, имеют место быть. И они имеют место быть каждый день, и я уже заколебался отвечать одно и то же на одни и те же вопросы, поэтому и написал эту статью.
UPD: Сделал бота, который автоматически удаляет сообщения, содержащие символы арабского алфавита, а также удаляет новых пользователей, в именах которых есть символы арабского алфавита. Просто установите бота @noarab_bot в чат и дайте ему права на удаление сообщений и на бан пользователей. Документация по боту: https://tgdev.io/bot/noarab_bot
UPD2: Если по тем или иным причинам невозможно сделать группу публичной или запретить добавление участниво в приватной группе, тогда можно использовать бота @watchdog_robot с фильтром "bot" — watchdog будет удалять ботов сразу же после того, как их кто-то добавил в чат.