Проблема с телеграм ботом

Имеется телеграм бот, в главной функции создается переменная now и я хочу чтобы она обновлялась каждые 5 секунд, пытался при помощи schedule перезапускать функцию, но это не работает тк. executor.start_polling(dp, skip_updates=False) это тот же while True.

main.py:

from aiogram import Dispatcher, Bot, executor, types
from config import TOKEN_API
from aiogram.dispatcher.filters import Text
from pytube import YouTube
import os
import datetime
import schedule
import asyncio

bot = Bot(TOKEN_API)
dp = Dispatcher(bot)

def yt_bot():
    now = str(datetime.datetime.now())
    print(now)

    @dp.message_handler(commands=['start'])
    async def start_cmd(message: types.Message):
        await bot.send_message(message.chat.id, 'Привет, я умею скачивать видео из ютуба. Просто отпарвь мне ссылку на видео!')


    @dp.message_handler(Text(startswith='https://'))
    async def link_handler(message: types.Message):
        if message.text.startswith('https://www.youtube.com') or message.text.startswith('https://youtu.be'):
            await bot.send_message(message.chat.id, 'Секундочку...')
            yt = YouTube(message.text)
            print(message.text)
            YouTube(message.text).streams.get_highest_resolution().download()
            with open(f'{yt.title}.mp4', 'rb') as file:
                await bot.send_video(message.chat.id, video=file)
            os.remove(f'{yt.title}.mp4')
        else:
            await bot.send_message(message.chat.id, 'Эта ссылка не на ютуб видео')

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

if __name__=='__main__':
    schedule.every(5).seconds.do(yt_bot)
    while True:
        schedule.run_pending()

буду крайне благодарен за помощь


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

Автор решения: KJlUK_KJIAK

Лучше воспользуйтесь библиотекой apscheduler. Не нужен будет цикл. Если давать название процессов и id процессов вы сможете запускать несколько запланированных действий без проблем. В то время как библиотека schedule или ее асинхронный аналог может сбоить и выдавать по два и более результатов в одном запросе.

from aiogram import Dispatcher, Bot, executor, types
from config import TOKEN_API
from aiogram.dispatcher.filters import Text
from pytube import YouTube
from apscheduler.schedulers.blocking import BlockingScheduler

import os
import datetime
import asyncio


def yt_bot():
    now = str(datetime.datetime.now())
    print(now)


@dp.message_handler(commands=['start'])
async def start_cmd(message: types.Message):
    await bot.send_message(message.chat.id, 'Привет, я умею скачивать видео из ютуба. Просто отпарвь мне ссылку на видео!')


@dp.message_handler(Text(startswith='https://'))
async def link_handler(message: types.Message):
    if message.text.startswith('https://www.youtube.com') or message.text.startswith('https://youtu.be'):
        await bot.send_message(message.chat.id, 'Секундочку...')
        yt = YouTube(message.text)
        print(message.text)
        YouTube(message.text).streams.get_highest_resolution().download()
        with open(f'{yt.title}.mp4', 'rb') as file:
            await bot.send_video(message.chat.id, video=file)
        os.remove(f'{yt.title}.mp4')
    else:
        await bot.send_message(message.chat.id, 'Эта ссылка не на ютуб видео')


if __name__ == "__main__":
    sched = BlockingScheduler()
    sched.add_job(yt_bot, 'interval', seconds=5)
    sched.start()
    executor.start_polling(dp, skip_updates=True)

Можно больше расширить функционал, задавать интервал через бота и останавливать планировщик, но в этом случае нужен будет AsyncIOScheduler с этой библиотеке.

→ Ссылка