Как забанить бота в телеграмм
Перейти к содержимому

Как забанить бота в телеграмм

  • автор:

Можно ли забанить пользователя в Телеграм в боте, а потом разбанить через определенное время?

Есть чат-бот, в который приходят заявки 7 дней в неделю. Люди, что обрабатывают заявки, работают 1/3, 1 день рабочий (полные сутки) с 07.00, 25.05.22 по 07.00 26.05.22, потом 3 дня не работают, и снова выходят на смену. Я не хочу тогда, когда сотрудник 3 дня отдыхает, видел сообщения по заявкам от бота или принимал их. И сделать это циклом для всех сотрудников. Есть метод, возможно через /ban — но он банит полностью. а $un_ban_params — разбанивает. Пытался вычислить функцию и как-то адаптировать отложенный постинг между ними (понимаю что бред, но вдруг), не сработало..

Отслеживать

2,253 2 2 золотых знака 10 10 серебряных знаков 37 37 бронзовых знаков

задан 10 янв в 18:04

1 1 1 бронзовый знак

посмотрел pyrogram — вот такое решение, право пока не нашел, как его отредактировать так, что бы применить в боте from datetime import datetime, timedelta # Ban chat member forever await app.ban_chat_member(chat_id, user_id) # Ban chat member and automatically unban after 24h await app.ban_chat_member(chat_id, user_id, datetime.now() + timedelta(days=1))

10 янв в 20:50

0

Сортировка: Сброс на вариант по умолчанию

Знаете кого-то, кто может ответить? Поделитесь ссылкой на этот вопрос по почте, через Твиттер или Facebook.

  • python
  • telegram-bot
  • telegram
  • pyrogram

Как заблокировать пользователя в боте в телеграмме

Зайдите в чат с заслужившим бана пользователем и нажмите на его имя. В профиле тапните на три точки в правом верхнем углу. Во всплывающем меню нажмите «Заблокировать», а потом ещё раз для подтверждения.

  • Для блокировки пользователя в Телеграмме нужно открыть чат с ним, нажать на его имя и выбрать «Заблокировать» в профиле.
  • Владельца группы или канала невозможно заблокировать или разблокировать.
  • Чтобы заблокировать участника группы в Телеграмме, нужно открыть меню Участников, навести курсор на имя нужного участника и выбрать «Заблокировать участника».
  • Для блокировки абонента в Телеграмме нужно зайти в Настройки, далее в Конфиденциальность и выбрать «Чёрный список», где можно выбрать нужного человека и подтвердить блокировку.
  • Чтобы заблокировать бота в Телеграмме, нужно попросить поддержку бота удалить аккаунт, после чего удалить бота из списка чатов.
  • При блокировке пользователя в Телеграмме, собеседник не получает оповещения о запрете на сообщения или звонки.
  • Для блокировки контакта в Телеграмме нужно открыть его профиль, выбрать «Заблокировать» и подтвердить действие.
  • Для блокировки пользователя в Телеграм боте нужно открыть переписку с ним, нажать на его ник, выбрать «Заблокировать пользователя» и подтвердить действие.
  1. Можно ли заблокировать подписчика в Телеграм канале
  2. Как заблокировать участника группы в телеграмме
  3. Можно ли в ТГ заблокировать человека
  4. Можно ли заблокировать абонента в телеграмме
  5. Как заблокировать человека в телеграмме в боте
  6. Что видит собеседник Если заблокировать в телеграмме
  7. Можно ли заблокировать в ТГ
  8. Как забанить человека в Телеграм боте
  9. Как заблокировать через бота в телеграмме
  10. Как заблокировать чат бота в телеграмме
  11. Что будет если заблокировать пользователя в телеге

Можно ли заблокировать подписчика в Телеграм канале

Вы не можете заблокировать или разблокировать владельца группы или канала.

Как заблокировать участника группы в телеграмме

Как заблокировать участников группы:

1. В меню слева нажмите Участники.
2. Наведите указатель на имя нужного участника и установите флажок.
3. Нажмите на значок «Заблокировать участника».

Можно ли в ТГ заблокировать человека

Как заблокировать участника группы или канала Telegram:

Укажите действие «Заблокировать в группе или канале» и выберите группу или канал из списка.

Можно ли заблокировать абонента в телеграмме

Зайдите в «Настройки» → «Конфиденциальность». Откройте пункт «Чёрный список» и тапните «Заблокировать». Выберите человека в списке диалогов или среди контактов и подтвердите блокировку.

