news_api.py 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657
  1. import requests
  2. import json
  3. class News:
  4. """Содержит методы для получения новостей с VIOMS API.
  5. Для инициализации нужен ID списка рассылки ВИОМС"""
  6. def __init__(self, news_channel_id: int, is_getting_old=False) -> None:
  7. self.channel_id = news_channel_id
  8. self.news_id = 1 if is_getting_old else 0
  9. self.news = []
  10. def check_news(self) -> dict:
  11. """Получает информацию в формате json с api ВИОМС. Возвращает Объект
  12. с ошибками или с количеством новых записей"""
  13. url = f"https://www.vioms.ru/api/mobile/v2/email_lists/{self.channel_id}/mailings.json?page=1"
  14. try:
  15. r = requests.get(url, timeout=4)
  16. except requests.exceptions.RequestException:
  17. return {"error": f"Connection error. URL: {url}"}
  18. try:
  19. news = json.loads(r.text)["mailings"]
  20. except json.JSONDecodeError or KeyError:
  21. return {"error": f"Not valid responce from URL: {url}."}
  22. news_id = self.news_id
  23. # FIX сортировка новостей по их айди в сторону уменьшения
  24. news.sort(key=(lambda i : int(i['id'])), reverse=True)
  25. self.news_id = int(news[0]["id"])
  26. if news_id != 0:
  27. self.news = [n for n in news if n["id"] > news_id]
  28. return {"news_count": len(self.news)}
  29. def get_news_items(self) -> list:
  30. """Возвращает список с объектами по каждой новости
  31. (заголовок, ссылка, полный HTML)"""
  32. news_data = []
  33. for n in self.news:
  34. url = f"https://www.vioms.ru/api/mobile/email_lists/{self.channel_id}/mailings/{n['id']}.json"
  35. r = requests.get(url)
  36. news_item = json.loads(r.text)
  37. news_item = self.get_post_by_id(self.channel_id, n['id'])
  38. news_data.append(news_item)
  39. self.news = []
  40. return news_data
  41. def get_post_by_id(self, list_id: int, post_id: int):
  42. url = f"https://www.vioms.ru/api/mobile/email_lists/{list_id}/mailings/{post_id}.json"
  43. r = requests.get(url)
  44. news_item = json.loads(r.text)
  45. return {
  46. "title": news_item["subject"].strip(),
  47. "link": f"https://www.vioms.ru/mailings/{post_id}/full",
  48. "html": news_item["rendered_html"]
  49. }