get_wechat_info.py 9.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187
  1. from selenium.webdriver import ActionChains
  2. from selenium.webdriver.support.wait import WebDriverWait
  3. import logging
  4. import json
  5. import time
  6. import re
  7. import requests
  8. import random
  9. class WechatApi():
  10. def __init__(self, log_ad):
  11. self.log_ad = log_ad
  12. self.driver = self.log_ad.driver
  13. self.human_info_list = []
  14. def api_get_name(self):
  15. # 微信公众号相关内容获取,现在基本不使用,用get_human_info为主
  16. def _api_get_name(self, service_name):
  17. WebDriverWait(self.driver, 100).until(
  18. lambda driver: True if service_name in self.driver.page_source and len(
  19. re.findall('g_tk=(\d+)', self.driver.page_source)) else False)
  20. cookie_dict = self.log_ad.get_cookie(self.driver)
  21. url_token = re.findall('g_tk=(\d+)', self.driver.page_source)
  22. url_token = url_token[0]
  23. # 得到公众号
  24. wechat_names_url = 'https://a.weixin.qq.com/cgi-bin/agency/get_delivery_metrics?page=1&page_size=10&search_key=&order_by=&ascending=1&only_collect=0&g_tk={token}&_={time_}'.format(
  25. token=url_token, time_=int(time.time()))
  26. rsp = requests.get(url=wechat_names_url, cookies=cookie_dict)
  27. print(service_name, rsp.text)
  28. WebDriverWait(self.driver, 100).until(
  29. lambda driver: True if len(
  30. re.findall('g_tk=(\d+)', self.driver.page_source)) else False)
  31. url_token = re.findall('g_tk=(\d+)', self.driver.page_source)
  32. url_token = url_token[0]
  33. wechat_names_url = 'https://a.weixin.qq.com/cgi-bin/agency/get_delivery_metrics?page=1&page_size=10&search_key=&order_by=&ascending=1&only_collect=0&g_tk={token}&_={time_}'.format(
  34. token=url_token, time_=int(time.time()))
  35. cookie_dict = self.log_ad.get_cookie(self.driver)
  36. rsp = requests.get(url=wechat_names_url, cookies=cookie_dict)
  37. service_name = self.driver.find_element_by_xpath('//*[@id="root"]/div/header/div/div[3]/div/div[1]').text
  38. print(service_name, rsp.text)
  39. service_name = ''
  40. self.service_loop(_api_get_name, {'self': self, 'service_name': service_name})
  41. def get_human_info(self, sql_session, err_num=0):
  42. try:
  43. def _get_human_info(self, service_name):
  44. # 耗时一秒以内
  45. # self.driver.get('https://a.weixin.qq.com/client')
  46. WebDriverWait(self.driver, 100).until(
  47. lambda driver: True if service_name in self.driver.page_source and len(
  48. re.findall('g_tk=(\d+)', self.driver.page_source)) else False)
  49. cookie_dict = self.log_ad.get_cookie(self.driver)
  50. url_token = re.findall('g_tk=(\d+)', self.driver.page_source)[0]
  51. # 得到各个appid
  52. wechat_names_url = 'https://a.weixin.qq.com/cgi-bin/agency/get_delivery_metrics?page=1&page_size=10&search_key=&order_by=&ascending=1&only_collect=0&g_tk={token}&_={time_}'.format(
  53. token=url_token, time_=int(time.time()))
  54. rsp = requests.get(url=wechat_names_url, cookies=cookie_dict)
  55. print(wechat_names_url)
  56. print(rsp.text)
  57. # 普通用户的需要在1s内获取到
  58. # 得到wechat_token
  59. for i in rsp.json()['list']:
  60. wechat_wxname = i['wxname']
  61. wechat_name = i['nickname']
  62. wechat_id = i['appid']
  63. wechat_tran_url = 'http://a.weixin.qq.com/cgi-bin/agency/redirect_mp?appid={wechat_id}&g_tk={token}&mgr_type=1'.format(
  64. token=url_token, wechat_id=wechat_id)
  65. session = requests.session()
  66. rsp = session.get(wechat_tran_url, cookies=cookie_dict)
  67. print(rsp.url)
  68. token_id = re.findall('token=(\d+)', rsp.url)[0]
  69. print(token_id)
  70. # 得到人群包
  71. human_url = 'https://mp.weixin.qq.com/promotion/dmpmgr?action=readlist&page=1&page_size=100&token={wechat_token}&appid=&spid=&_={time_}'.format(
  72. wechat_token=token_id, time_=int(time.time()))
  73. print(human_url)
  74. rsp = session.get(url=human_url)
  75. print(rsp.text)
  76. res_json = rsp.json()
  77. res_json['service_name'] = service_name
  78. res_json['wechat_name'] = wechat_name
  79. res_json['wxname'] = wechat_wxname
  80. res_json['appid'] = wechat_id
  81. self.human_info_list.append(res_json)
  82. print(self.human_info_list)
  83. print(json.dumps(self.human_info_list))
  84. time.sleep(random.uniform(3, 5))
  85. service_name = self.driver.find_element_by_xpath('//*[@id="root"]/div/header/div/div[3]/div/div[1]').text
  86. _get_human_info(self, service_name=service_name)
  87. self.service_loop(_get_human_info, {'self': self, 'service_name': service_name})
  88. self.log_ad.cookies_save(self.log_ad, sql_session)
  89. return {'sucess': True, 'result_info': '', "result_list": self.human_info_list}
  90. except Exception as e:
  91. logging.error(str(e))
  92. if err_num < 3:
  93. self.human_info_list = []
  94. return self.get_human_info(sql_session, err_num=err_num + 1)
  95. return {'sucess': False, 'result_info': str(e)}
  96. def service_loop(self, function, kwargs):
  97. def click_service_change():
  98. # self.driver.switch_to.window(self.driver.window_handles[-1])
  99. WebDriverWait(self.driver, 10).until(
  100. lambda x: self.driver.find_element_by_css_selector(
  101. '#root > div > header > div > div.CoreLayout__account-2lIr0 > div'))
  102. service_name_button = self.driver.find_element_by_css_selector(
  103. '#root > div > header > div > div.CoreLayout__account-2lIr0 > div')
  104. WebDriverWait(self.driver, 10).until(
  105. lambda x: (service_name_button.is_displayed() and service_name_button.is_enabled()))
  106. server_button = self.driver.find_element_by_css_selector(
  107. '#root > div > header > div > div.CoreLayout__account-2lIr0 > div')
  108. ActionChains(self.driver).move_to_element(server_button).click().perform()
  109. # server_button.click()
  110. time.sleep(random.uniform(0.1, 0.2))
  111. self.driver.find_element_by_css_selector(
  112. '#root > div > div.CoreLayout__headerDropdown-3xWkD > div > div:nth-child(1) > button').click()
  113. time.sleep(random.uniform(0.1, 0.2))
  114. # 得到所有service name
  115. service_name_all = set()
  116. service_name_used = set()
  117. self.driver.execute_script('''
  118. window.scroll(0,1000000);
  119. ''')
  120. # time.sleep(random.uniform(3, 5))
  121. click_service_change()
  122. # WebDriverWait(self.driver, 10).until(
  123. # lambda x: self.driver.find_element_by_xpath('//*[@id="root"]/div/span/div/main/div/div[1]/div/h3'))
  124. # self.driver.find_element_by_xpath('//*[@id="root"]/div/span/div/main/div/div[1]/div/h3').click()
  125. # time.sleep(random.uniform(0.1,0.2))
  126. service_names = self.driver.find_elements_by_class_name('CoreLayout__headerDropdownItem-X4S98')
  127. for _ in service_names:
  128. service_name_all.add(_.text)
  129. # 第一个service_name
  130. service_name = self.driver.find_element_by_xpath('//*[@id="root"]/div/header/div/div[3]/div/div[1]').text
  131. service_name_used.add(service_name)
  132. # 循环使用完service_name为止
  133. for i in range(len(service_name_all) - 1):
  134. service_names = self.driver.find_elements_by_xpath('//*[@class="CoreLayout__headerDropdownItem-X4S98"]/p')
  135. for _ in service_names:
  136. print(_.text)
  137. for service_num in range(len(service_names)):
  138. _ = service_names[service_num]
  139. if _.text not in service_name_used:
  140. choice_service = _
  141. choice_service_name = _.text
  142. service_name_used.add(_.text)
  143. # self.driver.execute_script('''
  144. # var e_one=document.getElementsByClassName('CoreLayout__headerDropdown-3xWkD')[0]; e_one.scroll(10000,100000);
  145. # e_one.scroll(0,{y_localtion});
  146. # '''.format(y_localtion=service_num * 45))
  147. ActionChains(self.driver).move_to_element(choice_service).click().perform()
  148. # choice_service.click()
  149. if 'service_name' in kwargs.keys():
  150. kwargs['service_name'] = choice_service_name
  151. function(**kwargs)
  152. break
  153. # time.sleep(random.uniform(3, 5))
  154. click_service_change()
  155. if __name__ == "__main__":
  156. pass