Как заблокировать человека в телеграмме в боте

Если вы всё же решили навсегда прекратить отношения с ботом, остановить его и убрать из своего списка чатов, то вот что нужно делать:

1. Попросите поддержку бота удалить ваш аккаунт.
2. Найдите бота в списке чатов, смахните влево и выберите Delete.
3. Выберите Delete and Stop.

Что видит собеседник Если заблокировать в телеграмме

Отметим, что в случае занесения вас в «черный список» вы об этом прямо никогда не узнаете — разве что собеседник сам сообщит вам этот прискорбный факт. В чате не будет никаких оповещений о блокировке или запретов на сообщения или звонки.

Можно ли заблокировать в ТГ

Нажмите на имя нужного контакта, перейдите к его профилю; перейдите к настройкам (три точки вверху страницы); выберите «Заблокировать»; подтвердите действие.

Как забанить человека в Телеграм боте

Откройте переписку с человеком, которого хотите заблокировать, и кликните по его нику. Нажмите кнопку «Ещё», выберите «Заблокировать пользователя» и подтвердите действие, повторно нажав «Заблокировать».

Как заблокировать через бота в телеграмме

Можно также заблокировать робота, перейдя на его страницу и вызвав меню действий, где имеется соответствующая кнопка; если приложение установлено на компьютере, ненужный аккаунт удаляется нажатием правой кнопкой мышки и выбором из выплывающего меню кнопки «Stop and block bot».

Как заблокировать чат бота в телеграмме

Как отключить и удалить чат-бот Telegram:

Перейдите в раздел «Чат-боты» > «Управление ботами». В списке подключенных ботов найдите нужный чат-бот. В выпадающем списке выберите «Отвязать». Обратите внимание, что все виджеты связанные с ботом будут неактивны, а авторассылки остановлены.

Что будет если заблокировать пользователя в телеге

После бана человек не сможет присылать вам никакие сообщения, включая фото, видео и аудио. Или, если быть точнее, они будут отправляться на сервер, но не доставятся вам. То же самое касается голосовых вызовов: при попытке позвонить не появятся даже гудки.

26.05.2023 Как заблокировать пользователя в боте в телеграмме

Сегодня мессенджер Telegram считается одним из самых популярных сервисов для обмена сообщениями в мире. Он предоставляет множество функций, которые позволяют пользователям настроить свои настройки приватности, в том числе опцию блокировки других пользователей.

Для блокировки пользователя в Telegram нужно зайти в чат с нужным пользователем и нажать на его имя. Далее, в профиле этого пользователя, нужно тапнуть на три точки в правом верхнем углу. Во всплывающем меню нужно выбрать опцию «Заблокировать» и подтвердить действие. Также можно заблокировать участника группы: для этого нужно выбрать действие «Заблокировать в группе или канале» и выбрать нужное место в списке.

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

Если вы желаете заблокировать бота в Telegram, то вам нужно попросить поддержку бота удалить ваш аккаунт и затем удалить бота из своего списка чатов.

Итак, блокировка пользователей на Telegram очень проста и позволяет сохранить конфиденциальность своих сообщений и контактов. Блокировка бота, конечно, уже не такая простая задача, но здесь также есть свои инструкции. В целом, благодаря высокому уровню приватности и безопасности, Telegram продолжает быть одним из наиболее популярных мессенджеров в мире.

Как заблокировать или разблокировать участника группы или канала в Telegram

С помощью чат-ботов Telegram вы можете заблокировать или разблокировать участника группы или канала. К примеру, вы можете заблокировать участников группы, от которых не поступила оплата за заказанный товар или услугу.

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

Содержание

Какие существуют группы и каналы в Telegram

В Telegram вы можете создать группу и канал. Группы и каналы могут быть частными и публичными. Дополнительно для частных групп вы можете включить историю чата — таким образом новые пользователи могут прочитать всю историю сообщений.

В зависимости от типа группы или канала, блокировка и разблокировка работает разными способами.

В таблице рассмотрим основные отличия групп и каналов Telegram.

