Кладбище юзеров: Как узнать, что пользователь заблокировал Телеграм-бота: отслеживаем блокировки на Python (Aiogram и python-telegram-bot)

Как правильно считать активных пользователей Телеграм-бота в 2026 году

Как научить Телеграм-бота автоматически удалять тех, кто его заблокировал и актуализировать статистику, отслеживая блокировки на Python (Aiogram / python-telegram-bot).

Разработчики и владельцы Telegram-ботов часто сталкиваются с проблемой: бот рапортует о 50 000 пользователях в базе, но при рассылке постов сервер зависает на полчаса, посты получают всего 3 000 просмотров, а логи трещат от ошибок Forbidden: bot was blocked by the user.

Дело в том, что пользователи получают от бота то, что хотели, и блокируют его. База данных пухнет от «мертвых душ», статистика врёт, а официальная партнерская программа Telegram показывает совершенно другие цифры активности.

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


Почему «тихая» очистка базы бота так важна?

Большинство начинающих разработчиков чистят базу варварским методом: запускают рассылку, алгоритм спотыкается о заблокированных юзеров, ловит Exception и только тогда меняет им статус в БД. Это плохой подход:

  1. Медленно: Telegram API ставит жесткие лимиты на сообщения (около 30 сообщений в секунду на всех юзеров). Попытки отправить сообщение в заблокированный чат расходуют этот лимит впустую.
  2. Риски бана: Отправка тысяч сообщений «в стену» может быть расценена анти-спам алгоритмами Telegram как подозрительная активность. Если ваш python telegram bot рассылает спам мертвым душам, есть риск блокировки самого токена.
  3. Неактуальная статистика: До момента следующей рассылки вы думаете, что ваша аудитория гораздо больше, чем она есть на самом деле.

Элегантное решение: используем my_chat_member

Телеграм уже давно умеет сам сообщать вашему серверу о том, что юзер его заблокировал или разблокировал. Для этого существует специальный тип апдейтов — my_chat_member (обновление статуса бота в чате или личной переписке).

Когда пользователь нажимает «Остановить бота» (Stop Bot), Telegram отправляет нам апдейт, в котором new_chat_member.status равен kicked. Когда пользователь снова нажимает /start — статус меняется на member.

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

Пример логики (на базе python-telegram-bot):

Если вы используете классическую библиотеку, вот как можно отловить событие, когда python telegram bot заблокирован пользователем:

from telegram import Update
from telegram.ext import ContextTypes, ChatMemberHandler

async def track_bot_blocks(update: Update, context: ContextTypes.DEFAULT_TYPE):
    result = update.my_chat_member
    
    # Проверяем, изменился ли статус бота
    if result.old_chat_member.status != result.new_chat_member.status:
        user_id = result.chat.id
        
        # Если юзер заблокировал бота
        if result.new_chat_member.status == "kicked":
            # Меняем статус в базе на неактивный
            await db.set_user_inactive(user_id)
            print(f"Пользователь {user_id} заблокировал бота. Отдыхай с миром.")
            
        # Если юзер разблокировал бота
        elif result.new_chat_member.status == "member":
            await db.set_user_active(user_id)
            print(f"Пользователь {user_id} снова с нами!")

# Не забудьте зарегистрировать хэндлер:
# application.add_handler(ChatMemberHandler(track_bot_blocks, ChatMemberHandler.MY_CHAT_MEMBER))

Aiogram: как отловить блокировку бота

Аналогичный механизм есть и в самом популярном фреймворке. Чтобы aiogram отловил блокировку бота, используйте встроенный фильтр статусов (kicked / member) через декоратор @router.my_chat_member():

from aiogram import Router
from aiogram.types import ChatMemberUpdated
from aiogram.filters import ChatMemberUpdatedFilter, KICKED, MEMBER

router = Router()

@router.my_chat_member(ChatMemberUpdatedFilter(member_status_changed=KICKED))
async def user_blocked_bot(event: ChatMemberUpdated):
    user_id = event.chat.id
    # Пользователь заблокировал бота -> отключаем в БД
    await db.set_user_inactive(user_id)

@router.my_chat_member(ChatMemberUpdatedFilter(member_status_changed=MEMBER))
async def user_unblocked_bot(event: ChatMemberUpdated):
    user_id = event.chat.id
    # Пользователь разблокировал бота -> включаем в БД
    await db.set_user_active(user_id)

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


Практический кейс: как мы реализовали это у себя в ReklamaPlan

Мы не просто храним статусы True/False где-то в недрах базы данных, но и интегрировали этот механизм прямо в интерфейс администратора нашего проекта — бота для автопостинга и рассылок ReklamaPlanBot.

Скриншот интерфейса панели управления: аудит базы пользователей и отслеживание блокировок Телеграм-бота

На скриншоте админ-панели видно два важных элемента:

  1. Мы выгружаем список пользователей, и те, кто заблокировал нашего бота, автоматически подсвечиваются красным фоном. Это позволяет визуально оценить процент «отвала» аудитории телеграм бота.
  2. Есть отдельная кнопка «Аудит базы», которая позволяет в один клик физически удалить «мертвые души» из БД.

Благодаря такому подходу наша статистика остаётся кристально чистой, а рассылки пользователям бота улетают в Telegram API без единой ошибки.

О нашем проекте: автоматизация для владельцев Телеграм-чатов

Кстати, если вам нужен не просто код, а готовый и мощный инструмент для вашего Telegram-канала — знакомьтесь с @ReklamaPlanbot Это профессиональный планировщик — бот для АвтоПостинга в телеграм, созданный специально для админов чатов и каналов, и заточенный под рекламные размещения, но не только!

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

  • Полный автопилот: отложенный постинг в 5+ чатов одновременно, строгий авто-закреп и авто-удаление по таймеру.
  • Smart Marketing: бот умет зарабатывать за вас. После покупки рекламодателем размещения в ваших каналах и чатах тг — @ReklamaPlanbot автоматически напоминает о том что можно докупить опции закрепа и пуша для увеличения охвата (в зависимости от того что не купил рекламодатель).
  • Перед тем как автоматически удалить рекламный пост, бот предложит заказчику докупить размещения или оставить пост навсегда (допродажи из воздуха).
  • Маркетплейс заявок: загрузите свой прайс-лист в бота, и вы сможете получать заявки (и деньги) от рекламодателей, которые уже пользуются нашим сервисом.
  • Обход лимитов Телеграм: устали от ограничения в 1024 символа под фото? Бот умеет обходить этот лимит — публикуйте огромные тексты (до 4096 символов) вместе с изображениями! Премиум Эмодзи и цветные кнопки — без платной подписки телеграм!
  • Быстрое создание задач: просто перешлите готовый рекламный пост (с текстом, видео, галереей и т.д.) в бота — и он моментально подхватит его как черновик. Никакой настройки с нуля.

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

🔗 Подробное описание бота и как его протестировать: https://ucmod.com/reklama-planner/