
Привет!
Ни для кого не секрет, что в последние годы популярность мессенджера Telegram бьет рекорды. Его ежемесячная аудитория – 950 млн, ежедневно в нем регистрируются 2,5 млн человек. Сегодня буквально у каждого есть аккаунт в Telegram, а еще – множество чатов и каналов в подписках.
Мы стремимся быть на связи с нашими пользователи там, где это им удобно, поэтому у нас тоже есть свой канал и чат в Telegram – уютное сообщество, где наши пользователи обсуждают новости, дискутируют, делятся лайфхаками и просто общаются друг с другом и сотрудниками Бегета в неформальной атмосфере.
Но, как известно, с великой силой приходит великая ответственность. А если точнее, то когда наше сообщество стало расти, на него обратили свое внимание спам-боты. Разумеется, это не могло не расстроить нас и наших пользователей. В результате мы прошли долгий путь борьбы с этой цифровой чумой XXI века и, как нам кажется, нашли работающее решение.
О том, как мы это сделали, расскажем сегодня.
Разберем, как мы настроили антиспам-бота в своем сообществе и каких результатов удалось добиться в итоге. Эта статья будет полезна всем, у кого есть свое сообщество или группа в Telegram, а также тем, кому интересно, как вообще можно использовать ботов в этом мессенджере.
Итак, рано или поздно у каждого владельца чата в Telegram с ростом числа подписчиков возникает вопрос, как убрать спам в тг. Спам, содержащий рекламу, предлагающий легко заработать или что-нибудь погорячее, неприятен сам по себе, а еще он влияет на экологию и может навредить репутации бренда. При этом часто спам прилетает ночью, и оперативно удалить его вручную получается не всегда.
Рассылкой этого спама занимаются автоматизированные боты, которые идут по списку популярных сообществ в Telegram – алгоритм действий в таком случае выглядит так:
- Зайти в канал
- Вбросить спам
- Больше никогда не появляться

Конечно, можно пытаться использовать для борьбы со спамом готовые решения. Мы опробовали несколько из них и пришли к выводу, что вся эта затея – та еще задачка со звездочкой: дело в том, что у нашего сообщества несколько топиков и тредов, а 99% готовых решений и антиспам-ботов (даже платных) не умеют с ними работать.
И вот, когда казалось, что без ручной модерации не обойтись, мы нашли решение. Но обо всём по порядку. Перед тем как кого-то хвалить, разберем в деталях стоящую перед нами цель и сложность задачи.
Наша цель и поиски решения
Мы подготовили несколько вводных, своего рода сценарий, по которому должно работать решение мечты:
- Пользователь пишет сообщение в любой топик.
- Бот не блокирует пользователя и удаляет сообщение, предлагая ему пройти капчу в том треде, где было написано сообщение.
- Если капча не пройдена, пользователь блокируется, но может попробовать пройти ее снова.
Подбор решения для этой задачи на поверку оказался не так уж прост, многие, казалось бы, хорошие варианты, несмотря на свои плюсы, для нашей конкретной задачи не подошли.
Первый, кого мы решили опробовать, – Shieldy. Это бесплатное и на первый взгляд подходящее решение для прохождения капчи, которое позволяет защитить чат от автоматического постинга со стороны других ботов. Но оказалось, что Shieldy некорректно работает в сообществах с тредами, а у нас именно такое. Проблема была в том, что пользователь вступал в сообщество, переходил в нужный ему тред и пытался там задать свой вопрос. Его сообщение удалялось, а в треде “General” появлялся запрос к пользователю на прохождение капчи. Уведомление, которое, конечно, пользователя уже не заставало.
Этот же недостаток мы встретили и у другого рассматриваемого решения – Combot. Абсолютно аналогичная проблема с работой в тредах…увы.
Поэтому мы продолжили поиск…
Встречались и весьма строгие боты, которые автоматически блокировали пользователя и не предоставляли возможности пройти капчу снова, если он не успел сделать это в ультракороткий срок.
Слишком сурово, не правда ли? 🙂

Спустя несколько литров кофе и недель мытарств мы даже думали написать своего бота – конечно, на это бы понадобился недюжинный ресурс разработки, но мы уже были буквально на грани.
Как вдруг волею судеб обнаружили PuzzleBot – веб-сервис для работы с ботами, каналами и группами в Telegram, в функционале которого буквально только-только появилось решение, позволяющее работать с тредами. Именно то, что нам нужно.
На нем мы в итоге и остановились.
Мы подготовили для вас подробную инструкцию о том, как и что настраивать в Пазлбот. Получился длинный пошаговый мануал – предлагаем с ним ознакомиться, если вам будет полезна подобная антиспам-защита от ботов в вашей группе в тг.
Итак, для начала формулируем поставленную задачу:
- Чат должен быть открытым, бот не должен ограничивать доступ участников чата до первого сообщения, а после него, в том же треде, где и написал участник, бот должен ему ответить, что необходимо пройти верификацию (сообщение участника при этом удалять).
- Процесс верификации должен происходить непосредственно в боте, чтобы исключить возможную автоматизацию бота со стороны “злоумышленников”.
- Проверка должна занимать не больше 120 секунд, в противном случае бот должен автоматически удалять участника из чата.
Теперь, когда задача сформулирована, разберем по шагам, как всё настроить.
- Регистрируемся в PuzzleBot, создаем бота в @botfather и добавляем созданного бота в PuzzleBot. Для привязки бота к сервису PuzzleBot необходимо ввести API-ключ в соответствующее окно в личном кабинете.
- Подключаем бота к группе (это делается через “Ресурс”), при этом для корректной работы всего функционала важно выдать ему абсолютно все права администратора.

