get_wechat_info.py 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220
  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. import time
  12. import re
  13. import requests
  14. import random
  15. class WechatApi():
  16. def __init__(self):
  17. self.driver = self.get_driver()
  18. self.log_in()
  19. def get_driver(self):
  20. options = ChromeOptions()
  21. # 防止selenium快速崩坏
  22. options.add_argument("--disable-dev-shm-usage")
  23. # driver = webdriver.Remote(
  24. # command_executor='http://192.168.7.245:4444/wd/hub',
  25. # options=options)
  26. driver = webdriver.Chrome()
  27. driver.maximize_window()
  28. return driver
  29. def log_in(self):
  30. self.driver.get('https://a.weixin.qq.com/index.html')
  31. img_selector = 'body > div.old-template > div > div > div.waiting.panelContent > div.wrp_code > img'
  32. 'body > div.old-template > div > div > div.waiting.panelContent > div.wrp_code > img'
  33. frame_login = self.driver.find_element_by_xpath('//*[@id="login_container"]/iframe')
  34. self.driver.switch_to.frame(frame_login)
  35. # WebDriverWait(driver, 3).until(EC.invisibility_of_element_located((By.CSS_SELECTOR, img_selector)))
  36. # time.sleep(3)
  37. img_url = self.driver.find_element_by_css_selector(img_selector)
  38. print('img', img_url.get_attribute('src'))
  39. WebDriverWait(self.driver, 100).until(lambda driver: self.driver.find_elements_by_link_text('广告投放'))
  40. def get_cookie(self):
  41. WebDriverWait(self.driver, 100).until(
  42. lambda x: [True for _ in self.driver.get_cookies() if 'token_ticket' == _['name']]
  43. )
  44. cookies = self.driver.get_cookies()
  45. cookie_dict = {}
  46. for _ in cookies:
  47. print(_)
  48. cookie_dict[_['name']] = _['value']
  49. return cookie_dict
  50. def wechat_cookie_save(self):
  51. # TODO:wechat cookie 存入数据库
  52. pass
  53. def api_get_name(self):
  54. # TODO:公众号有时拿不到
  55. def _api_get_name(self, service_name):
  56. WebDriverWait(self.driver, 100).until(
  57. lambda driver: True if service_name in self.driver.page_source and len(
  58. re.findall('g_tk=(\d+)', self.driver.page_source)) else False)
  59. cookie_dict = self.get_cookie()
  60. url_token = re.findall('g_tk=(\d+)', self.driver.page_source)
  61. url_token = url_token[0]
  62. # 得到公众号
  63. 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(
  64. token=url_token, time_=int(time.time()))
  65. rsp = requests.get(url=wechat_names_url, cookies=cookie_dict)
  66. print(service_name, rsp.text)
  67. WebDriverWait(self.driver, 100).until(
  68. lambda driver: True if len(
  69. re.findall('g_tk=(\d+)', self.driver.page_source)) else False)
  70. url_token = re.findall('g_tk=(\d+)', self.driver.page_source)
  71. url_token = url_token[0]
  72. 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(
  73. token=url_token, time_=int(time.time()))
  74. cookie_dict = self.get_cookie()
  75. rsp = requests.get(url=wechat_names_url, cookies=cookie_dict)
  76. service_name = self.driver.find_element_by_xpath('//*[@id="root"]/div/header/div/div[3]/div/div[1]').text
  77. print(service_name, rsp.text)
  78. service_name = ''
  79. self.service_loop(_api_get_name, {'self': self, 'service_name': service_name})
  80. def get_human_info(self):
  81. def _get_human_info(self, service_name):
  82. # 耗时一秒以内
  83. # self.driver.get('https://a.weixin.qq.com/client')
  84. WebDriverWait(self.driver, 100).until(
  85. lambda driver: True if service_name in self.driver.page_source and len(
  86. re.findall('g_tk=(\d+)', self.driver.page_source)) else False)
  87. cookie_dict = self.get_cookie()
  88. url_token = re.findall('g_tk=(\d+)', self.driver.page_source)[0]
  89. # 得到各个appid
  90. 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(
  91. token=url_token, time_=int(time.time()))
  92. rsp = requests.get(url=wechat_names_url, cookies=cookie_dict)
  93. print(wechat_names_url)
  94. print(rsp.text)
  95. wechat_id_list = []
  96. for i in rsp.json()['list']:
  97. wechat_id_list.append(i['appid'])
  98. # 普通用户的需要在1s内获取到
  99. # 得到wechat_token
  100. for i in wechat_id_list:
  101. wechat_id = i
  102. wechat_tran_url = 'http://a.weixin.qq.com/cgi-bin/agency/redirect_mp?appid={wechat_id}&g_tk={token}&mgr_type=1'.format(
  103. token=url_token, wechat_id=wechat_id)
  104. session = requests.session()
  105. rsp = session.get(wechat_tran_url, cookies=cookie_dict)
  106. print(rsp.url)
  107. token_id = re.findall('token=(\d+)', rsp.url)[0]
  108. print(token_id)
  109. 'http://a.weixin.qq.com/cgi-bin/agency/redirect_mp?appid=wxf82b302b1dde69e9&g_tk=1227235269&mgr_type=1'
  110. # 得到人群包
  111. human_url = 'https://mp.weixin.qq.com/promotion/dmpmgr?action=readlist&page=1&page_size=100&token={wechat_token}&appid=&spid=&_={time_}'.format(
  112. wechat_token=token_id, time_=int(time.time()))
  113. print(human_url)
  114. rsp = session.get(url=human_url)
  115. print(rsp.text)
  116. service_name = self.driver.find_element_by_xpath('//*[@id="root"]/div/header/div/div[3]/div/div[1]').text
  117. _get_human_info(self, service_name=service_name)
  118. self.service_loop(_get_human_info, {'self': self, 'service_name': service_name})
  119. def service_loop(self, function, kwargs):
  120. def click_service_change():
  121. self.driver.switch_to.window(self.driver.window_handles[-1])
  122. WebDriverWait(self.driver, 10).until(
  123. lambda x: self.driver.find_element_by_css_selector(
  124. '#root > div > header > div > div.CoreLayout__account-2lIr0 > div'))
  125. service_name_button = self.driver.find_element_by_css_selector(
  126. '#root > div > header > div > div.CoreLayout__account-2lIr0 > div')
  127. WebDriverWait(self.driver, 10).until(
  128. lambda x: (service_name_button.is_displayed() and service_name_button.is_enabled()))
  129. server_button = self.driver.find_element_by_css_selector(
  130. '#root > div > header > div > div.CoreLayout__account-2lIr0 > div')
  131. ActionChains(self.driver).move_to_element(server_button).click().perform()
  132. # server_button.click()
  133. time.sleep(random.uniform(0.1, 0.2))
  134. self.driver.find_element_by_css_selector(
  135. '#root > div > div.CoreLayout__headerDropdown-3xWkD > div > div:nth-child(1) > button').click()
  136. time.sleep(random.uniform(0.1, 0.2))
  137. # 得到所有service name
  138. service_name_all = set()
  139. service_name_used = set()
  140. self.driver.execute_script('''
  141. window.scroll(0,1000000);
  142. ''')
  143. time.sleep(random.uniform(3, 5))
  144. click_service_change()
  145. # WebDriverWait(self.driver, 10).until(
  146. # lambda x: self.driver.find_element_by_xpath('//*[@id="root"]/div/span/div/main/div/div[1]/div/h3'))
  147. # self.driver.find_element_by_xpath('//*[@id="root"]/div/span/div/main/div/div[1]/div/h3').click()
  148. # time.sleep(random.uniform(0.1,0.2))
  149. service_names = self.driver.find_elements_by_class_name('CoreLayout__headerDropdownItem-X4S98')
  150. for _ in service_names:
  151. service_name_all.add(_.text)
  152. # 第一个service_name
  153. service_name = self.driver.find_element_by_xpath('//*[@id="root"]/div/header/div/div[3]/div/div[1]').text
  154. service_name_used.add(service_name)
  155. # 循环使用完service_name为止
  156. for i in range(len(service_name_all) - 1):
  157. service_names = self.driver.find_elements_by_xpath('//*[@class="CoreLayout__headerDropdownItem-X4S98"]/p')
  158. for _ in service_names:
  159. print(_.text)
  160. for service_num in range(len(service_names)):
  161. _ = service_names[service_num]
  162. # TODO:服务商太多可能没法点击----需要拿服务商比较多的号测验一下.
  163. if _.text not in service_name_used:
  164. choice_service = _
  165. choice_service_name = _.text
  166. service_name_used.add(_.text)
  167. # self.driver.execute_script('''
  168. # var e_one=document.getElementsByClassName('CoreLayout__headerDropdown-3xWkD')[0]; e_one.scroll(10000,100000);
  169. # e_one.scroll(0,{y_localtion});
  170. # '''.format(y_localtion=service_num * 45))
  171. ActionChains(self.driver).move_to_element(choice_service).click().perform()
  172. # choice_service.click()
  173. if 'service_name' in kwargs.keys():
  174. kwargs['service_name'] = choice_service_name
  175. function(**kwargs)
  176. break
  177. # TODO:之后去除掉,time.sleep超过 1s 的,暂时先能跑
  178. time.sleep(random.uniform(3, 5))
  179. click_service_change()
  180. if __name__ == "__main__":
  181. # TODO:获取api失败时该怎么操作,
  182. pass