Как можно запустить функцию из библиотеки aiogram?

  • 30 августа 2023 г. 7:26
Ответы на вопрос 2
Для запуска функции из библиотеки aiogram вам необходимо использовать объект класса `Dispatcher`, который обеспечивает маршрутизацию сообщений.

В вашем случае, вам необходимо добавить декоратор `message_handler` к функции `days_message` и зарегистрировать ее с помощью `dp.register_message_handler()`. Это позволит обработчику сообщений отслеживать все входящие сообщения и вызывать функцию `days_message`, когда нужно.

Обновленный код будет выглядеть примерно так:

```python
from aiogram import Bot, Dispatcher, executor, types
import asyncio
from datetime import datetime

bot = Bot(TOKEN)
dp = Dispatcher(bot)

...

@dp.message_handler(commands=['start'])
async def send_message(message: types.Message):
    ...
    await bot.send_photo(chat_id, photo=photo, caption=f'Эта функция работает')

@dp.message_handler()
async def days_message(message: types.Message):
    while True:
        await asyncio.sleep(1)
        now = datetime.now()
        current_date = now.strftime("%Y-%m-%d")
        current_time = now.strftime("%H:%M:%S")
        if current_date == '2023-08-30' and current_time == '11:56:39':
            await message.answer('Работает')
        else:
            print("Время прошло")

if __name__ == '__main__':
    executor.start_polling(dp, skip_updates=True)
```

Теперь функция `days_message` будет вызываться каждый раз при получении любого сообщения, и если текущая дата и время совпадают с заданными, будет отправлено сообщение 'Работает'.
Вашу функцию нужно зарегистрировать в обработчике событий (dp) аналогично функции send_messages:

@dp.message_handler(commands=['start'])
async def start_message(message: types.Message):
    ...

Для того, чтобы функция вызывалась по команде /start, вы можете использовать следующий код:

@dp.message_handler(commands=['start'])
async def start_message(message: types.Message):
    async def task():
        while True:
            await asyncio.sleep(300)  # Задержка в 5 минут
            await message.answer('Ваше сообщение')  # Замените 'Ваше сообщение' на то, что вам нужно отправлять
    asyncio.create_task(task())

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

from aiogram import types
from datetime import datetime
import asyncio

async def task():
    while True:
        await asyncio.sleep(1)
        now = datetime.now()
        current_date = now.strftime("%Y-%m-%d")
        current_time = now.strftime("%H:%M:%S")
        if current_date == '2023-08-30' and current_time == '11:56:39':
            await message.answer('Работает')
        else:
            print("Время прошло")

@dp.message_handler(commands=['start'])
async def start_message(message: types.Message):
    asyncio.create_task(task())

Рекомендуется использовать модули aiojobs или aioscheduler для выполнения таких действий.
Похожие вопросы