Если вы добавили бота в Ресурс, и до этого в нем уже были топики (треды), то их следует переименовать – это необходимо, чтобы бот их увидел и мог в них отвечать. Например, топик с названием “Общение” переименовываем в “Общение1” и тут же переименовываем в “Общение”.
Теперь, когда бот добавлен, можно переходить непосредственно к настройке.
- Создаем категории “Ожидает проверки”, “Прошел проверку” в Ресурсе, назвать можно так, как удобно.
- Настраиваем права доступа для каждой категории в Ресурсе, в том числе для категории “Без категории” (не удаляется, создается по умолчанию).
- Создаем категорию “Не прошел проверку” непосредственно в боте.
Остальные категории аналогично тем, что в Ресурсе, не требуются, так как будем проверять пользователей по этим категориям. Это необходимо для случаев, когда пользователи будут возвращаться в бот повторно, чтобы он их “встречал”.
Теперь нужно выполнить настройки в разделе “Конструктор” в самом боте, однако перед этим следует удалить все команды и сохранить изменения (кнопка в левом верхнем углу).
- Переходим в раздел “Конструктор”, здесь для каждой команды нужно указать “Выполнение только из клавиатуры” – при такой настройке пользователи не смогут вызвать команду в боте путем ввода ее названия. Обратите внимание, что команды фиолетового цвета – это заменяемые команды, итоговое решение по выбору типа команд за вами.
- Создаем команду для успешной проверки
В действиях команды важно настроить, чтобы бот менял категорию пользователя в Ресурсе. По желанию можно включить автоматическое удаление сообщения спустя какое-то время. Также необходимо вставить текстовый блок, в котором будет сообщение с поздравлением об успешном прохождении проверки и повторной ссылкой на чат.
- Создаем команду для неуспешной проверки
В действиях команды указываем, чтобы бот менял категорию пользователя в боте на “Не прошел проверку” (это потребуется в случае если бот решит повторно вернуться за проверкой), и создаем блок с текстом, что пользователь не прошел проверку.
- Создаем команду с истечением времени проверки
Эта команда аналогична предыдущей, но содержит другой текст. Можно дублировать, можно создать новую. При дублировании в действиях команды указываем, чтобы бот менял категорию пользователя в боте на “Не прошел проверку”, указываем удаление из нашего Ресурса и создаем блок с текстом, что пользователь не успел пройти проверку.
- Создаем условие для проверки у пользователя категории “Проверенный”
В условии создаем правило на проверку. Если у пользователя нет категории “Проверенные” в Ресурсе, вызываем команду, созданную в предыдущем пункте. При этом исключающее правило настраивать не требуется, в данной ситуации, если у пользователя есть категория “Проверенные”, бот не должен ничего делать.
В действиях команды задаем вызов условия, созданного в предыдущем пункте.
- Создаем команду с капчей
В действиях команды задаем только вызов команды “timeout”, созданной в предыдущем пункте, затем создаем текстовый блок с приглашением пройти проверку. И здесь уже можно подключить фантазию, мы выбрали эмодзи котика, поросенка, лисенка, собачки и бота.
В каждой кнопке задано “Случайное” расположение, таким образом, при каждом новом вызове расположение кнопок не будет повторяться (при этом важно не забывать кнопку включать, как на скринкасте).
Во всех кнопках, кроме эмодзи с роботом, задаем вызов команды, созданной в пункте 2), а в кнопке с роботом задаем вызов команды, созданной в пункте 1).
- Создаем команды, которые будут отображаться тем пользователям, которые вернулись в бот и уже прошли проверку (или не прошли)
- Создаем условие, которое будет вызываться сразу же после /start (для пользователя это будет выглядеть так, будто он уже вызвал /start)
Правило №1: если у пользователя в Ресурсе есть категория “Проверенные”, отправить команду, созданную в пункте 6).
Правило №2: если у пользователя в боте есть категория “Не прошли проверку”, отправить команду, созданную в пункте 6).
Исключающее правило (будет задействовано, если не наступило ни одно из условий выше, таким образом, мы пониманием, что пользователь пришел пройти проверку): настроить его на отправку команды, созданной в пункте 5).
- Создаем команду, которая будет отправляться в группу
В действии команды добавляем удаление через 45 секунд (будет удаляться непосредственно в чате), а в настройках команды указываем “Выполнение только из клавиатуры” – таким образом, если “случайно” после выхода этой статьи пользователи решат вызвать команду в боте путем отправки текста, бот это проигнорирует.
Добавляем в команду текстовый блок, где с помощью переменной {{FIRST_NAME}} приветствуем пользователя и приглашаем пройти проверку, добавляем кнопку перехода к условию (такое действие позволит повторно не проходит проверку тем пользователям, которые ее уже прошли, – очень полезно, так как в чате много пользователей, каждый может повторно решить нажать на чужую ссылку, которая предназначалась не для него), а затем – вызов условия.
В результате должна получиться следующая конструкция:

