Проблема с телеграм ботом
Имеется телеграм бот, в главной функции создается переменная 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 шт):
Лучше воспользуйтесь библиотекой 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 с этой библиотеке.