Изучая безопасность мессенджера Telegram, меня поразила одна его "особенность" при работе с
Добавлять ботов в Telegram-каналы можно только как администраторов с целью автоматизации выполнения различных сервисных действий - например, планирование публикации постов и сбор всевозможной аналитики по каналу.
Почти все администраторы Telegram-каналов пользуются сторонними ботами от разных сервисов вроде Telemetr или Telepost и аналогичных. Причем сервисы часто специально навязывают добавление своего бота в канал. Например, всевозможные биржи рекламы вообще отказываются работать с каналом без наличия их бота - без него нельзя автоматизировать публикацию рекламы.
Таким образом администаторы добавляют к себе в канал бота за ботом, уповая на то, что следующая настройка прав не оставляет ботам никаких возможностей, кроме как работать с постами:
Редактирование прав из официального клиента Telegram
Однако, даже забрав у бота все права, доступные для редактирования из официального клиента, бот все еще будет оставаться администратором и иметь возможность не только читать любую администраторскую информацию о канале, но и выкидывать подписчиков.
С точки зрения Telegram API удаление подписчика из чата выглядит как бан с помощью API-метода
Самое странное в этой ситуации то, что в Telegram API присутствует
Неофициальная возможность в официальном API
Если же сделать этот API-запрос вручную, "насильно" выставив настройкуban_users, то обнаружится, что сервера Telegram по какой-то причине игнорируют её. Скорее всего, из-за этого настройка и отсутствует в официальных клиентах, хотя появилась она очень давно - можно посмотреть по
Как от этого защищаться? Пока Telegram не предлагает ничего лучше, чем написать собственный скрипт на основе Telegram API, который бы мониторил все удаления подписчиков в канале ботами и банил бы их. К счастью, банить подписчиков боты могут только пачками по 200 (ограничение Telegram на просмотр последних подписчиков канала), поэтому как только какой-то бот забанит первого подписчика, такого бота можно незамедлительно выбрасывать из канала. Это позволит не потерять всех подписчиков за несколько секунд.
Проблема тут только в том, что Telegram API не позволяет одним ботам банить других ботов, из-за чего скрипт мониторинга придется запускать от имени Telegram-пользователя, а не от имени Telegram-бота. С другой стороны, Telegram отправляет уведомления об удалении пользователей из каналов только ботам, а обычным пользователям - не отправляет. Из-за всей этой неразберихи в API рабочая схема защиты будет выглядить так:
# аккаунт бота
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())
Есть и более простой, но менее надежный способ для администраторов Telegram-каналов. Но для этого придется, как бы сюрреалистично это ни звучало...добавить в канал бота
По какой причине разработчики Telegram не спешат с реализацией этой очевидно необходимой защиты на стороне сервере, я затрудняюсь ответить. Но пока их
Для просмотра ссылки необходимо нажать
Вход или Регистрация
- выяснилось, что при добавлении в канал бота никак нельзя ограничить его в правах на удаление подписчиков. То есть, говоря прямо, любой бот может вычистить всю аудиторию канала за считанные минуты.Добавлять ботов в Telegram-каналы можно только как администраторов с целью автоматизации выполнения различных сервисных действий - например, планирование публикации постов и сбор всевозможной аналитики по каналу.
Почти все администраторы Telegram-каналов пользуются сторонними ботами от разных сервисов вроде Telemetr или Telepost и аналогичных. Причем сервисы часто специально навязывают добавление своего бота в канал. Например, всевозможные биржи рекламы вообще отказываются работать с каналом без наличия их бота - без него нельзя автоматизировать публикацию рекламы.
Таким образом администаторы добавляют к себе в канал бота за ботом, уповая на то, что следующая настройка прав не оставляет ботам никаких возможностей, кроме как работать с постами:
Редактирование прав из официального клиента Telegram
Однако, даже забрав у бота все права, доступные для редактирования из официального клиента, бот все еще будет оставаться администратором и иметь возможность не только читать любую администраторскую информацию о канале, но и выкидывать подписчиков.
С точки зрения Telegram API удаление подписчика из чата выглядит как бан с помощью API-метода
Для просмотра ссылки необходимо нажать
Вход или Регистрация
. Т.е технически у всех ботов, которые попадают в канал, есть "несгораемые" права по бану участников.Самое странное в этой ситуации то, что в Telegram API присутствует
Для просмотра ссылки необходимо нажать
Вход или Регистрация
отнимать у ботов права на удаление подписчиков, но в официальной версии Telegram она скрыта из интерфейса:Неофициальная возможность в официальном API
Если же сделать этот API-запрос вручную, "насильно" выставив настройкуban_users, то обнаружится, что сервера Telegram по какой-то причине игнорируют её. Скорее всего, из-за этого настройка и отсутствует в официальных клиентах, хотя появилась она очень давно - можно посмотреть по
Для просмотра ссылки необходимо нажать
Вход или Регистрация
.Как от этого защищаться? Пока Telegram не предлагает ничего лучше, чем написать собственный скрипт на основе Telegram API, который бы мониторил все удаления подписчиков в канале ботами и банил бы их. К счастью, банить подписчиков боты могут только пачками по 200 (ограничение Telegram на просмотр последних подписчиков канала), поэтому как только какой-то бот забанит первого подписчика, такого бота можно незамедлительно выбрасывать из канала. Это позволит не потерять всех подписчиков за несколько секунд.
Проблема тут только в том, что Telegram API не позволяет одним ботам банить других ботов, из-за чего скрипт мониторинга придется запускать от имени Telegram-пользователя, а не от имени Telegram-бота. С другой стороны, Telegram отправляет уведомления об удалении пользователей из каналов только ботам, а обычным пользователям - не отправляет. Из-за всей этой неразберихи в API рабочая схема защиты будет выглядить так:
- Добавляем в канал своего бота, который будет мониторить удаления подписчиков другими ботами
- Если было обнаружено удаление, удаляем обнаруженного бота от имени второго аккаунта - пользователя
Для просмотра ссылки необходимо нажать
Вход или Регистрация
для защиты канала по такой схеме может выглядеть примерно так:# аккаунт бота
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())
Есть и более простой, но менее надежный способ для администраторов Telegram-каналов. Но для этого придется, как бы сюрреалистично это ни звучало...добавить в канал бота
Для просмотра ссылки необходимо нажать
Вход или Регистрация
Он будет отслеживать все удаления подписчиков другими ботами и присылать уведомления. Если быстро среагировать, можно будет спасти существенную часть своей аудитории.По какой причине разработчики Telegram не спешат с реализацией этой очевидно необходимой защиты на стороне сервере, я затрудняюсь ответить. Но пока их
Для просмотра ссылки необходимо нажать
Вход или Регистрация
будет выглядеть так, словно ничего, кроме сториз делать уже не осталось, администраторы Telegram-каналов спокойно спать не будут.
Для просмотра ссылки необходимо нажать
Вход или Регистрация