В моём демо есть кнопка «Я не робот». Если новичок нажал её в первые десять минут после вступления, писать уже можно, но ссылки пока попадают под фильтр. На первый взгляд проверка закончилась, а ограничение почему-то осталось. В коде это два независимых правила.
Здесь я разбираю устройство демонстрационного сценария, а не рассказываю историю чужого чата. В нём нет клиента, которому мы победили спам. Есть приветствие, кнопка под сообщением и отдельное правило для ссылок. На этой небольшой разнице можно понять, что стоит обсуждать перед заказом модерации.
Вход в сценарий начинается в демо для группы. Его инструкция предлагает добавить бота в свою группу; для знакомства допустимо создать пустую тестовую. На экране находится кнопка «Добавить в мою группу». Рядом объясняется, какие разрешения оставить и как пригласить другого участника. Иначе встречать будет некого.
По коду, при вступлении человека бот сначала проверяет, может ли ограничивать участников. Если может, пытается запретить новичку отправку сообщений, а затем присылает приветствие с кнопкой. Имя берётся из данных вошедшего человека. Текст короткий — нажмите, и сможете писать в чате.
Пока всё похоже на проходную.
Но кнопка прикреплена к общему сообщению. Её видят и другие люди. В обработчике предусмотрен этот случай: идентификатор нажавшего сравнивается с идентификатором новичка. При несовпадении ответ будет «Эта кнопка для нового участника». Сосед по чату не может пройти проверку за вошедшего простым нажатием на его приветствие.
Для владельца группы это отдельная проверка при приёмке. Недостаточно увидеть, что кнопка вообще нажимается и в ответ появляется текст. Полезно попросить другого участника нажать её раньше новичка и посмотреть, останется ли ограничение у того, для кого оно было установлено. Это предложение теста, а не отчёт о проведённом мной эксперименте.
Когда нажимает нужный человек, обработчик запрашивает снятие ограничений. Только после успешного запроса в базе отмечается подтверждение. Затем появляется ответ «Спасибо! Теперь можно писать». При ошибке Telegram предусмотрено другое сообщение — о том, что у бота забрали права. Успешный текст не должен подменять неудавшееся действие.
На этом проверка кнопки закончена. История ссылки ещё не началась.
В обработчике сообщений отсчёт идёт от вступления человека в группу. В коде записаны 600 секунд — те самые десять минут, о которых предупреждает демо. Отметка о пройденной проверке здесь не используется. Разрешение писать меняется после нажатия, а фильтр ссылок зависит от времени.
При приёмке полезно отдельно отключить только право удаления сообщений, сохранив право блокировки участников. По коду проверка кнопкой остаётся отдельным действием, а удаление ссылки требует своего разрешения. Такой тест отделяет неисправность правила от отсутствия доступа к действию.
Это не десять минут дополнительного ожидания после кнопки. Часы запущены раньше. Для проверки сценария существенна именно точка отсчёта, иначе владелец и разработчик могут одинаково произносить слово «новичок», но иметь в виду совершенно разные ограничения, тексты предупреждений и момент, когда участнику разрешается поделиться адресом.
Ссылка для этого обработчика — не только строка, начинающаяся с https. Он ищет адреса с t.me и www, упоминания через знак @, а ещё учитывает разметку Telegram, где адрес может быть спрятан под словами. Проверяется текст сообщения или подпись. Поэтому вставленная в обычное слово ссылка тоже относится к тому, что нужно проверить, а не только голый адрес посреди строки.
Если правило сработало и у бота есть разрешение удалять сообщения, код пытается убрать публикацию. Затем отправляется пояснение о запрете ссылок новым участникам. При ошибке удаления пишется запись в журнал. Я не могу по чтению этого обработчика обещать, что любая ссылка исчезнет при любых настройках группы: между найденным адресом и исчезнувшим сообщением стоит реальный запрос к Telegram.
Отсюда довольно приземлённый способ принимать работу. Отдельно проверять, что запрещённое сообщение действительно исчезло, а не просто прочитать уведомление о модерации. Отдельно — что обычный текст после подтверждения остаётся на месте. При строгом запрете легко сосредоточиться на удалениях и забыть о человеке, который пришёл задать нормальный вопрос.
Без нужных разрешений сценарий меняется. В коде есть приветствие, которое прямо сообщает, что проверка выключена: бот не может блокировать участников. Это полезнее, чем нарисовать ту же кнопку и оставить владельца в уверенности, будто вход уже закрыт. Приветствовать и ограничивать — разные действия, даже если с телефона они выглядят частями одного сообщения.
Само нажатие я не назвал бы доказательством того, что в группу вошёл добросовестный человек. Обработчик проверяет принадлежность кнопки, а не намерения участника. Человек, готовый рассылать рекламу вручную, тоже способен нажать её. Не знаю, какой поток нежелательных сообщений идёт именно в вашей группе; по демонстрации нельзя вычислить, сколько из них исчезнет после установки.
Для будущего бота полезнее описать конкретное правило, чем заказать защиту вообще. Например, нужно ли разрешать упоминания, куда обращаться при ошибочном удалении, кого считать новичком. Это вопросы к устройству вашей группы, не обещания уже готовых функций демо. Любой такой сценарий надо сначала согласовать: я делаю ботов под задачу, а демонстрационные виды служат примерами, не границами заказа.
В самом демо есть ещё срок, который легко пропустить среди кнопок: через двое суток бот выйдет из группы. Он предназначен для знакомства со сценарием, а не для бессрочного дежурства. Поэтому тестовый чат не стоит принимать за настроенную защиту рабочего сообщества.
Новичок нажал свою кнопку и получил возможность говорить. Первые десять минут после вступления его ссылки всё ещё попадают под отдельное правило. После успешного снятия ограничения бот отвечает на кнопку: «Спасибо! Теперь можно писать».