@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)
@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')
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()
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)