Особенность Частная группа с выключенной историей чата Частная группа с включенной историей чата Публичная группа Частный канал Публичный канал
Публикация сообщений могут публиковать все участники, сообщения подписываются именем участника группы может публиковать только администратор, сообщения подписываются названием канала или настроенной подписью администратора
Доступ к профилям других участников участники могут видеть профили друг друга участники не могут видеть профили друг друга
Уведомления о новых участниках отображаются для всех участников отображаются только для администратора
История сообщений для новых участников закрыта доступ к сообщениям с момента создания группы или канала
Типы ссылок ссылка-приглашение вида https://t.me/+a12bcEd3F45gH67i : постоянная, временная или с ограничением на число использований публичная ссылка вида t.me/group_name или ссылка-приглашение вида https://t.me/+a12bcEd3F45gH67i : временная или с ограничением на число использований ссылка-приглашение вида https://t.me/+a12bcEd3F45gH67i : постоянная, временная или с ограничением на число использований публичная ссылка вида t.me/channel_name или ссылка-приглашение вида https://t.me/+a12bcEd3F45gH67i : временная или с ограничением на число использований
Поиск недоступна в поиске недоступна в поиске доступна в поиске недоступен в поиске доступен в поиске

Как изменить тип группы и канала в Telegram

Чтобы изменить тип группы в Telegram, перейдите к настройкам вашей группы. В мобильном приложении нажмите на иконку группы в правом верхнем углу и выберите «Изменить». В десктопной версии приложения нажмите на три точки в правом верхнем углу и выберите «Управление группой».

Нажмите «Тип группы». Для типа «Частный» вы увидите ссылку-приглашение, которую можно отправлять пользователям. Для типа «Публичный» введите ссылку, по которой пользователи смогут перейти или найти группу в поиске.

Чтобы включить историю чата для частной группы, в настройках вашей группы нажмите «История чата» и выберите «Видна».

Чтобы изменить тип канала в Telegram, в настройках вашего канала нажмите «Изменить» и выберите «Тип канала». Для типа «Частная» вы увидите ссылку-приглашение, которую можно отправлять пользователям. Для типа «Публичная» введите ссылку, по которой пользователи смогут перейти или найти канал в поиске.

Как заблокировать участника группы или канала Telegram

Перетащите элемент «Действие» с левой панели в рабочую область. Соедините его с элементом, после выполнения которого нужно заблокировать участника. В нашем примере это «Фильтр».

Укажите действие «Заблокировать в группе или канале» и выберите группу или канал из списка.

Как работает блокировка для группы и канала в Telegram

Частная группа

Заблокированные участники частной группы не будут удалены из группы, но не будут видеть новые сообщения от других участников, не смогут больше отправлять сообщения в группу или найти группу в поиске. Они смогут зайти в такую группу по ссылке-приглашению.

Частная группа с включенной историей чата

Заблокированные участники частной группы с включенной историей чата будут удалены из группы и не смогут зайти по ссылке-приглашению или найти группу в поиске.

Публичная группа

Заблокированные участники публичной группы будут удалены из группы, не смогут зайти по публичной ссылке или ссылке-приглашению. Они смогут найти группу в поиске, но не смогут на нее подписаться.

Частный канал

Заблокированные участники частного канала будут удалены из канала и не смогут зайти по ссылке-приглашению или найти канал в поиске.

Публичный канал

Заблокированные участники публичного канала будут удалены из канала, не смогут зайти по публичной ссылке или ссылке-приглашению. Они смогут найти канал в поиске, но не смогут на него подписаться.

Как разблокировать участника группы или канала Telegram

Чтобы разблокировать участника, укажите действие «Разблокировать в группе или канале» и выберите группу или канал из списка.

Рекомендуем добавить блок «Сообщение» с публичной ссылкой или ссылкой-приглашением для входа в группу или канал после действия «Разблокировать в группе или канале», чтобы пользователь мог зайти в него после разблокировки.

Как работает разблокировка для группы и канала в Telegram

Частная группа

Разблокированные участники частной группы смогут зайти в группу по ссылке-приглашению и найти группу в поиске после подписки. Они не смогут просмотреть историю сообщений за тот период, когда были заблокированы.

Частная группа с включенной историей чата

Разблокированные участники частной группы с включенной историей чата смогут зайти в канал по ссылке-приглашению, найти группу в поиске после подписки, а также просмотреть историю сообщений за тот период, когда были заблокированы.

Публичная группа

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

Частный канал

Разблокированные участники частного канала смогут зайти в канал по ссылке-приглашению и просмотреть историю сообщений за тот период, когда были заблокированы, но не смогут найти канал в поиске до подписки.

Публичный канал

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

Особые апдейты¶

