news_api.py 3.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273
  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. try:
  38. news_item = self.get_post_by_id(self.channel_id, n['id'])
  39. except Exception:
  40. pass
  41. else:
  42. news_data.append(news_item)
  43. self.news = []
  44. return news_data
  45. def get_mock_news_data(self):
  46. return [{
  47. "title": "Расписание леуций на неделю",
  48. "link": "https://sattavalife.ru",
  49. "html": "<p>some text</p>"
  50. }]
  51. def get_post_by_id(self, list_id: int, post_id: int):
  52. url = f"https://www.vioms.ru/api/mobile/email_lists/{list_id}/mailings/{post_id}.json"
  53. r = requests.get(url)
  54. news_item = json.loads(r.text)
  55. try:
  56. if news_item["error"]: raise Exception(f"Error: {news_item['error']}")
  57. except KeyError:
  58. pass
  59. return {
  60. "title": news_item["subject"].strip(),
  61. "link": f"https://www.vioms.ru/mailings/{post_id}/full",
  62. "html": news_item["rendered_html"]
  63. }