get_weixinzhishu.py 12 KB

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