Привет. Я автор нескольких популярных ботов для администрирования телеграм групп: @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 ботами, а ботами использующими обычные пользовательские аккаунты, но проблема и её решение, описанные в статье, имеют место быть. И они имеют место быть каждый день, и я уже заколебался отвечать одно и то же на одни и те же вопросы, поэтому и написал эту статью.

Комментарии (6)


  1. Revertis
    07.03.2019 19:44

    Вот бы еще от такого «легитимного» спама можно было бы спастись:

    Заголовок спойлера
    image


    1. itforge Автор
      07.03.2019 21:19

      А это скриншот чего? Не очень понял.


      1. Revertis
        07.03.2019 21:31

        Это скриншот канала. Вроде подписываешься, там нормальный контент, а потом начинают кросс-рекламу других каналов целыми портянками присылать по 5 раз в день.


        1. express
          08.03.2019 10:22

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

          Вообще, сама концепция отсутствия всякой обратной связи подталкивает к такому поведению. Вот если бы можно было бы минусовать контент, чтобы при определённом пороге он переставал отображаться у других — было бы другое дело. Но тогда это нужно придумывать как ограничить учетные записи, минусующие все подряд…


          1. OKyJIucT
            08.03.2019 11:32

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


            1. express
              08.03.2019 17:09

              А нет варианта, что останутся каналы, скажем, с рекламой подороже, а оттого более редкой и не такой раздражающей как сейчас? Или найдутся люди бесплатно ведущие каналы. Примеров бесплатного наполнения контента людьми, я думаю, достаточно. Да и переопубликовать чужие картинки большого ума и усилий, кмк, не требует.