- Теперь необходимо создать триггер в Ресурсе.
В триггере должны быть следующие настройки:
- Тип сообщения: “Любой”.
- Тип отправки: “Любое”.
- Включить галочку для “Проверять описание к медиа”.
- “Длина сообщения больше”: задать “0”.
Действия в триггере:
- Удалить сообщение.
- Добавление в категорию – добавлять в категорию Ресурса “Ожидаем проверки”.
- Команда или условия – на вкладке “Ресурс” вводим название команды или условия (команда, которую мы создали в пункте 9)).
- В дополнительных настройках триггера задаем, чтобы он реагировал только на пользователей, у которых в Ресурсе только категория “Без категории” и нет категорий “Ожидает проверки” либо “Проверенные” (и такой настройкой мы оставляем для себя возможность в будущем добавлять разные категории пользователей и использовать больше возможностей по модерации, которые предоставляет сервис).
- Вот и всё по настройкам 🙂
В результате бот работает по такому алгоритму:
- Пользователь заходит в чат – и попадает в категорию “Без категории”, в ней мы задали права доступа только на отправку сообщений, фото или видео (нам это нужно, чтобы пользователь мог что-то отправить при входе).
- Когда пользователь что-то отправляет, он тут же попадает в категорию “Ожидает проверки”, которой запрещено что-либо писать в группу, и получает ссылку на вход в бот. В самой кнопке ссылка на переход в бот, что также исключает возможность автоматизаций со стороны спамеров. При переходе в бот пользователь попадает в условие, которое также не даст ему попасть туда, куда не нужно, и если пользователь действительно пришел за верификацией, он пройдет в команду с верификацией.
- После прохождения верификации (нажатия в команде на робота, а не на котика, поросенка, лисенка или собачку) бот выдает пользователю в Ресурсе ту категорию, которую ранее мы настроили как разрешенную.
Результаты
Спустя несколько месяцев использования PuzzleBot мы заметили, что:
- 99% пользователей, которые приходят к нам в чат, щелкают капчи, как орехи – легко справляются с ними и безошибочно авторизуются в боте, в результате чего спама в тг у нас практически нет;
- количество пользователей, которые хотели написать, но попали в бан, равно 0;
- все сообщения, которые были удалены, а также пользователи, которые были заблокированы, на 99,9% действительно спам в тг;
- нагрузка на комьюнити-менеджеров снизилась – теперь не нужно круглосуточно мониторить телеграм-чат на предмет спама, можно спать спокойно.
Подводные камни
Не обошлось и без компромиссов – к счастью, их совсем мало (и мы смирились с ними 🙂), однако для полноты картины подсветим и их.
Прежде всего, несмотря на то, что количество спам-ботов, которые всё-таки прорываются, фактически 0, примерно 2–3 раза в месяц нежелательные сообщения всё же поступают – от реальных людей, которые спамят вручную.
Плюс есть некий дискомфорт пользователей, которые, приходя в чат, сразу отправляют длинные сообщения, – они, понятное дело, до прохождения капчи удаляются, в результате чего приходится печатать заново.
Это довольно обидный аспект нашего решения, но это лучше, чем тонуть в спаме 🙂
Заключение
Безусловно, проблема борьбы со спамом подобна извечному противостоянию щита и меча и мы понимаем, что текущее решение с ботом может оказаться не столь функциональным, например, в случае ручного посева спама в Телеграм. Да и в целом сегодня, когда Telegram ежемесячно используют 9,9% населения в мире, создание более “умных” инструментов для телеграм-спама – скорее вопрос времени.
Однако прямо сейчас мы буквально окрылены, вожделенная цель достигнута и мы этому несказанно рады. Так что если вы тоже хотите настроить антиспам-бота для своего сообщества, смело рекомендуем бот PuzzleBot. Отдельное спасибо команде PuzzleBot за отзывчивую техподдержку – ребята готовы прийти на помощь буквально по любым вопросам, это очень ценно.
Надеемся, этот кейс был вам полезен, а общение всегда будет приятным.
Если у вас возникли какие-либо вопросы, свяжитесь с нами удобным для вас способом – и мы обязательно ответим. Также ждем вас в нашем официальном Telegram-чате (том самом, без спама 🙂), где вы сможете обсудить ваш проект, пообщаться с коллегами по цеху и сотрудниками Бегета и задать вопросы, касающиеся антиспам-бота, – мы договорились с коллегами из PuzzleBot, и они подключатся к дискуссии, если такая потребность возникнет.