get_wechat_info.py 8.7 KB

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