@ykengo

Не работает aioscheduler, aiogram 3. Как сделать что бы работал?

Помогите, код ниже
import asyncio
import logging
import sys
import time
import aioschedule
import asyncio

from datetime import datetime

from aiogram import Bot, Dispatcher,types, html
from aiogram.client.default import DefaultBotProperties
from aiogram.enums import ParseMode
from aiogram.filters import CommandStart
from aiogram.types import Message


TOKEN = ""
bot = Bot(token=TOKEN, default=DefaultBotProperties(parse_mode=ParseMode.HTML))
parse=True
spisok =[1,2,3,4,5,6,7,8,9,0,10,11,12,13,14,15]
n=int()
prevweekday = int()
skipper = True

dp = Dispatcher()


async def weekday():
    now = datetime.now()
    current_weekday = now.weekday()
    return current_weekday



@dp.message(CommandStart())
async def dejur(message: Message):
    print(1)
    global n,skipper
    if weekday():
        await bot.send_message(chat_id=1108995102, text=f"Дежурные: {spisok[n]}")
        if skipper == True:
            if n!=14:
                n = n+1
            else:
                n=0
            return n
        else:
            skipper = True
            return skipper
        

        
    
async def scheduler():
    #aioschedule.every().day.at("12:00").do(dejur)
    aioschedule.every().minute.do(dejur)
    while True:
        await aioschedule.run_pending()
        await asyncio.sleep(1)
        
        
async def on_startup(_):
    asyncio.create_task(scheduler())
    
async def main():
    logging.basicConfig(level=logging.INFO)
    bot = Bot(token=TOKEN, default=DefaultBotProperties(parse_mode=ParseMode.HTML))
    await dp.start_polling(bot)


if __name__ == "__main__":
    asyncio.run(main())
  • Вопрос задан
  • 81 просмотр
Пригласить эксперта
Ответы на вопрос 1
Vindicar
@Vindicar
RTFM!
@dp.message(CommandStart())  # обработчик события!
async def dejur(message: Message):
    ...

    aioschedule.every().minute.do(dejur)  # планируем вызов функции

Запомни раз и навсегда - никогда не вызывай обработчики событий напрямую.
Если тебе нужно реализовать одну и ту же функциональность и в обработчике, и где-то ещё - вынеси эту функциональность в отдельную подпрограмму, и уже её вызывай и в обработчике, и в других местах.
В твоём случае можно сделать что-то типа такого:
async def send_duty_list(chat: int):
    print(1)
    global n,skipper
    if weekday():
        await bot.send_message(chat, text=f"Дежурные: {spisok[n]}")
        if skipper == True:
            if n!=14:
                n = n+1
            else:
                n=0
            return n
        else:
            skipper = True
            return skipper

@dp.message(CommandStart())
async def dejur(message: Message):
    await send_duty_list(message.chat.id)  # шлём ответ в тот же чат, где была команда


async def scheduler():
    aioschedule.every().minute.do(send_duty_list, chat=1108995102)  # а тут шлём фиксированному юзеру
    while True:
        await aioschedule.run_pending()
        await asyncio.sleep(1)


Кроме того, имей ввиду:
async def on_startup(_):
    asyncio.create_task(scheduler())

У тебя созданный объект задачи может быть собран сброщиком мусора - что, разумеется, прервёт задачу.
Так что сохраняй ссылку на задачу куда-нибудь в глобальную переменную.
scheduler_task = None

async def on_startup(_):
    global scheduler_task
    scheduler_task = asyncio.create_task(scheduler())
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы