zhongqingkandian.py 6.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154
  1. # -*- coding: utf-8 -*-
  2. import json
  3. import time
  4. import requests
  5. from application.common.feishu.feishu_utils import FeishuUtils
  6. from application.common.log import Local
  7. class ZhongQingKanDian:
  8. API_BASE_URL = "http://8.217.192.46:8889"
  9. COMMON_HEADERS = {
  10. "Content-Type": "application/json"
  11. }
  12. MAX_RETRIES = 3
  13. TIMEOUT = 10 # 设置超时时间
  14. def __init__(self):
  15. self.session = requests.Session()
  16. self.session.headers.update(self.COMMON_HEADERS)
  17. # 初始化请求次数计数器
  18. self.recommend_list_request_count = 0
  19. self.content_recommend_list_request_count = 0
  20. self.detail_request_count = 0
  21. def send_request(self, endpoint, data):
  22. full_url = f"{self.API_BASE_URL}{endpoint}"
  23. for retry in range(self.MAX_RETRIES):
  24. try:
  25. response = self.session.post(full_url, data=data, timeout=self.TIMEOUT)
  26. response.raise_for_status()
  27. return response.json()
  28. except requests.RequestException as e:
  29. Local.logger("zhongqingkandian", "recommend").info(
  30. f"请求 {full_url} 失败(第 {retry + 1} 次重试): {e}")
  31. if retry < self.MAX_RETRIES - 1:
  32. time.sleep(2)
  33. except json.JSONDecodeError as e:
  34. Local.logger("zhongqingkandian", "recommend").info(
  35. f"解析 {full_url} 的响应数据失败(第 {retry + 1} 次重试): {e}")
  36. # print(f"解析 {full_url} 的响应数据失败(第 {retry + 1} 次重试): {e}")
  37. if retry < self.MAX_RETRIES - 1:
  38. time.sleep(2)
  39. return None
  40. def is_response_valid(self, resp):
  41. if resp and resp.get("code", -1) == 0:
  42. data = resp.get("data", {}).get("data")
  43. return data is not None
  44. return False
  45. def req_recommend_list(self):
  46. url = '/crawler/zhong_qing_kan_dian/recommend'
  47. body = json.dumps({"cursor": ""})
  48. resp = self.send_request(url, body)
  49. if self.is_response_valid(resp):
  50. self.recommend_list_request_count += 1
  51. Local.logger("zhongqingkandian", "recommend").info(f"请求推荐流的总次数: {self.recommend_list_request_count}响应:{resp}")
  52. return resp["data"]["data"]
  53. Local.logger("zhongqingkandian", "recommend").info(
  54. f"请求推荐流失败,返回异常: {resp}")
  55. return None
  56. def req_content_recommend_list(self, content_id):
  57. url = '/crawler/zhong_qing_kan_dian/related'
  58. body = json.dumps({
  59. "content_id": str(content_id),
  60. "cursor": ""
  61. })
  62. resp = self.send_request(url, body)
  63. if self.is_response_valid(resp):
  64. self.content_recommend_list_request_count += 1
  65. Local.logger("zhongqingkandian", "recommend").info(f"请求内容相关推荐流的总次数: {self.content_recommend_list_request_count}响应:{resp}")
  66. return resp["data"]["data"]
  67. Local.logger("zhongqingkandian", "recommend").info(
  68. f"请求内容相关推荐流失败,返回异常: {resp}")
  69. return None
  70. def req_detail(self, content_link, label):
  71. url = '/crawler/zhong_qing_kan_dian/detail'
  72. body = json.dumps({
  73. "content_link": content_link
  74. })
  75. resp = self.send_request(url, body)
  76. if resp and resp.get("code") == 0:
  77. self.detail_request_count += 1
  78. Local.logger("zhongqingkandian", "recommend").info(f"请求详情的总次数: {self.detail_request_count}")
  79. data = resp["data"]["data"]
  80. if data["content_type"] == "video":
  81. video_id = data['channel_content_id']
  82. video_title = data["title"]
  83. video_cover = data["image_url_list"][0]['image_url']
  84. video_url = data["video_url_list"][0]['video_url']
  85. video_duration = data["video_url_list"][0]['video_duration']
  86. account_id = data["channel_account_id"]
  87. account_name = data["channel_account_name"]
  88. account_avatar = data["avatar"]
  89. values = [
  90. [
  91. video_title,
  92. video_url,
  93. video_duration,
  94. video_cover,
  95. video_id,
  96. content_link,
  97. account_name,
  98. account_id,
  99. account_avatar,
  100. label,
  101. ]
  102. ]
  103. FeishuUtils.insert_columns("BvScsJKDWhuj1ctUX1mcBzq1nYb", "a338b3", "ROWS", 1, 2)
  104. time.sleep(0.5)
  105. FeishuUtils.update_values("BvScsJKDWhuj1ctUX1mcBzq1nYb", "a338b3", "A2:Z2", values)
  106. else:
  107. Local.logger("zhongqingkandian", "recommend").info(f"不是视频")
  108. else:
  109. Local.logger("zhongqingkandian", "recommend").info(f"请求详情失败,返回异常: {resp}")
  110. return None
  111. def control_request(self):
  112. recommend_list = self.req_recommend_list()
  113. if recommend_list:
  114. for video_obj in recommend_list:
  115. content_link = video_obj.get("share_url")
  116. content_id = video_obj.get("id")
  117. if content_link and content_id:
  118. time.sleep(2)
  119. detail = self.req_detail(content_link, "推荐")
  120. if detail:
  121. print(detail)
  122. time.sleep(10)
  123. content_recommend_list = self.req_content_recommend_list(content_id)
  124. if content_recommend_list:
  125. for content_obj in content_recommend_list:
  126. content_link = content_obj.get("share_info", {}).get("share_url")
  127. if content_link:
  128. res = self.req_detail(content_link, "内容相关推荐")
  129. if res:
  130. print(res)
  131. def run(self):
  132. while True:
  133. self.control_request()
  134. if __name__ == '__main__':
  135. ZhongQingKanDian().run()
  136. # ZhongQingKanDian().req_detail('https://vol.youth.cn/1qWiCPOjl1CUewP5?signature=bDjmABzyXE32GNxlOY4pJVbdZfDqw9naZ9vnQ58wq06peMdkrP','ceshi')