Бесконечный цикл в боте aiogram не отправляет сообщения!

Суть вопроса, цикл inf_loop отрабатывает и парсит новости но при отправке их пользователю вылетает ошибка Timeout context manager should be used inside a task. Как отправить спарсенные данные пользователю? Я не совсем разбираюсь в асинхронности по этому можно ли здесь что-то улучшить? Заранее благодарю!

import asyncio
import threading
from threading import Thread
from aiogram import Bot, Dispatcher, types
from aiogram.dispatcher.filters import Command
from aiogram import Bot, Dispatcher, types
from aiogram.utils import executor
from typing import List, Tuple
import time
from config.tg_config import TG_TOKEN, AUTH_KEY
from DataBase import *
import datetime

from borgwarnerController import getBorgwarnerNewNews
from nakModule import getNewNakNews
from kinergoModule import getNewKinergoNews
from aisinModule import getNewAisinNews
from sonnaxModule import getNewSonnaxNews
from transtecModule import getNewTranstecNews
from raybestospowertrainModule import getRaybestospowertrainNews
from automaticchoiseModule import getAutomaticchoiceNews


USERID = []

# Включаем логирование, чтобы отслеживать ошибки
logging.basicConfig(level=logging.INFO)

DBPATH = 'dataBase/telegramDB.sqlite'



# Инициализируем бота и диспетчер
bot = Bot(token=TG_TOKEN)
dp = Dispatcher(bot)



def messageConstructor(source, data):
    message = "Источник: " + source + "\n" + data
    return message

async def sendMessage(userId, message):
    await bot.send_message(userId, message)

async def isSetUser(userId):
    if( userId in USERID):
        return True
    else:
        return False
    
async def newsletter(message):

    for id in USERID:
        try:
            await sendMessage(id, message)
        except Exception as err:
            print("Ошибка отправки сообшения пользователю с id:", id,'\n', err)

def saveUpdatetime(colName):
    date = datetime.datetime.now()
    dateText = '{0:%d}-{0:%B}-{0:%Y} {0:%H:%M:%S}'.format(date)

    db = DataBase('dataBase/parserData.sqlite', 'config')    

    db.cursor.execute(f"UPDATE config SET update_date = '{dateText}' WHERE resource = '{colName}';")
        
    db.connect.commit()
    db.closeConnection()
    

# Команда /start
@dp.message_handler(Command('start'))
async def cmd_start(message: types.Message):

    userId = message.from_user.id
    username = message.from_user.first_name

    if not await isSetUser(userId):

        await message.reply('Пожалуйста выполните команду /login [пароль] для аворизации')
    else:
        
        await message.reply(f'С возвращением {username}!')

# Команда /login
@dp.message_handler(commands=['login'])
async def cmd_login(message: types.Message):
    userId = message.from_user.id
    username = message.from_user.first_name

    if(isSetUser(userId)):
        await message.reply('Вы уже авторизованы!')
        return

    if(message.get_args() == AUTH_KEY):

        db = DataBase('dataBase/telegramDB.sqlite', 'users')
        cursor = db.cursor

        cursor.execute('INSERT INTO ' + db.table_name + ' (user_id, username) VALUES (?, ?)', (userId, username))

        db.connect.commit()
        db.closeConnection()
        
        await message.reply('Вы успешно авторизовались!')
    else:
        await message.reply('Ошибка авторизации. Повторите попытку!')
# check
@dp.message_handler(commands=['check'])
async def cmd_check(message: types.Message):

    userId = message.from_user.id

    if(not await isSetUser(userId)):
        await message.reply('Недостатачно прав! Пожалуйста выполните команду /login [пароль] для аворизации')
        return

    await message.reply("Парсим новости. Это может занять несколько минут...")

    # Запускаем парсинг в отдельном потоке
    await parse_news(message.chat.id)

# status
@dp.message_handler(commands=['status'])
async def cmd_status(message: types.Message):

    if(not await isSetUser(message.from_user.id)):
        await message.reply('Недостатачно прав! Пожалуйста выполните команду /login [пароль] для аворизации')
        return
    
    db = DataBase('dataBase/parserData.sqlite', 'config')
    cursor = db.cursor

    cursor.execute('SELECT resource, update_date FROM config;')
    resp = cursor.fetchall()
    text = 'Последнее обновление данных:\n'
    for list in resp:
        text = f"{text} {list[0]} - {list[1]}\n"
    await sendMessage(message.from_user.id, text)



async def parse_news(chat_id = '', notify_no_news = True, hard_mode = 0):
    db = DataBase('dataBase/parserData.sqlite', 'borgwarner')
    newsList = [] 

    result = getBorgwarnerNewNews(db)
    for object in result:
        object['resource'] = 'BorgWarner'
        object['link'] = f"https://www.borgwarner.com{object['link']}"
        newsList.append( object )
    saveUpdatetime('borgwarner')

    result = getNewNakNews()
    for object in result:
        object['resource'] = 'nak'
        newsList.append( object )
    saveUpdatetime('nak')

    result = getNewKinergoNews()
    for object in result:
        object['resource'] = 'kinergo'
        newsList.append( object )
    saveUpdatetime('kinergo')

    result = getNewAisinNews()
    for object in result:
        object['resource'] = 'aisin'
        newsList.append( object )
    saveUpdatetime('aisin')

    result = getNewSonnaxNews()
    for object in result:
        object['resource'] = 'sonnax'
        newsList.append( object )
    saveUpdatetime('sonnax')

    result = getNewTranstecNews()
    for object in result:
        object['resource'] = 'transtec'
        object['date'] = ' '
        newsList.append( object )
    saveUpdatetime('transtec')

    result = getRaybestospowertrainNews()
    for object in result:
        object['resource'] = 'raybestospowertrain'
        object['date'] = ' '
        newsList.append( object )
    saveUpdatetime('raybestospowertrain')

    if(hard_mode == 1):
        result = getAutomaticchoiceNews()
        for object in result:
            object['resource'] = 'automaticchoice'
            object['date'] = ' '
            newsList.append( object )
        saveUpdatetime('automaticchoice')

    if len(newsList) > 0:

        for news in newsList:
            msg = messageConstructor(news['resource'], f"{news['date']}\n{news['title']}\n{news['link']}")
            await newsletter(msg)
    elif chat_id != '' and notify_no_news == True:
        await sendMessage(chat_id, 'Нет новых новостей!')

async def on_startup(dp):

    db = DataBase('dataBase/telegramDB.sqlite', 'users')    
    cursor = db.cursor

    resp = cursor.execute('SELECT user_id FROM users;')
    users = resp.fetchall()

    for user in users:
        USERID.append(user[0])

async def inf_loop():
    while True:
        await parse_news(notify_no_news=False, hard_mode=1)
        await asyncio.sleep(9000)

def inf_loop_thread():
    loop = asyncio.new_event_loop()
    asyncio.set_event_loop(loop)
    loop.run_until_complete(inf_loop())

if __name__ == '__main__':

    executor.start_polling(dp, skip_updates=True,  on_startup=on_startup)

    thread = threading.Thread(target=inf_loop_thread)
    thread.start()```

Ответы (0 шт):