weixinzhishu.py 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277
  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. sheet = Feishu.get_values_batch(log_type, crawler, 'sVL74k')
  27. for i in range(len(sheet)):
  28. search_key = sheet[1][1]
  29. openid = sheet[1][2]
  30. return search_key, openid
  31. except Exception as e:
  32. Common.logger(log_type, crawler).error(f"wechat_key:{e}\n")
  33. # 获取热词
  34. @classmethod
  35. def get_word(cls):
  36. url = '/hot/word/getAllWords'
  37. params = {
  38. 'pageNum': cls.pageNum, # 第几页,默认1,int
  39. 'pageSize': 100 # 请求条目数,默认为100,int
  40. }
  41. response = requests.post(url=url, json=params)
  42. cls.pageNum += 1
  43. word_list = []
  44. print(response.text)
  45. return word_list
  46. # 获取热词分数
  47. @classmethod
  48. def get_word_score(cls, log_type, crawler, word_id, word):
  49. """
  50. 获取热词分数
  51. :param log_type: 日志名
  52. :param crawler: 哪款爬虫,填写:weixinzhishu
  53. :param word_id: 热词 ID
  54. :param word: 热词
  55. :return: 热词 7 天指数,例如:
  56. {'id': 1,
  57. 'word': '消息',
  58. 'wechatScores': [
  59. {'score': 95521022, 'scoreDate': '2023-02-07'},
  60. {'score': 97315283, 'scoreDate': '2023-02-08'},
  61. {'score': 109845849, 'scoreDate': '2023-02-09'},
  62. {'score': 107089560, 'scoreDate': '2023-02-10'},
  63. {'score': 102658391, 'scoreDate': '2023-02-11'},
  64. {'score': 93843701, 'scoreDate': '2023-02-12'},
  65. {'score': 100211894, 'scoreDate': '2023-02-13'}]}
  66. """
  67. try:
  68. wechat_key = cls.get_wechat_key(log_type, crawler)
  69. search_key = wechat_key[0]
  70. openid = wechat_key[-1]
  71. end_ymd = (date.today() + timedelta(days=0)).strftime("%Y%m%d")
  72. start_ymd = (date.today() + timedelta(days=-7)).strftime("%Y%m%d")
  73. url = "https://search.weixin.qq.com/cgi-bin/wxaweb/wxindex"
  74. payload = json.dumps({
  75. "openid": openid,
  76. "search_key": search_key,
  77. "cgi_name": "GetDefaultIndex",
  78. "start_ymd": start_ymd,
  79. "end_ymd": end_ymd,
  80. "query": word
  81. })
  82. headers = {
  83. 'Host': 'search.weixin.qq.com',
  84. 'content-type': 'application/json',
  85. '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',
  86. 'Referer': 'https://servicewechat.com/wxc026e7662ec26a3a/42/page-frame.html'
  87. }
  88. response = requests.request("POST", url, headers=headers, data=payload)
  89. wechat_score_list = []
  90. word_wechat_score_dict = {
  91. "id": word_id,
  92. "word": word,
  93. "wechatScores": wechat_score_list,
  94. }
  95. if response.json()['code'] == -10000:
  96. # Common.logger(log_type, crawler).warning(f"response:{response.json()['msg']} 休眠 10 秒,重新获取\n")
  97. # time.sleep(10)
  98. # cls.get_word_score(log_type, crawler, word_id, word)
  99. return None
  100. elif response.json()['code'] == -10002:
  101. # Common.logger(log_type, crawler).info(f'{word}:该词暂未收录')
  102. # # 数据写入飞书
  103. # now = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime(int(time.time())))
  104. # values = [[now, word, "该词暂未收录"]]
  105. # Feishu.insert_columns(log_type, crawler, "5011a2", "ROWS", 1, 2)
  106. # time.sleep(0.5)
  107. # Feishu.update_values(log_type, crawler, "5011a2", "F2:Z2", values)
  108. # Common.logger(log_type, crawler).info(f'热词"{word}"微信指数数据写入飞书成功\n')
  109. return word_wechat_score_dict
  110. elif response.json()['code'] != 0:
  111. Common.logger(log_type, crawler).info(f'response:{response.text}\n')
  112. return word_wechat_score_dict
  113. else:
  114. time_index = response.json()['content']['resp_list'][0]['indexes'][0]['time_indexes']
  115. for i in range(len(time_index)):
  116. score_time = time_index[i]['time']
  117. score_time_str = f"{str(score_time)[:4]}-{str(score_time)[4:6]}-{str(score_time)[6:]}"
  118. score = time_index[i]['score']
  119. wechat_score_dict = {"score": score, "scoreDate": score_time_str}
  120. wechat_score_list.append(wechat_score_dict)
  121. # # 数据写入飞书
  122. # now = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime(int(time.time())))
  123. # values = [[now, word, score_time_str, score]]
  124. # Feishu.insert_columns(log_type, crawler, "5011a2", "ROWS", 1, 2)
  125. # time.sleep(0.5)
  126. # Feishu.update_values(log_type, crawler, "5011a2", "F2:Z2", values)
  127. # Common.logger(log_type, crawler).info(f'热词"{word}"微信指数数据写入飞书成功\n')
  128. return word_wechat_score_dict
  129. except Exception as e:
  130. Common.logger(log_type, crawler).error(f"weixinzhishu异常:{e}\n")
  131. # 获取微信指数
  132. @classmethod
  133. def get_wechat_score(cls, log_type, crawler):
  134. """
  135. 获取微信指数
  136. :param log_type: 日志名
  137. :param crawler: 哪款爬虫
  138. :return: 热词指数列表
  139. """
  140. while True:
  141. word_list = cls.get_word()
  142. if len(word_list) == 0:
  143. Common.logger(log_type, crawler).info(f"热词更新完毕\n")
  144. cls.pageNum = 1
  145. return []
  146. else:
  147. wechat_score_data = []
  148. for i in range(len(word_list)):
  149. word_id = word_list[i]['Id']
  150. word = word_list[i]['word']
  151. word_score_dict = cls.get_word_score(log_type, crawler, word_id, word)
  152. wechat_score_data.append(word_score_dict)
  153. return wechat_score_data
  154. # 更新微信指数
  155. @classmethod
  156. def update_wechat_score(cls, log_type, crawler):
  157. """
  158. 更新热词微信指数
  159. :param log_type: 日志名
  160. :param crawler: 哪款爬虫
  161. :return: {"code":200, "message":"success"}
  162. """
  163. data = {
  164. 'data': cls.get_wechat_score(log_type, crawler)
  165. }
  166. url = '/hot/word/updateWechatScore'
  167. params = {
  168. 'data': data
  169. }
  170. response = requests.post(url=url, json=params)
  171. print(response.text)
  172. @classmethod
  173. def update_wechat_score_test(cls, log_type, crawler):
  174. our_word_list = []
  175. out_word_list = []
  176. our_word_sheet = Feishu.get_values_batch(log_type, 'weixinzhishu_search_word', "nCudsM")
  177. out_word_sheet = Feishu.get_values_batch(log_type, 'weixinzhishu_search_word', "D80uEf")
  178. for x in our_word_sheet:
  179. for y in x:
  180. if y is None:
  181. pass
  182. else:
  183. our_word_list.append(y)
  184. for x in out_word_sheet:
  185. for y in x:
  186. if y is None:
  187. pass
  188. else:
  189. out_word_list.append(y)
  190. word_list = our_word_list+out_word_list
  191. word_score_list = []
  192. # for i in range(len(word_list)):
  193. for i in range(100):
  194. while True:
  195. Common.logger(log_type, crawler).info(f"word_id:{i + 1}, word:{word_list[i]}")
  196. word_score = cls.get_word_score(log_type, crawler, int(i + 1), word_list[i])
  197. if word_score is None:
  198. Common.logger(log_type, crawler).info("微信key过期,10秒钟后重试")
  199. time.sleep(10)
  200. else:
  201. word_score_list.append(word_score)
  202. Common.logger(log_type, crawler).info(f'微信指数:{word_score}\n')
  203. break
  204. word_dict = {
  205. "data": word_score_list
  206. }
  207. return word_dict
  208. @classmethod
  209. def get_score_test(cls, log_type, crawler, word_id, word):
  210. wechat_key = cls.get_wechat_key(log_type, crawler)
  211. search_key = wechat_key[0]
  212. openid = wechat_key[-1]
  213. end_ymd = (date.today() + timedelta(days=0)).strftime("%Y%m%d")
  214. start_ymd = (date.today() + timedelta(days=-7)).strftime("%Y%m%d")
  215. url = "https://search.weixin.qq.com/cgi-bin/wxaweb/wxindex"
  216. payload = json.dumps({
  217. "openid": openid,
  218. "search_key": search_key,
  219. "cgi_name": "GetDefaultIndex",
  220. "start_ymd": start_ymd,
  221. "end_ymd": end_ymd,
  222. "query": word
  223. })
  224. headers = {
  225. 'Host': 'search.weixin.qq.com',
  226. 'content-type': 'application/json',
  227. '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',
  228. 'Referer': 'https://servicewechat.com/wxc026e7662ec26a3a/42/page-frame.html'
  229. }
  230. response = requests.request("POST", url, headers=headers, data=payload)
  231. wechat_score_list = []
  232. word_wechat_score_dict = {
  233. "id": word_id,
  234. "word": word,
  235. "wechatScores": wechat_score_list,
  236. }
  237. if response.json()['code'] == -10000:
  238. print(f"{time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(int(time.time())))} response:{response.json()['msg']} 休眠 10 秒,重新获取\n")
  239. time.sleep(10)
  240. cls.get_score_test(log_type, crawler, word_id, word)
  241. elif response.json()['code'] == -10002:
  242. print("该词暂未收录")
  243. print(f"{word_wechat_score_dict}")
  244. elif response.json()['code'] != 0:
  245. print(f"{word_wechat_score_dict}")
  246. else:
  247. time_index = response.json()['content']['resp_list'][0]['indexes'][0]['time_indexes']
  248. for i in range(len(time_index)):
  249. score_time = time_index[i]['time']
  250. score_time_str = f"{str(score_time)[:4]}-{str(score_time)[4:6]}-{str(score_time)[6:]}"
  251. score = time_index[i]['score']
  252. wechat_score_dict = {"score": score, "scoreDate": score_time_str}
  253. wechat_score_list.append(wechat_score_dict)
  254. print(f"wechat_score_dict:{wechat_score_dict}")
  255. print(word_wechat_score_dict)
  256. if __name__ == "__main__":
  257. Weixinzhishu.get_score_test('weixin', 'weixinzhishu', 1 , "春晚")
  258. #
  259. # word_dict_demo = Weixinzhishu.update_wechat_score_test('weixin', 'weixinzhishu')
  260. # print(word_dict_demo)
  261. pass