модуль Apscheduler не отправляет сообщение в aiogram

Рейтинг: 1Ответов: 1Опубликовано: 15.02.2023

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

from aiogram import Bot, Dispatcher, types, executor
from db import Datebase
from config import BOT_TOKEN, API_KEY
from apscheduler.schedulers.asyncio import AsyncIOScheduler

import requests 
import datetime
from bs4 import BeautifulSoup
import lxml
import random

bot = Bot(BOT_TOKEN)
dp = Dispatcher(bot)

db = Datebase('database.db')

@dp.message_handler(commands=['start'])
async def start(msg: types.Message) -> None:
    if msg.chat.type == 'private':
        if not db.user_exists(msg.from_user.id):
            db.add_user(msg.from_user.id)
        await msg.answer('Добро пожаловать!')


@dp.message_handler()
async def start(msg: types.Message) -> None:
    if msg.chat.type == 'private':
        try:        
            URL= f'https://api.openweathermap.org/data/2.5/weather?lat=53.9&lon=27.5667&appid={API_KEY}&units=metric&lang=ru'
            r = requests.get(url=URL)
            data = r.json()

            city = data['name']
            cur_weath = round(float(data['main']['temp']))
            feel_weth = round(float(data['main']['feels_like']))
            humidity = data['main']['humidity']
            wind = data['wind']['speed']
            description = data['weather'][0]['description']
            sunrise = datetime.datetime.fromtimestamp(data['sys']['sunrise']).strftime('%H:%M')
            sunset = datetime.datetime.fromtimestamp(data['sys']['sunset']).strftime('%H:%M')

            rub = requests.get('https://www.nbrb.by/api/exrates/rates/RUB?parammode=2')
            data1 = rub.json()
            price_rub = round(float(data1['Cur_OfficialRate']), 2)

            usd = requests.get('https://www.nbrb.by/api/exrates/rates/USD?parammode=2')
            data2 = usd.json()
            price_usd = round(float(data2['Cur_OfficialRate']), 2)

            eur = requests.get('https://www.nbrb.by/api/exrates/rates/EUR?parammode=2')
            data3 = eur.json()
            price_eur = round(float(data3['Cur_OfficialRate']), 2)

            headers = {
                'accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7',
                'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/110.0.0.0 Safari/537.36 Edg/110.0.1587.41',
            }

            req = requests.get('https://wikiphile.ru/570-fraz-o-motivacii/?ysclid=le2s2e8ouu459711332' ,headers=headers)
            
            soup = BeautifulSoup(req.text, 'lxml')

            lst = soup.find('ol').find_all('li')
            random_index = random.randint(0, len(lst) - 1)
            await msg.answer(
                f'---------------{datetime.datetime.now().strftime("%d-%m-%Y")}---------------\n'\
                '\n'\
                '-----Погода-----\n'\
                f'Город: {city}\n'\
                f'Описание: {description}\n'\
                f'Текущая погода: {cur_weath}°\n'\
                f'Ощущается как: {feel_weth}°\n'\
                f'Скорость ветра: {wind} м/с \n'\
                f'Влажность: {humidity}\n'\
                f'Рассвет: {sunrise}\n'\
                f'Закат: {sunset}\n'\
                '\n'\
                f'-----Курсы валют-----\n'\
                f'Доллар\n'\
                f'Курс по НБРБ: {price_usd} BYN\n'\
                f'Евро\n'\
                f'Курс по НБРБ: {price_eur} BYN\n'\
                f'Российский рубль(за 100р)\n'\
                f'Курс по НБРБ: {price_rub} BYN\n'\
                '\n'\
                f'-----Рандомная цитата-----\n'\
                f'{lst[random_index].text}'
                )
        except:
            await msg.answer('Ошибка')
            await msg.from_user.id


async def sms() -> None:
    scheduler = AsyncIOScheduler(timezone='Europe/Minsk')
    scheduler.add_job(start, trigger='cron', hour=datetime.datetime.now().hour, minute=datetime.datetime.now().minute + 1, start_date=datetime.datetime.now(), kwargs={'msg':types.Message, } ) 
    scheduler.start()


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

Ответы

▲ 0

Попробуйте добавить к функции sms лямбда выражение:

lambda: start(types.Message(), msg=types.Message())

Конечная функция станет такой:

async def sms() -> None:
    scheduler = AsyncIOScheduler(timezone='Europe/Minsk')
    scheduler.add_job(lambda: start(types.Message(), msg=types.Message()), 
                      trigger='cron', 
                      hour=datetime.datetime.now().hour, 
                      minute=datetime.datetime.now().minute + 1, 
                      start_date=datetime.datetime.now()) 
    scheduler.start()