Почти все виды событий в Telegram имеют какое-то внешнее представление для юзера. Служебные сообщения, обычные, колбэки, инлайн-режим. но есть два вида апдейтов, предназначенные именно для самих ботов. Речь пойдёт о my_chat_member и chat_member

Когда-то давным-давно боты в группах существовали в «информационном вакууме»: банально на любые модераторские действия, будь то баны или ограничения, необходимо было проверять права вызывающего юзера через методы getChatMember или getChatAdministrators, да ещё и кэшировать на небольшой промежуток времени, дабы не упереться в лимиты Bot API, точные значения которых [лимитов] по-прежнему остаются тайной за семью печатями.

Или, например, какой-нибудь хитрый юзер добавлял бота в группу, убирал у того право писать и начинал дёргать команды, ожидая, что бот не обрабатывает такую ошибку и сломается. А уж с отправкой в личку вообще весело: не зная точно, какая активная аудитория бота, разработчику приходилось либо отправлять какое-нибудь сообщение по списку пользователей в своей базе, либо, что чуть гуманнее, отправлять этим юзерам какой-нибудь ChatAction, типа «печатает…»; как выяснилось, тем, кто заблокировал бота, это самое «печатает…» не придёт, вернув ошибку от Bot API.

В марте 2021 года ситуация кардинально изменилась в лучшую сторону с релизом обновления Bot API v5.1, в котором добавилось два новых типа апдейтов: my_chat_member и chat_member . Оба апдейта внутри содержат объект одного и того же типа ChatMemberUpdated. Разница между этими двумя событиями следующая:

  • my_chat_member . Здесь всё, что касается непосредственно бота, либо ЛС юзера с ботом: (раз)блокировки бота юзером в ЛС, добавление бота в группу или канал, удаление оттуда, изменение прав бота и его статуса в разных чатах и т.д.
  • chat_member . Содержит все изменения состояния пользователей в группах и каналах, где бот состоит в качестве администратора: приход/уход юзеров в группы, подписки/отписки в каналах, изменение прав и статусов пользователей, назначение/снятие админов и многое другое.

По умолчанию Telegram не присылает ботам апдейты chat_member , их приём надо включить отдельно. Подробнее — в соответствующем разделе

В данной главе мы попробуем рассмотреть эти апдейты на наиболее часто необходимых задачах, однако перед переходом к следующим разделам настоятельно рекомендую ознакомиться с этой страницей из документации aiogram 3.x.

Объект ChatMemberUpdated¶

Сам по себе объект ChatMemberUpdated заслуживает отдельного внимания. Чтобы изучить его поближе, предположим, в некоторой группе администратор Алиса забанила обычного участника Витю. С полями chat и date всё очевидно, их пропустим.

Поле from (в вашем Python-коде это будет from_user ) содержит информацию о субъекте действия. В нашем случае, субъект действия — это Алиса, поэтому во from ( from_user ) будет объект User с данными об Алисе.

old_chat_member и new_chat_member . Под этими полями скрываются «состояния» объекта действия ДО и ПОСЛЕ события. Соответственно, в old_chat_member будет объект с типом ChatMemberMember (это не опечатка), и полем user с информацией о Вите, а в new_chat_member — объект ChatMemberBanned с полем user всё про того же несчастного Виктора.

Наконец, если в группу или канал вступила условная Маша, то в объекте ChatMemberUpdated будет непустое поле invite_link , с типом ChatInviteLink и сведениями о том, по какой именно пригласительной ссылке она пришла.

О пригласительных ссылках

