<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Aiogram удаление и чистка базы пользователей]]></title><description><![CDATA[<p dir="auto">Так, я столкнулся с такой проблемой, а точнее задачей.<br />
Мне необходимо было почистить базу пользователей моего бота на Aiogram.</p>
<p dir="auto">И так вот что я придумал (читайте коменты в коде):</p>
<pre><code class="language-python"># И так вот мой хендлер который отслеживает команду /clean
@main_router.message(Command("clean"))
async def handle_clean(message: types.Message):
    await clean_command(message, bot, user_db)
</code></pre>
<p dir="auto">Мой код разбит не только на блоки, но и отдельные файлы - у вас может быть по другому.<br />
Код выше это просто роут для функции <code>clean_command</code> которая находится в отдельном файле.</p>
<p dir="auto">Также может возникнуть вопрос для чего функция <code>handle_clean</code> - она не несет ничего кроме разбивки логики:<br />
<code>handle_clean</code> - это обработчик маршрута (<code>handler</code>). Его задача:<br />
→ поймать команду <code>/clean</code>,<br />
→ передать управление логике очистки,<br />
→ ничего больше не делать.</p>
<p dir="auto">Едем дальше, теперь о самой функции проверки и удаления в Aiogram:</p>
<pre><code class="language-python">import logging
from aiogram.exceptions import (
    TelegramAPIError,
    TelegramForbiddenError, # заменяет BotBlocked и ChatNotFound
    TelegramRetryAfter, # заменяет RetryAfter
)
logger = logging.getLogger(__name__)

# Посмотрите внимательно на импорт ошибок - это замена старый импортов из версии Aiogram 2

# Едем дальше вот наша функция которая проверят и удаляет пользователей
async def clean_command(message, bot, user_db):
    admin_id = int(os.getenv("ADMIN_ID"))

    # Проверяем что команда запущена от админа бота
    if message.from_user.id != admin_id:
        return await message.answer("Недостаточно прав для выполнения этой команды.")
    
    # Так как я довен и назвал по ошибке экземпляр БД то она у меня - user_db
    # Из экземпляра БД получаем все пользователей и записываем их кол-во в переменную
    users = await user_db.get_all_users()
    total = len(users)
    removed = 0

    # Просто уведомление что команда запустилась
    await message.answer(f"Начинаю очистку базы... Всего пользователей: {total}")
    
    # Тут самое интересное
    # Проходимся по каждому пользователю и проверяем
    for user_id, info in users.items():
        try:
            await bot.send_chat_action(chat_id=user_id, action="typing")
            await asyncio.sleep(0.05)  # уважаем лимиты Telegram

        except TelegramForbiddenError:
            # Проверка - пользователь заблокировал бота или чат не существует
            # Если пользователь удалил чат или заблочил бота то удаляет его
            await user_db.remove_user(user_id)
            removed += 1
            logger.info(f"Удалён пользователь {user_id}: бот заблокирован или чат не найден.")

        # Эта функция обрабатывает ограничение скорости
        # Что бы нас не заблокировали при отправке запросов
        except TelegramRetryAfter as e:
            logger.warning(f"Flood control: пауза {e.retry_after} сек.")
            await asyncio.sleep(e.retry_after)
            continue
        
        # Обрабатываем другие ошибки API
        except TelegramAPIError as e:
            logger.error(f"Ошибка Telegram API у пользователя {user_id}: {e}")
        
        # Логируем ошибку
        except Exception as e:
            logger.exception(f"Непредвиденная ошибка у пользователя {user_id}: {e}")

    # Сообщаем что очистка завершена сколько удалено из общего кол-во пользователей
    await message.answer(f"Очистка завершена. Удалено {removed} из {total} пользователей.")
</code></pre>
<p dir="auto">В среднем такая проверка занимает около 5-7 минут (Моя база 10к +), топорно конечно. Но я просто в самом начале не предусмотрел отлавливание удаление чата/блокировки бота пользователями. По этому пришлось как-то выходить из ситуации <img src="https://forum.exlends.ru/assets/plugins/nodebb-plugin-emoji/emoji/android/1f601.png?v=a1e94250dac" class="not-responsive emoji emoji-android emoji--grin" style="height:23px;width:auto;vertical-align:middle" title=":grin:" alt="😁" /></p>
<p dir="auto">Надеюсь мое решение кому-то поможет <img src="https://forum.exlends.ru/assets/plugins/nodebb-plugin-emoji/emoji/android/1f642.png?v=a1e94250dac" class="not-responsive emoji emoji-android emoji--slightly_smiling_face" style="height:23px;width:auto;vertical-align:middle" title=":)" alt="🙂" /></p>
]]></description><link>https://forum.exlends.ru/topic/295/aiogram-udalenie-i-chistka-bazy-polzovatelej</link><generator>RSS for Node</generator><lastBuildDate>Tue, 25 Aug 2026 06:54:20 GMT</lastBuildDate><atom:link href="https://forum.exlends.ru/topic/295.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 23 Oct 2025 10:52:17 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Aiogram удаление и чистка базы пользователей on Mon, 27 Oct 2025 06:08:18 GMT]]></title><description><![CDATA[<p dir="auto">А если не получилось с помощью кода отлавливать тех пользователей которые заблокировали бота,значит их просто нет или что-то не сработало?</p>
]]></description><link>https://forum.exlends.ru/post/931</link><guid isPermaLink="true">https://forum.exlends.ru/post/931</guid><dc:creator><![CDATA[Matatabi]]></dc:creator><pubDate>Mon, 27 Oct 2025 06:08:18 GMT</pubDate></item><item><title><![CDATA[Reply to Aiogram удаление и чистка базы пользователей on Sat, 25 Oct 2025 11:57:51 GMT]]></title><description><![CDATA[<p dir="auto">+++ Однозначно полезный шаблон. С нетерпением жду!!!</p>
]]></description><link>https://forum.exlends.ru/post/926</link><guid isPermaLink="true">https://forum.exlends.ru/post/926</guid><dc:creator><![CDATA[SkitRa]]></dc:creator><pubDate>Sat, 25 Oct 2025 11:57:51 GMT</pubDate></item><item><title><![CDATA[Reply to Aiogram удаление и чистка базы пользователей on Thu, 23 Oct 2025 11:09:48 GMT]]></title><description><![CDATA[<p dir="auto">Вообще я хочу сделать шаблон на гите сразу со всеми зависимостями, уже готовой структурой импортами и сразу с БД (НО ТОЛЬКО SQL lite через файл db) для будущих ботов - это может создавать ботов чуть быстрее так как сразу можно приступить к бизнес логике.</p>
<p dir="auto">Если накидаете плюсиков +++ сделаю в близжайшее время.</p>
<p dir="auto">Кстати вот сам мой бот по скачке коротких видео:</p>
<p dir="auto"><div class="card col-md-9 col-lg-6 position-relative link-preview p-0">



