get_wechat_info.py 7.5 KB

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