Здесь стоит сделать важную ремарку: каждый администратор группы/канала (включая ботов) может создать множество пригласительных ссылок с разными параметрами. Если бот «поймал» вступление участника по созданной им [ботом] же ссылке, то в поле invite_link объекта ChatInviteLink будет видна ссылка целиком (без https://t.me , разумеется). Но если участник пришёл по ссылке другого администратора, то бот увидит только первую часть, вторая будет заменена на многоточие.

Вероятнее всего, это сделано для того, чтобы боты не могли отправлять кому попало пригласительные ссылки, созданные другими администраторами чата.

Кстати, по какой-то странной телеграмной логике, если вступить в публичную группу по пригласительной ссылке (даже не по юзернейму), то бот не увидит ссылку (получит None ). Телега ��‍♂️

Апдейт my_chat_member¶

Баны/разбаны в ЛС¶

В профильных чатах периодически возникает вопрос: «как сделать рассылку пользователям бота, если кто-то мог его заблокировать?». Разумеется, первым и главным советом будет: «создай канал», потому что каналы — это лучший способ информировать пользователей о чём-либо.

Но если вы всё же твёрдо решили, что будете делать рассылку пользователям прямо через бота, то существует три основных способа актуализации действующих пользователей бота:

  1. Непосредственно во время совершения рассылки путём отлова ошибок отправки и внесения изменений в базу данных пользователей.
  2. Через периодическую отправку какого-либо ChatAction, например, «печатает» по списку пользователей.
  3. Прослушиванием апдейта my_chat_member.

Сейчас нас интересует только п.3. Научимся с помощью my_chat_member определять, что пользователь заблокировал или разблокировал бота. Но прежде, чем попробуем «магию» aiogram, разберёмся, как упомянутые ситуации выглядят в самом Bot API. Для этого остановим процесс с ботом, откроем диалог с ним в Telegram и последовательно заблокируем и разблокируем, используя опции в UI мессенджера. Далее откроем веб-браузер или какой-нибудь Insomnia/Postman и перейдём по ссылке https://api.telegram.org/bot/getupdates , чтобы увидеть ещё не обработанные сообщения в формате JSON.

Итак, вот что приходит боту, когда кто-то его блокирует:

Пользователь заблокировал бота

На что надо обратить внимание:

  • Событие my_chat_member произошло в ЛС с пользователем Groosha (chat_id равен моему Telegram ID).
  • Инициатор (субъект) события — тоже Groosha.
  • В поле old_chat_member видно, над кем произведено действие (над ботом) и какой статус бота в ЛС был ДО: «member», т.е. бот НЕ был заблокирован ранее.
  • В поле new_chat_member содержимое user то же самое, а вот статус уже «kicked», т.е. ПОСЛЕ события бот был заблокирован пользователем.

То есть, бот в ЛС с Groosha совершил переход своего состояния из «member» в «kicked». Теперь посмотрим, что пришло от Telegram после разблокировки:

Пользователь разблокировал бота

Этот скриншот похож на предыдущий, но если присмотреться, то можно заметить разницу: другой update_id (увеличился на единицу), а также статусы ДО и ПОСЛЕ поменялись местами. Бот в ЛС с Groosha совершил переход из «kicked» в «member».
Кроме того, обычно рядом будет ещё один апдейт уже с типом message и с командой /start в содержимом. Официальные клиенты при разблокировке бота сразу отправляют команду /start , но не стоит на это полагаться: подобные действия остаются на откуп клиентам, которые могут вести себя по-разному.

Теперь научимся реагировать на такие события через aiogram на простом примере: пусть у нас есть список из двух активных пользователей бота с айди 111 и 222. По команде /start добавим юзера в список рассылки, а по команде /users будем выводить айди тех, кто не заблокировал бота (другими словами, при блокировке бота будем убирать айди из списка, а при разблокировке снова добавим).

Вот готовый роутер под вышеописанные условия:

handlers/in_pm.py

from aiogram import F, Router from aiogram.filters.chat_member_updated import \ ChatMemberUpdatedFilter, MEMBER, KICKED from aiogram.filters.command import \ CommandStart, Command from aiogram.types import ChatMemberUpdated, Message router = Router() router.my_chat_member.filter(F.chat.type == "private") router.message.filter(F.chat.type == "private") # Исключительно для примера! # В реальной жизни используйте более надёжные # источники айди юзеров users = 111, 222> @router.my_chat_member( ChatMemberUpdatedFilter(member_status_changed=KICKED) ) async def user_blocked_bot(event: ChatMemberUpdated): users.discard(event.from_user.id) @router.my_chat_member( ChatMemberUpdatedFilter(member_status_changed=MEMBER) ) async def user_unblocked_bot(event: ChatMemberUpdated): users.add(event.from_user.id) @router.message(CommandStart()) async def cmd_start(message: Message): await message.answer("Hello") users.add(message.from_user.id) @router.message(Command("users")) async def cmd_users(message: Message): await message.answer("\n".join(f"• user_id>" for user_id in users)) 

Обратите внимание: для хэндлеров на апдейт my_chat_member мы используем фильтр ChatMemberUpdatedFilter с указанием отлавливаемого результата ПОСЛЕ (т.е. атрибут new_chat_member у апдейта). Т.е. в данном случае нас не интересует, в каком состоянии был юзер ДО.

И вот как это выглядит на практике:

Добавление в группу¶

Ещё частый вопрос от начинающих разработчиков: «как поймать событие добавления бота в группу?». Что ж, давайте разбираться. Но перед этим посмотрим, какие вообще могут быть «статусы» пользователя:

  • creator (он же owner) — владелец чата. Судя по всему, бот не может иметь такой статус. Владелец безальтернативно имеет все возможные права в чате, кроме «анонимности», она переключается туда-сюда свободно.
  • administrator — любой другой администратор. В интерфейсе приложений можно убрать ему вообще все права, но он всё равно останется администратором и сможет, например, читать Recent Actions и игнорировать slow mode.
  • member — участник чата с правами по умолчанию. Узнать эти «права по умолчанию» в случае с группами можно, вызвав API-метод getChat и посмотрев поле permissions .
  • restricted — пользователь, ограниченный в каких-то правах. Например, находящийся в т.н. «read-only». ВАЖНО: в состоянии restricted юзер может как находиться в группе, так и не находиться, поэтому у ChatMemberRestricted надо дополнительно проверять флаг is_member .
  • left — «он улетел, но обещал вернуться», т.е. пользователь вышел из группы, но при желании может снова зайти. И на момент выхода он не был в состоянии restricted .
  • banned — пользователь забанен и не может вернуться самостоятельно, пока его не разбанят.

Имея под рукой вышеизложенную информацию, нетрудно догадаться, что событие «бота добавили в группу» — это переход из набора состояний в набор . Такой переход по-английски называется transition, и в aiogram 3.x уже есть заготовки.

Вариант №1: тупо перечислим все состояния ДО и ПОСЛЕ:

# Не забываем импорты: from aiogram.filters.chat_member_updated import \ ChatMemberUpdatedFilter, KICKED, LEFT, MEMBER, \ RESTRICTED, ADMINISTRATOR, CREATOR @router.my_chat_member( ChatMemberUpdatedFilter( member_status_changed= (KICKED | LEFT | -RESTRICTED) >> (+RESTRICTED | MEMBER | ADMINISTRATOR | CREATOR) ) ) 

Вертикальная черта означает «или», битовый оператор «>>» показывает направление перехода, а символы «плюс» и «минус» около RESTRICTED относятся к флагу is_member (плюс — True, минус — False).

Но разработчик aiogram пошёл дальше и обернул эти два набора в отдельные состояния IS_NOT_MEMBER и IS_MEMBER соответственно. Упростим наш код в виде варианта №2:

# Немного другие импорты from aiogram.filters.chat_member_updated import \ ChatMemberUpdatedFilter, IS_NOT_MEMBER, IS_MEMBER @router.my_chat_member( ChatMemberUpdatedFilter( member_status_changed= IS_NOT_MEMBER >> IS_MEMBER ) ) 

Но поскольку, повторюсь, такой переход довольно часто используется в ботах, то разработчик пошёл ещё дальше и обернул такой переход в виде переменной JOIN_TRANSITION , получив вариант №3:

# И ещё меньше импортов from aiogram.filters.chat_member_updated import \ ChatMemberUpdatedFilter, JOIN_TRANSITION @router.my_chat_member( ChatMemberUpdatedFilter( member_status_changed=JOIN_TRANSITION ) ) 

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

Теперь создадим ещё один роутер, под которым будут два хэндлера, реагирующие на добавление бота в группу или супергруппу в роли администратора и обычного участника. При добавлении будем отправлять в чат сводную информацию о том, куда добавили бота:

handlers/bot_in_group.py

from aiogram import F, Router from aiogram.filters.chat_member_updated import \ ChatMemberUpdatedFilter, IS_NOT_MEMBER, MEMBER, ADMINISTRATOR from aiogram.types import ChatMemberUpdated router = Router() router.my_chat_member.filter(F.chat.type.in_("group", "supergroup">)) chats_variants =  "group": "группу", "supergroup": "супергруппу" > # Не удалось воспроизвести случай добавления бота как Restricted, # поэтому примера с ним не будет @router.my_chat_member( ChatMemberUpdatedFilter( member_status_changed=IS_NOT_MEMBER >> ADMINISTRATOR ) ) async def bot_added_as_admin(event: ChatMemberUpdated): # Самый простой случай: бот добавлен как админ. # Легко можем отправить сообщение await event.answer( text=f"Привет! Спасибо, что добавили меня в " f'chats_variants[event.chat.type]> "event.chat.title>" ' f"как администратора. ID чата: event.chat.id>" ) @router.my_chat_member( ChatMemberUpdatedFilter( member_status_changed=IS_NOT_MEMBER >> MEMBER ) ) async def bot_added_as_member(event: ChatMemberUpdated): # Вариант посложнее: бота добавили как обычного участника. # Но может отсутствовать право написания сообщений, поэтому заранее проверим. chat_info = await bot.get_chat(event.chat.id) if chat_info.permissions.can_send_messages: await event.answer( text=f"Привет! Спасибо, что добавили меня в " f'chats_variants[event.chat.type]> "event.chat.title>" ' f"как обычного участника. ID чата: event.chat.id>" ) else: print("Как-нибудь логируем эту ситуацию") 

Но, как и всегда, есть нюанс, и чтобы его увидеть, надо добавить бота в группу, а затем сконвертировать её в супергруппу. Для наглядности, я создал группу со своим ботом @my_id_bot, а затем добавил туда тестового бота с кодом, описанным выше. Внимание на картинку:

конвертация группы в супергруппу

Ой, почему-то бот отреагировал так, как будто его только что добавили, хотя вроде как ничего не изменилось. На деле, конвертация группы в супергруппу для бота выглядит как добавление в новый чат. К счастью, в этом случае боту также приходит Message с непустыми полями migrate_from_chat_id и migrate_to_chat_id . А дальше дело за малым: при срабатывании события my_chat_member на добавление в супергруппу проверять, что за последнее время (скажем, за пару секунд) не было сообщений с непустым полем migrate_to_chat_id .

Решение практически полностью повторяет описанные выше примеры и более того, реализовано в моём @my_id_bot: вот так (звёздочки на гитхабе всячески приветствуются)

Группы и супергруппы

Вопреки частому заблуждению, обычные группы по-прежнему существуют и никуда исчезать не собираются. Официальные клиенты Telegram исходно создают именно обычную группу, которая неявно при наступлении некоторого события конвертируется в супергруппу. И есть серьёзные подозрения, что такое поведение в ближайшие годы не изменится, особенно в свете того, что на обычные (не-премиум) учётки действует лимит на участие в 500 супергруппах и каналах суммарно.

При конвертации, помимо смены ID чата, присутствуют также некоторые побочные эффекты, поэтому зачастую проще всего после создания группы сразу её сделать супергруппой, получить окончательный айди и не париться. Полный список действий, приводящий к конвертации группы в супергруппу, можно увидеть здесь: https://t.me/tgbeta/3424.

Апдейт chat_member¶

Следующий особый тип апдейтов chat_member — хитрый. Дело в том, что он по умолчанию не отправляется Телеграмом, и чтобы Bot API его присылал, необходимо при вызове getUpdates или setWebhook передать список нужных типов событий. Например:

# тут импорты async def main(): # тут код dp = Dispatcher() bot = Bot("токен") await dp.start_polling( bot, allowed_updates=["message", "inline_query", "chat_member"] ) 

Тогда после запуска бота телега начнёт присылать три указанных типа событий, но без всех остальных.

Разработчики aiogram подошли к теме изящно: если явным образом не указывать allowed_updates , то фреймворк рекурсивно пройдёт по всем роутерам, начиная с диспетчера, просмотрит хэндлеры и самостоятельно соберёт список желаемых для получения апдейтов. Хотите переопределить это поведение? Передавайте allowed_updates явно.

Почему мне не приходит апдейт .

В профильных чатах регулярно спрашивают: «Мой код не работает, не реагирует на событие, почему?»

Первое, что стоит сделать — убедиться, что нужный апдейт вообще приходит боту. Иными словами, проверить, с каким allowed_updates был вызван поллинг/вебхуки в последний раз. Проще всего это сделать прямо в браузере:

  1. Взять токен бота, назовём его AAAAA
  2. Сформировать ссылку вида https://api.telegram.org/botAAAAA/getWebhookInfo
  3. Перейти по ней

Далее внимательно изучить JSON в ответе. Если ключ allowed_updates присутствует, то убедиться, что желаемый тип апдейтов есть в списке. Если ключа нет, это равнозначно «приходит всё, кроме chat_member »

Актуализация списка админов в группах¶

Частая проблема ботов-модераторов: как на вызываемые команды наложить проверку прав доступа. К примеру, как сделать так, чтобы банить участников по команде /ban могли только администраторы группы.

Первая и наивная мысль — каждый раз вызывать getChatMember, чтобы определить статус вызывающего юзера в группе. Вторая мысль — закэшировать это знание на короткое время. Третья и более правильная идея — при старте бота получить список админов, а дальше слушать апдейты chat_member об изменении их состава и редактировать список самостоятельно. Бот перезапустился? Не беда, снова получили актуальный список и работаем с ним.

Напишем роутер, в котором будем следить за изменением состава админов и обновлять переданный извне список (точнее, в терминах python это будет множество, оно же Set):

handlers/admin_changes_in_group.py

from aiogram import F, Router from aiogram.filters.chat_member_updated import \ ChatMemberUpdatedFilter, KICKED, LEFT, \ RESTRICTED, MEMBER, ADMINISTRATOR, CREATOR from aiogram.types import ChatMemberUpdated from config_reader import config router = Router() router.chat_member.filter(F.chat.id == config.main_chat_id) @router.chat_member( ChatMemberUpdatedFilter( member_status_changed= (KICKED | LEFT | RESTRICTED | MEMBER) >> (ADMINISTRATOR | CREATOR) ) ) async def admin_promoted(event: ChatMemberUpdated, admins: set[int]): admins.add(event.new_chat_member.user.id) await event.answer( f"event.new_chat_member.user.first_name> " f"был(а) повышен(а) до Администратора!" ) @router.chat_member( ChatMemberUpdatedFilter( # Обратите внимание на направление стрелок # Или можно было поменять местами объекты в скобках member_status_changed= (KICKED | LEFT | RESTRICTED | MEMBER)  <(ADMINISTRATOR | CREATOR) ) ) async def admin_demoted(event: ChatMemberUpdated, admins: set[int]): admins.discard(event.new_chat_member.user.id) await event.answer( f"event.new_chat_member.user.first_name> " f"был(а) понижен(а) до обычного юзера!" ) 

Теперь напишем другой роутер с хэндлером на команду /ban . В самом хэндлере будем проверять наличие айди вызывающего во множестве admins и исходя из этого разрешать или запрещать бан:

handlers/events_in_group.py

from aiogram import Router, F from aiogram.filters.command import Command from aiogram.types import Message router = Router() # Вообще говоря, можно на роутер навесить кастомный фильтр # с проверкой, лежит ли айди вызывающего во множестве admins. # Тогда все хэндлеры в роутере автоматически будут вызываться # только для людей из admins, это сократит код и избавит от лишнего if # Но для примера сделаем через if-else, чтобы было нагляднее @router.message(Command("ban"), F.reply_to_message) async def cmd_ban(message: Message, admins: set[int]): if message.from_user.id not in admins: await message.answer( "У вас недостаточно прав для совершения этого действия" ) else: await message.chat.ban( user_id=message.reply_to_message.from_user.id ) await message.answer("Нарушитель заблокирован") 

Осталось зарегистрировать роутеры в основном файле и подгрузить список админов при старте. Собственно, вот полное содержимое, вместе со всеми предыдущими правками.

import asyncio import logging from aiogram import Bot, Dispatcher from config_reader import config from handlers import in_pm, bot_in_group, admin_changes_in_group, events_in_group async def main(): logging.basicConfig( level=logging.INFO, format="%(asctime)s - %(levelname)s - %(name)s - %(message)s", ) dp = Dispatcher() bot = Bot(config.bot_token.get_secret_value(), parse_mode="HTML") dp.include_routers( in_pm.router, events_in_group.router, bot_in_group.router, admin_changes_in_group.router ) # Подгрузка списка админов admins = await bot.get_chat_administrators(config.main_chat_id) admin_ids = admin.user.id for admin in admins> await dp.start_polling(bot, admins=admin_ids) if __name__ == '__main__': asyncio.run(main()) 

Теперь посмотрим, что в итоге получилось. Пробуем вызвать команду /ban не-админом:

У пользователя не хватает прав

Идём в настройки группы и назначаем Артура администратором (бот увидит изменение и сообщит об этом в чате):

Теперь прав достаточно

Отзовём права админа у подопытного пациента и попросим его ещё раз вызвать команду /ban :

Прав снова не хватает

Теперь вы знаете, как работать с этими «невидимыми» апдейтами, ура! Напоследок, порекомендую ознакомиться с ещё одним демонстрационным ботом, в котором используются некоторые вышеописанные фишки.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *