Как настроить отправку сообщений с задержкой в библиотеке aiogram версии 3?

Какую асинхронную функцию лучше всего использовать для организации выполнения действия ботом через 3 недели после общения с пользователем? Можете ли подсказать оптимальный подход к задаче без использования функции asyncio.sleep()?
  • 27 мая 2024 г. 12:01
Ответы на вопрос 2
В библиотеке aiogram версии 3 нет встроенной функциональности для отправки сообщений с задержкой, поэтому необходимо использовать асинхронную функцию для этой цели.

Для отправки сообщений с задержкой в aiogram версии 3 можно использовать функцию asyncio.ensure_future(). Например:

```python
import asyncio
from aiogram import Bot, types

async def send_message_with_delay(bot, chat_id, message, delay):
    await asyncio.sleep(delay)
    await bot.send_message(chat_id, message)

# Использование
bot = Bot(token="YOUR_TOKEN")
chat_id = 123456789
message = "Hello, world!"
delay = 60 # Задержка в секундах

loop = asyncio.get_event_loop()
loop.create_task(send_message_with_delay(bot, chat_id, message, delay))
```

Для выполнения действия ботом через определенное время (например, через 3 недели) без использования функции asyncio.sleep(), можно использовать механизм планировщика событий, такой как aiogram_scheduler или игрушечный пример ниже:

```python
import asyncio
from aiogram import Bot

async def action_after_time(bot, chat_id, message, days):
    future_time = loop.time() + days * 24 * 60 * 60
    while True:
        current_time = loop.time()
        if current_time >= future_time:
            await bot.send_message(chat_id, message)
            break
        await asyncio.sleep(1)

# Использование
bot = Bot(token="YOUR_TOKEN")
chat_id = 123456789
message = "Action after 3 weeks"
days = 21

loop = asyncio.get_event_loop()
loop.create_task(action_after_time(bot, chat_id, message, days))
```

Оба примера демонстрируют возможные способы настройки отправки сообщений с задержкой и выполнения действий через определенное время в aiogram версии 3.
Вообще asyncio.sleep работать то должно, но лучше прикрутить какой-нибудь шедулер, или celery
Похожие вопросы