<a href="https://t.me/vkclipssavebot" title="Скачать видео ВК Клипы | ТикТок">
<img src="https://cdn4.telesco.pe/file/Nze3uZQyHfbLInl7c2rcCIC3TJMjsCprAJdef5ocbNyXw2GZWTSYvzU4amnki_oLH8SFHnjpeBfljJt5-z1KDZYgHb89UO-3lpI2NMn0GL3xkzGv8A9lUtbUMMdy3JYboLhyrXTevqdPlCrHOy6Ei6_Jqaqv7EmsDWw7Yk-zRU5aY_BWMEnu24E1JXQlViEB1V18Vs8AQDnTebQr4O4APrYQzuymczolx7L0wOrY1OIMdtyoS1b7Zwut8SFpULjZsPyY-i_cAI47TTGg8RztAdVipVI9NzSqoRmIIqP3xFkJ5mReTO2dugAwjLLdCnKGVimeEWa87QYvbaqWuedL2g.jpg" class="card-img-top not-responsive" style="max-height: 15rem;" alt="Link Preview Image" onerror="this.parentElement.remove()" />
</a>



<div class="card-body">
<h5 class="card-title">
<a class="text-decoration-none" href="https://t.me/vkclipssavebot">
Скачать видео ВК Клипы | ТикТок
</a>
</h5>
<p class="card-text line-clamp-3">Бот переехал 👉 @loadikabot</p>
</div>
<a href="https://t.me/vkclipssavebot" class="card-footer text-body-secondary small d-flex gap-2 align-items-center lh-2">



<img src="https://telegram.org/img/website_icon.svg?4" alt="favicon" class="not-responsive overflow-hiddden" style="max-width: 21px; max-height: 21px;" onerror="this.remove()"/>









<p class="d-inline-block text-truncate mb-0">Telegram <span class="text-secondary">(t.me)</span></p>
</a>
</div></p>
]]></description><link>https://forum.exlends.ru/post/925</link><guid isPermaLink="true">https://forum.exlends.ru/post/925</guid><dc:creator><![CDATA[kirilljsx]]></dc:creator><pubDate>Thu, 23 Oct 2025 11:09:48 GMT</pubDate></item><item><title><![CDATA[Reply to Aiogram удаление и чистка базы пользователей on Thu, 23 Oct 2025 11:05:27 GMT]]></title><description><![CDATA[<p dir="auto">Ах, да!<br />
Чуть не забыл, как можно отлавливать пользователей если они заблокировали бота и сразу удалять их из БД:</p>
<pre><code class="language-python"># Для этого нам потребуется - ChatMemberUpdated
from aiogram.types import ChatMemberUpdated

# Если вы работали с aiogram то думаю роутер по умолчанию вы уже импортнули
# Но если нет то добавлю на всякий случай
from aiogram import Router


# Создаем основной роутер
main_router = Router()

@main_router.my_chat_member()
async def on_chat_member_update(event: ChatMemberUpdated):
    # Работаем только с личными чатами, если бот добавлен в канал то увы я пока не придумал
    if event.chat.type != "private":
        return

    # Проверяем, заблокировал ли пользователь бота
    if event.new_chat_member.status == "kicked":
        user_id = event.from_user.id
        await user_db.remove_user(user_id)
        logger.info(f"🗑️ Пользователь {user_id} заблокировал бота — удалён из БД.")
</code></pre>
]]></description><link>https://forum.exlends.ru/post/924</link><guid isPermaLink="true">https://forum.exlends.ru/post/924</guid><dc:creator><![CDATA[kirilljsx]]></dc:creator><pubDate>Thu, 23 Oct 2025 11:05:27 GMT</pubDate></item></channel></rss>