weixinzhishu_score.py 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246
  1. # -*- coding: utf-8 -*-
  2. # @Author: wangkun
  3. # @Time: 2023/2/10
  4. import os
  5. import sys
  6. import time
  7. from datetime import date, timedelta
  8. import requests
  9. import json
  10. sys.path.append(os.getcwd())
  11. from common.feishu import Feishu
  12. from common.common import Common
  13. class Weixinzhishu:
  14. pageNum = 1
  15. # 获取微信 key / openid
  16. @classmethod
  17. def get_wechat_key(cls, log_type, crawler):
  18. """
  19. 获取微信 key / openid
  20. https://w42nne6hzg.feishu.cn/sheets/shtcnqhMRUGunIfGnGXMOBYiy4K?sheet=sVL74k
  21. :param log_type: 日志名
  22. :param crawler: 哪款爬虫,填写:weixinzhishu
  23. :return: search_key, openid
  24. """
  25. try:
  26. while True:
  27. sheet = Feishu.get_values_batch(log_type, crawler, 'sVL74k')
  28. if sheet is None:
  29. time.sleep(1)
  30. continue
  31. for i in range(len(sheet)):
  32. search_key = sheet[1][1]
  33. openid = sheet[1][2]
  34. return search_key, openid
  35. except Exception as e:
  36. Common.logger(log_type, crawler).error(f"wechat_key:{e}\n")
  37. # 获取热词
  38. @classmethod
  39. def get_word(cls, log_type, crawler, host):
  40. try:
  41. url = '/hot/word/getAllWords'
  42. params = {
  43. 'pageNum': cls.pageNum, # 第几页,默认1,int
  44. 'pageSize': 100 # 请求条目数,默认为100,int
  45. }
  46. response = requests.post(url=host+url, json=params)
  47. cls.pageNum += 1
  48. if response.status_code != 200:
  49. Common.logger(log_type, crawler).warning(f"get_word_response:{response.text}\n")
  50. elif response.json()['message'] != "success":
  51. Common.logger(log_type, crawler).warning(f"get_word_response:{response.json()}\n")
  52. else:
  53. word_list = response.json()['data']['words']
  54. return word_list
  55. except Exception as e:
  56. Common.logger(log_type, crawler).error(f"get_word:{e}\n")
  57. # 获取热词分数
  58. @classmethod
  59. def get_word_score(cls, log_type, crawler, word_id, word):
  60. """
  61. 获取热词分数
  62. :param log_type: 日志名
  63. :param crawler: 哪款爬虫,填写:weixinzhishu
  64. :param word_id: 热词 ID
  65. :param word: 热词
  66. :return: 热词 7 天指数,例如:
  67. {'id': 1,
  68. 'word': '消息',
  69. 'wechatScores': [
  70. {'score': 95521022, 'scoreDate': '2023-02-07'},
  71. {'score': 97315283, 'scoreDate': '2023-02-08'},
  72. {'score': 109845849, 'scoreDate': '2023-02-09'},
  73. {'score': 107089560, 'scoreDate': '2023-02-10'},
  74. {'score': 102658391, 'scoreDate': '2023-02-11'},
  75. {'score': 93843701, 'scoreDate': '2023-02-12'},
  76. {'score': 100211894, 'scoreDate': '2023-02-13'}]}
  77. """
  78. try:
  79. while True:
  80. wechat_key = cls.get_wechat_key(log_type, crawler)
  81. search_key = wechat_key[0]
  82. openid = wechat_key[-1]
  83. start_ymd = (date.today() + timedelta(days=-7)).strftime("%Y%m%d")
  84. end_ymd = (date.today() + timedelta(days=0)).strftime("%Y%m%d")
  85. url = "https://search.weixin.qq.com/cgi-bin/wxaweb/wxindex"
  86. payload = json.dumps({
  87. "openid": openid,
  88. "search_key": search_key,
  89. "cgi_name": "GetDefaultIndex",
  90. "start_ymd": start_ymd,
  91. "end_ymd": end_ymd,
  92. "query": word
  93. })
  94. headers = {
  95. 'Host': 'search.weixin.qq.com',
  96. 'content-type': 'application/json',
  97. 'User-Agent': 'Mozilla/5.0 (iPhone; CPU iPhone OS 13_3_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148 MicroMessenger/8.0.32(0x1800202a) NetType/WIFI Language/zh_CN',
  98. 'Referer': 'https://servicewechat.com/wxc026e7662ec26a3a/42/page-frame.html'
  99. }
  100. response = requests.request("POST", url=url, headers=headers, data=payload)
  101. wechat_score_list = []
  102. word_wechat_score_dict = {
  103. "id": word_id,
  104. "word": word,
  105. "wechatScores": wechat_score_list,
  106. }
  107. if response.json()['code'] == -10000:
  108. Common.logger(log_type, crawler).warning(f"response:{response.json()['msg']} 休眠 10 秒,重新获取")
  109. time.sleep(10)
  110. continue
  111. if response.json()['code'] == -10002:
  112. Common.logger(log_type, crawler).info(f'{word}:该词暂未收录')
  113. return word_wechat_score_dict
  114. elif response.json()['code'] != 0:
  115. Common.logger(log_type, crawler).info(f'response:{response.text}\n')
  116. return word_wechat_score_dict
  117. else:
  118. time_index = response.json()['content']['resp_list'][0]['indexes'][0]['time_indexes']
  119. for i in range(len(time_index)):
  120. score_time = time_index[i]['time']
  121. score_time_str = f"{str(score_time)[:4]}-{str(score_time)[4:6]}-{str(score_time)[6:]}"
  122. score = time_index[i]['score']
  123. wechat_score_dict = {"score": score, "scoreDate": score_time_str}
  124. wechat_score_list.append(wechat_score_dict)
  125. return word_wechat_score_dict
  126. except Exception as e:
  127. Common.logger(log_type, crawler).error(f"get_word_score异常:{e}\n")
  128. # 获取微信指数
  129. @classmethod
  130. def get_wechat_score(cls, log_type, crawler, host):
  131. """
  132. 获取微信指数
  133. :param log_type: 日志名
  134. :param crawler: 哪款爬虫
  135. :param host: 域名
  136. :return: 热词指数列表
  137. """
  138. score_num = 0
  139. while True:
  140. word_list = cls.get_word(log_type, crawler, host)
  141. if len(word_list) == 0:
  142. Common.logger(log_type, crawler).info(f"热词更新完毕\n")
  143. cls.pageNum = 1
  144. Common.logger(log_type, crawler).info(f"score_num: {score_num}")
  145. return
  146. else:
  147. wechat_score_data = []
  148. Common.logger(log_type, crawler).info(f"len(word_list):{len(word_list)}")
  149. for i in range(len(word_list)):
  150. word_id = word_list[i]['id']
  151. word = word_list[i]['word']
  152. Common.logger(log_type, crawler).info(f"word_id:{word_id}")
  153. Common.logger(log_type, crawler).info(f"word:{word}")
  154. word_score_dict = cls.get_word_score(log_type, crawler, word_id, word)
  155. Common.logger(log_type, crawler).info(f"word_score_dict:{word_score_dict}\n")
  156. wechat_score_data.append(word_score_dict)
  157. if word_score_dict['wechatScores'] is not None:
  158. score_num += len(word_score_dict['wechatScores'])
  159. Common.logger(log_type, crawler).info(f"wechat_score_data:{wechat_score_data}\n")
  160. cls.update_wechat_score(log_type, crawler, wechat_score_data, host)
  161. # 更新微信指数
  162. @classmethod
  163. def update_wechat_score(cls, log_type, crawler, data, host):
  164. """
  165. 更新热词微信指数
  166. :param log_type: 日志名
  167. :param crawler: 哪款爬虫
  168. :param data: 热词微信指数
  169. :param host: 域名
  170. :return: {"code":200, "message":"success"}
  171. """
  172. try:
  173. url = '/hot/word/updateWechatScore'
  174. params = {'data': data}
  175. response = requests.post(url=host+url, json=params)
  176. if response.status_code != 200:
  177. Common.logger(log_type, crawler).warning(f"update_wechat_score_response:{response.text}\n")
  178. elif response.json()["message"] != "success":
  179. Common.logger(log_type, crawler).warning(f"update_wechat_score_response:{response.json()}\n")
  180. else:
  181. Common.logger(log_type, crawler).info(f"更新热词微信指数:{response.json()['message']}\n")
  182. except Exception as e:
  183. Common.logger(log_type, crawler).error(f"update_wechat_score:{e}\n")
  184. @classmethod
  185. def get_score_test(cls, log_type, crawler, word_id, word):
  186. wechat_key = cls.get_wechat_key(log_type, crawler)
  187. search_key = wechat_key[0]
  188. openid = wechat_key[-1]
  189. end_ymd = (date.today() + timedelta(days=0)).strftime("%Y%m%d")
  190. start_ymd = (date.today() + timedelta(days=-7)).strftime("%Y%m%d")
  191. url = "https://search.weixin.qq.com/cgi-bin/wxaweb/wxindex"
  192. payload = json.dumps({
  193. "openid": openid,
  194. "search_key": search_key,
  195. "cgi_name": "GetDefaultIndex",
  196. "start_ymd": start_ymd,
  197. "end_ymd": end_ymd,
  198. "query": word
  199. })
  200. headers = {
  201. 'Host': 'search.weixin.qq.com',
  202. 'content-type': 'application/json',
  203. 'User-Agent': 'Mozilla/5.0 (iPhone; CPU iPhone OS 13_3_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148 MicroMessenger/8.0.32(0x1800202a) NetType/WIFI Language/zh_CN',
  204. 'Referer': 'https://servicewechat.com/wxc026e7662ec26a3a/42/page-frame.html'
  205. }
  206. response = requests.request("POST", url, headers=headers, data=payload)
  207. wechat_score_list = []
  208. word_wechat_score_dict = {
  209. "id": word_id,
  210. "word": word,
  211. "wechatScores": wechat_score_list,
  212. }
  213. if response.json()['code'] == -10000:
  214. print(f"{time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(int(time.time())))} response:{response.json()['msg']} 休眠 10 秒,重新获取")
  215. time.sleep(10)
  216. cls.get_score_test(log_type, crawler, word_id, word)
  217. elif response.json()['code'] == -10002:
  218. print("该词暂未收录")
  219. print(f"{word_wechat_score_dict}")
  220. elif response.json()['code'] != 0:
  221. print(f"{word_wechat_score_dict}")
  222. else:
  223. time_index = response.json()['content']['resp_list'][0]['indexes'][0]['time_indexes']
  224. for i in range(len(time_index)):
  225. score_time = time_index[i]['time']
  226. score_time_str = f"{str(score_time)[:4]}-{str(score_time)[4:6]}-{str(score_time)[6:]}"
  227. score = time_index[i]['score']
  228. wechat_score_dict = {"score": score, "scoreDate": score_time_str}
  229. wechat_score_list.append(wechat_score_dict)
  230. print(f"wechat_score_dict:{wechat_score_dict}")
  231. print(word_wechat_score_dict)
  232. if __name__ == "__main__":
  233. Weixinzhishu.get_score_test('weixin', 'weixinzhishu', 1 , "乌克兰")
  234. pass