Как можно организовать отправку сообщений по расписанию с использованием aiogram3 и библиотеки aioschedule?
Для настройки отправки сообщений по расписанию с использованием 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().