Pull to refresh

Добавили бота в свой Telegram канал? Будьте готовы с ним попрощаться

Level of difficultyEasy
Reading time3 min
Views37K

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

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

Почти все администраторы Telegram-каналов пользуются сторонними ботами от разных сервисов вроде Telemetr или Telepost и аналогичных. Причем сервисы часто специально навязывают добавление своего бота в канал. Например, всевозможные биржи рекламы вообще отказываются работать с каналом без наличия их бота - без него нельзя автоматизировать публикацию рекламы.

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

Редактирование прав из официального клиента Telegram
Редактирование прав из официального клиента Telegram

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

С точки зрения Telegram API удаление подписчика из чата выглядит как бан с помощью API-метода editBanned. Т.е технически у всех ботов, которые попадают в канал, есть "несгораемые" права по бану участников.

Самое странное в этой ситуации то, что в Telegram API присутствует "скрытая" возможность отнимать у ботов права на удаление подписчиков, но в официальной версии Telegram она скрыта из интерфейса:

Неофициальная возможность в официальном API
Неофициальная возможность в официальном API

Если же сделать этот API-запрос вручную, "насильно" выставив настройкуban_users, то обнаружится, что сервера Telegram по какой-то причине игнорируют её. Скорее всего, из-за этого настройка и отсутствует в официальных клиентах, хотя появилась она очень давно - можно посмотреть по истории TL Layer.

Как защищитить Telegram канал от накрутки? Пока Telegram не предлагает ничего лучше, чем написать собственный скрипт на основе Telegram API, который бы мониторил все удаления подписчиков в канале ботами и банил бы их. К счастью, банить подписчиков боты могут только пачками по 200 (ограничение Telegram на просмотр последних подписчиков канала), поэтому как только какой-то бот забанит первого подписчика, такого бота можно незамедлительно выбрасывать из канала. Это позволит не потерять всех подписчиков за несколько секунд.

Проблема тут только в том, что Telegram API не позволяет одним ботам банить других ботов, из-за чего скрипт мониторинга придется запускать от имени Telegram-пользователя, а не от имени Telegram-бота. С другой стороны, Telegram отправляет уведомления об удалении пользователей из каналов только ботам, а обычным пользователям - не отправляет?. Из-за всей этой неразберихи в API рабочая схема защиты будет выглядить так:

  1. Добавляем в канал своего бота, который будет мониторить удаления подписчиков другими ботами

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

Код с использованием библиотеки 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())

Есть и более простой, но менее надежный способ для администраторов Telegram-каналов. Но придется, как бы сюрреалистично это ни звучало...добавить в канал бота @channel_guardian_bot (tguard.pro) - он будет отслеживать все удаления подписчиков другими ботами и присылать уведомления. Если быстро среагировать, можно будет спасти существенную часть своей аудитории.

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

Tags:
Hubs:
Total votes 54: ↑51 and ↓3+67
Comments68

Articles