Как настроить отправку сообщений по расписанию с использованием aiogram3?

Как можно организовать отправку сообщений по расписанию с использованием aiogram3 и библиотеки aioschedule?
  • 1 апреля 2024 г. 21:19
Ответы на вопрос 2
Для настройки отправки сообщений по расписанию с использованием aiogram3 и библиотеки aioschedule следует следовать следующему шагам:

1. Установите необходимые библиотеки:
```shell
pip install aiogram aioschedule
```

2. Создайте файл для вашего бота и импортируйте необходимые модули:

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

3. Инициализируйте бота и диспетчера:

```python
API_TOKEN = 'your_bot_api_token'
bot = Bot(token=API_TOKEN)
dp = Dispatcher(bot)
```

4. Создайте функцию для отправки сообщений:

```python
async def send_message():
    chat_id = 'your_chat_id'
    message = 'Your scheduled message'
    await bot.send_message(chat_id, message)
```

5. Настройте расписание и добавьте задачу для отправки сообщений через aioschedule:

```python
async def main():
    aioschedule.every().day.at('09:00').do(send_message)
    
    while True:
        await aioschedule.run_pending()
        await asyncio.sleep(1)

if __name__ == '__main__':
    loop = asyncio.get_event_loop()
    loop.create_task(main())
    loop.run_forever()
```

6. Запустите ваш бот и убедитесь, что сообщения отправляются по расписанию.

Это основная структура для организации отправки сообщений по расписанию с использованием aiogram3 и библиотеки aioschedule. Можете дополнить ее дополнительными функциями и настройками для вашего бота.
Открываем страницу пакета , читаем пример. 
В конце видим рабочий цикл aioschedule, где периодически вызывается корутина aioschedule.run_pending().
У тебя этого нет. Т.е. ты планируешь вызов своей корутины, но не выполняешь код, который этот вызов сделает.
Поскольку у тебя scheduler() вызывается через create_task(), то можно прямо в тело scheduler() дописать что-то типа
while True:
    await aioschedule.run_pending()
    await asyncio.sleep(0.1)

Вот только зачем ты делаешь await create_teask()? Это убивает смысл create_task(), так как ты ждёшь завершения созданной фоновой задачи. Вместо этого сохрани таск в глобальную переменную - так он точно не будет собран сборщиком мусора, и ты сможешь при необходимости вызвать метод cancel(), чтобы прервать цикл внутри scheduler().
Похожие вопросы