Боты Telegram могут без разрешения удалять подписчиков в канале. Как с этим бороться?
Читать первым в Telegram-канале «Код Дурова»
При добавлении в канал бота нельзя ограничить его в правах на удаление подписчиков, рассказал на «Хабре» пользователь @Asen, исследующий механизмы работы различных приложений.
По его словам, любые боты в Telegram-канале, которые технически в мессенджере разрешено добавлять только как администраторов, может «вычистить всю аудиторию канала за считаные минуты».
- Обычно каналы используют ботов для различных действий, например, планирования постов, сбора аналитики и автоматизации публикаций рекламы.
- Часто используются и боты от сервисов по типу Telemetr, Telepost. Администраторы каналов уверены, что боты будут выполнять только заявленные действия.
- Исследователь уверяет, что даже забрав у бота все права, он всё ещё будет оставаться администратором и иметь возможность читать любую информацию о канале, которая доступна администраторам.
Кроме того, у него останется и возможность удалять подписчиков:
С точки зрения Telegram API удаление подписчика из чата выглядит как блокировка с помощью API-метода editBanned. То есть технически у всех ботов, которые попадают в канал, есть «несгораемые» права по блокировке участников. Самое странное в этой ситуации то, что в Telegram API присутствует «скрытая» возможность отнимать у ботов права на удаление подписчиков, но в официальной версии Telegram она скрыта из интерфейса.
Исследователь объяснил, что если сделать этот API-запрос вручную, «насильно» выставив настройку ban_users
, то можно обнаружить, что сервера Telegram проигнорируют её:
Скорее всего, из-за этого настройка и отсутствует в официальных клиентах, хотя появилась она очень давно — можно посмотреть по истории TL Layer.
Действительно ли всё так плохо?
Константин Цуканов, технический директор конструктора ботов Botmother подтвердил «Коду Дурова», что соответствующей настройки при добавлении бота действительно нет — удаление пользователей и правда остаётся ему доступно:
Если посмотреть в логах недавних действий администраторов, то бот добавляется с правами блокировки, даже если выключить все переключатели. При этом, если добавлять бота администраторов в группу, а не канал, там переключатель на запрет блокировки пользователей будет.
Цуканов подчеркнул, что можно легко выяснить, какой бот начал удалять пользователей из канала, посетив логи (раздел «Недавние действия» в меню «Администраторы»). Такие пользователи появляются в списке заблокированных на канале — «с проблемами, но их можно оттуда достать».
Как решается проблема?
Технический директор конструктора ботов Botmother Константин Цуканов заявил «Коду Дурова», что для подстраховки можно создать собственного бота, который будет собирать идентификаторы всех пользователей, которые подписываются на канал:
В случае появления бота, который устроит массовый бан, можно заметить его в логах и удалить, а затем при помощи своего бота по этой базе разблокировать попавших под удаление пользователей через Telegram Bot API.
В своей заметке @Asen подчеркнул, что Telegram API сегодня не позволяет одним ботам блокировать других ботов. Именно поэтому скрипт мониторинга необходимо запускать от имени Telegram-пользователя:
К счастью, банить подписчиков боты могут только пачками по 200 (ограничение Telegram на просмотр последних подписчиков канала), поэтому как только какой-то бот забанит первого подписчика, такого бота можно незамедлительно выбрасывать из канала. Это позволит не потерять всех подписчиков за несколько секунд.
Исследователь тоже советует добавить в канал своего бота, который будет мониторить удаления подписчиков другими ботами. Если было обнаружено удаление, следует удалить обнаруженного бота от имени второго аккаунта — пользователя.
Примерный код с использованием библиотеки Pyrogram для защиты канала:
# аккаунт бота
bot = Client(...)
async def banBastard(channelId, botId):
# запускаем аккаунт пользователя для удаления паршивца
user = Client(...)
async with user:
await user.ban_chat_member(channelId, botId)
# callback получения нотификаций об удалении пользователей в каналах, куда добавлен бот
@bot.on_chat_member_updated()
async def onMemberHandler(client, update):
banned = update.new_chat_member.status == enums.ChatMemberStatus.BANNED
byBot = update.new_chat_member.restricted_by.is_bot
if banned and byBot:
await banBastard(update.chat.id,
update.new_chat_member.restricted_by.id)
# запускаем бота для прослушивания нотификаций об удалении пользователей
async def main():
async with bot:
while True:
await asyncio.sleep(1)
bot.run(main())