Мой демонстрационный бот способен приветствовать новичка и тут же сообщать, что проверка «не робот» выключена. Приветствие удалось отправить, а ограничить участника нечем — боту не дали нужного права. В коде для этого случая предусмотрен отдельный текст. Вежливость работает, проверка нет.
Слово «администратор» звучит достаточно внушительно, чтобы принять его за готовое решение, но в Telegram за ним стоят отдельные разрешения — и если выдать должность, не разобравшись с действиями, получится назначение ответственного без возможности сделать то, за что его назначили. Бывает и обратная крайность — право на всё ради единственной кнопки. Я предпочитаю читать разрешения буквально.
В моём демо для группы запрошены блокировка участников и удаление сообщений. Ссылка добавления содержит соответствующие параметры restrict_members и delete_messages. Они нужны для разных частей сценария, хотя снаружи всё выглядит как одна работа по встрече новичка. Здесь полезно остановиться до нажатия на все доступные переключатели.
Права бота в группе телеграм стоит разбирать по действиям. Участник приходит — программа пытается запретить ему писать до подтверждения. Для этого проверяет у себя возможность ограничивать участников. Следом отправляет приветствие с кнопкой. Если запретить отправку не получилось, код не изображает успешную защиту, а сообщает, что проверка отключена. Именно поэтому само появление сообщения ещё не доказывает работоспособность остального сценария.
В описании restrictChatMember Telegram отдельно оговаривает супергруппу, администраторский статус и необходимые полномочия. Это граница метода, а не пожелание разработчика. Нельзя обещать одинаковое поведение для любого чата лишь потому, что в интерфейсе они оба называются группами. При проверке нужен тот тип чата, в котором будет работать ограничение.
Кнопка «Я не робот» тоже имеет адресата. В коде демо она связана с конкретным новым участником. Если её нажимает кто-то другой, подтверждения не происходит: программа отвечает, что эта кнопка предназначена новичку. Участливый сосед не может пройти проверку за человека, хотя с бытовой точки зрения это могло бы выглядеть как помощь. У программы более узкое представление о помощи.
После правильного нажатия бот пытается вернуть возможность отправлять сообщения. Здесь полномочия снова нужны. Разрешение, которое было при вступлении человека, могли снять до подтверждения; для неудачного снятия ограничения в коде есть сообщение об ошибке. Одного успешного приветствия недостаточно и на этом конце маршрута. Проверять приходится возвращённую возможность писать, а не только исчезновение красивой кнопки.
Вторая работа начинается со ссылки. Для новичка в демо действует окно в десять минут: в течение этого времени программа проверяет его сообщения на ссылки и удаляет найденное, если у неё есть право удаления. В исходнике проверяются текст, подпись и специальные сведения Telegram о ссылках и упоминаниях. Это определённое правило фильтра, а не способность догадаться о намерениях любого собеседника.
Десять минут здесь — настройка моего примера. Из неё не следует, что Telegram требует именно такого срока, что он подходит всякому сообществу или что после него человек становится благонадёжным, — программа просто перестаёт применять эту проверку к участнику, не выдавая ему свидетельства о хорошем поведении. Превращать число из исходника в универсальный стандарт модерации было бы довольно торжественным способом неправильно прочитать исходник.
Для удаления используется другое полномочие. В таблице прав администратора can_delete_messages относится к чужим сообщениям, can_restrict_members — к ограничениям участников. Поэтому возможность запретить новичку писать не заменяет разрешения удалить присланное. Обе задачи помещаются в короткое слово «модерация», но Telegram не обязан по этому слову выдавать полный комплект действий.
В той же таблице отдельно существуют повышение администраторов, изменение сведений о чате и приглашение пользователей — для показанного сценария встречи и фильтра ссылок они не нужны. У другой функции должно появиться собственное обоснование. Выдавать все разрешения на случай неизвестного будущего — значит заранее согласиться и на это неизвестное будущее.
На проверке я предлагаю разделить два результата. Сначала убедиться, что новый участник действительно не может отправить сообщение до своего нажатия и может после него. Затем проверить правило ссылок на тестовом сообщении в предусмотренный срок. Это рекомендации для испытания, не рассказ о проведённом здесь запуске в чьей-либо группе. Слова о полной защите от спама из таких тестов всё равно не получатся.
Я не знаю, какие ограничения уместны в вашем сообществе, пока не описаны его правила. Запретить ссылку от любого новичка — понятный алгоритм, но он может задеть и допустимое по вашим правилам сообщение. Демо показывает механику, а решение о запрете принимает владелец. Снимать с себя это решение словами о разумной автоматике было бы удобно (прежде всего самому владельцу).
Есть ещё особенность именно демонстрации: через двое суток бот выходит из группы. Это сказано на её первом экране. Оставить пример в рабочем чате и ожидать от него постоянной службы нельзя; срок знакомства не превращается в договор о круглосуточной модерации. Для настоящей задачи надо отдельно согласовать поведение и место работы программы. Такие задачи я тоже разрабатываю — виды на сайте не исчерпывают возможные сценарии. В описании задачи полезно указать тип чата и действие, ради которого нужен доступ. Если требуется только встречать новичков, не стоит под этим названием молча подразумевать управление всеми администраторами. Название услуги не заменяет списка разрешённых операций.
Начинать знакомство можно в пустой тестовой группе, как и предлагает демо, без переноса эксперимента на действующее сообщество. Там видна разница между приветствием и ограничением, а ненужная ссылка не помешает чужому разговору. Заодно можно нажать кнопку за другого участника. В ответ появится короткое сообщение: «Эта кнопка для нового участника.»