@AsQ_QQ

Как сделать что бы хандлер срабатывал каждые 10 секунд, aiogram, python?

вообщем, я сделал бота который присылает мне свежие новости с сайта, но как мне сделать что бы хандлер который мне скидывает новости был автоматическим? что бы я не нажимал на кнопку "последние новости", а что бы он включался каждые 10 секунд?
вот выпуск всех новостей(тут всё нормально)
@dp.message_handler(commands='all')
async def get_all_news(message: types.Message):
	with open('news_dist_save.json') as file:
		news_dist = json.load(file)


	for k, v in sorted(news_dist.items()):
		news = f'{hcode(v["dates_id_print"])}\n' \
			   f'{hlink(v["aubl_title"], v["aubl_url_split_print"])}'

		await message.answer(news)

а вот свежие новости, мне надо сделать так что бы эта функция запускалась каждые 10 секунд.
@dp.message_handler(commands='news')
async def get_new_news(message: types.Message):
	fresh_news = chek_news_update()

	if len(fresh_news) >= 1:
		for k, v in sorted(fresh_news.items()):
			news = f'{hcode(v["dates_id_print"])}\n' \
				   f'{hlink(v["aubl_title"], v["aubl_url_split_print"])}'
			await message.answer(news)
			#print('ok news')
	else:
		pass
		#await message.answer('no')


бот работает на ура, но только с кнопки.
командой /all он всё выводит, а командой /news он молчит, потому что ещё не вышли свежие новости.
61e0d63b9417e908559829.png
  • Вопрос задан
  • 423 просмотра
Решения вопроса 1
Vindicar
@Vindicar
RTFM!
Ну как-то так, только имей ввиду, что контроль над тем, кто может выполнять команды, остаётся на тебе.
Бот либо опрашивает новости, либо нет, и сделать это индивидуально для разных пользователей будет сложнее.
stop_polling_site = None  # контролирует, продолжаем мы проверять новости или нет

async def get_news(message: types.Message):
  "Эта функция только проверяет и отправляет новости, она не является обработчиком событий"
  fresh_news = chek_news_update() # ты выполняешь сетевую операцию синхронно. Зачем?!

  if len(fresh_news) >= 1:
    for k, v in sorted(fresh_news.items()):
      news = f'{hcode(v["dates_id_print"])}\n' \
           f'{hlink(v["aubl_title"], v["aubl_url_split_print"])}'
      await message.answer(news)  # <<< не лучший способ отправлять сообщения в канал, но это твое дело.
      print('ok news')
  else:
    print('no')

@dp.message_handler(commands='startnews')
async def start_polling_news(message: types.Message):
  "Эта функция обрабатывает команду для начала опроса и реализует цикл опроса."
  global stop_polling_site
  if stop_polling_site is not None:
    await message.answer("Мы уже проверяем новости.")
    return
  stop_polling_site = asyncio.Event()
  while True:  # цикл опроса новостей
    try:
        # реализуем ожидание без остановки остального бота. Таймаут - сколько ждем в секундах.
        # такой подход используется вместо asyncio.sleep(), 
        # чтобы можно было в любой момент остановить опрос новостей.
        await asyncio.wait_for(stop_polling_site.wait(), timeout=600)
    except asyncio.TimeoutError:
        # дождались таймаута - работаем.
        try:
          await get_news(message)
        except:
          pass # была ошибка при получении новостей, думай сам что тут делать
    else:
        # таймаута не было - значит, поступила команда на остановку цикла
        break
  stop_polling_site = None

@dp.message_handler(commands='stopnews')
async def stop_polling_news(message: types.Message):
  "Эта функция обрабатывает команду для окончания опроса."
  global stop_polling_site
  if stop_polling_site is None:
    # цикл и так не работает
    await message.answer("Мы и так не проверяем новости.")
  else:
    # говорим остановить цикл
    stop_polling_site.set()
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@AsQ_QQ Автор вопроса
вообщем, я сделал так что бы она срабатывала каждые 5 секунд

async def update_news_1(message: types.Message):
	fresh_news = chek_news_update()

	if len(fresh_news) >= 1:
		for k, v in sorted(fresh_news.items()):
			news = f'{hcode(v["dates_id_print"])}\n' \
				   f'{hlink(v["aubl_title"], v["aubl_url_split_print"])}'
			await message.answer(news)
			print('ok news')
	else:
		print('no')

	time.sleep(5)

	return await update_news_1(message)


но, я не могу использовать остальные команды бота) так что либо помогите с этим, либо другой способ рипита сделать
Ответ написан
Ваш ответ на вопрос

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

Похожие вопросы