|
@@ -7,6 +7,7 @@ from wechat_action.send_ad_idea import IdeaAction
|
|
|
from wechat_action.human_ad import HumanAd
|
|
|
from selenium.webdriver import ChromeOptions
|
|
|
from selenium.webdriver.common.keys import Keys
|
|
|
+from functools import wraps
|
|
|
import time
|
|
|
import re
|
|
|
import requests
|
|
@@ -58,9 +59,13 @@ class WechatApi():
|
|
|
# TODO:wechat cookie 存入数据库
|
|
|
pass
|
|
|
|
|
|
- def get_wechat_name(self):
|
|
|
- def api_get_name(service_name):
|
|
|
- WebDriverWait(self.driver, 100).until(lambda driver: self.driver.find_elements_by_link_text('广告投放'))
|
|
|
+ def api_get_name(self):
|
|
|
+ # TODO:公众号有时拿不到
|
|
|
+ def _api_get_name(self, service_name):
|
|
|
+ WebDriverWait(self.driver, 100).until(
|
|
|
+ lambda driver: True if service_name in self.driver.page_source and len(
|
|
|
+ re.findall('g_tk=(\d+)', self.driver.page_source)) else False)
|
|
|
+
|
|
|
cookie_dict = self.get_cookie()
|
|
|
|
|
|
url_token = re.findall('g_tk=(\d+)', self.driver.page_source)
|
|
@@ -72,41 +77,73 @@ class WechatApi():
|
|
|
rsp = requests.get(url=wechat_names_url, cookies=cookie_dict)
|
|
|
print(service_name, rsp.text)
|
|
|
|
|
|
- # 得到所有service name
|
|
|
- service_name_all = set()
|
|
|
- service_name_used = set()
|
|
|
- self.driver.execute_script('''
|
|
|
- window.scroll(0,1000000);
|
|
|
- ''')
|
|
|
- self.driver.find_element_by_css_selector(
|
|
|
- '#root > div > header > div > div.CoreLayout__account-2lIr0 > div').click()
|
|
|
- time.sleep(random.uniform(0.1, 0.2))
|
|
|
- self.driver.find_element_by_css_selector(
|
|
|
- '#root > div > div.CoreLayout__headerDropdown-3xWkD > div > div:nth-child(1) > button').click()
|
|
|
- time.sleep(random.uniform(0.1, 0.2))
|
|
|
+ WebDriverWait(self.driver, 100).until(
|
|
|
+ lambda driver: True if len(
|
|
|
+ re.findall('g_tk=(\d+)', self.driver.page_source)) else False)
|
|
|
+ url_token = re.findall('g_tk=(\d+)', self.driver.page_source)
|
|
|
+ url_token = url_token[0]
|
|
|
+ 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(
|
|
|
+ token=url_token, time_=int(time.time()))
|
|
|
+ cookie_dict = self.get_cookie()
|
|
|
+ rsp = requests.get(url=wechat_names_url, cookies=cookie_dict)
|
|
|
+ service_name = self.driver.find_element_by_xpath('//*[@id="root"]/div/header/div/div[3]/div/div[1]').text
|
|
|
+ print(service_name, rsp.text)
|
|
|
|
|
|
- service_names = self.driver.find_elements_by_class_name('CoreLayout__headerDropdownItem-X4S98')
|
|
|
- for _ in service_names:
|
|
|
- service_name_all.add(_.text)
|
|
|
+ service_name = ''
|
|
|
+ self.service_loop(_api_get_name, {'self': self, 'service_name': service_name})
|
|
|
|
|
|
- # 第一个service_name
|
|
|
- server_name = self.driver.find_element_by_xpath('//*[@id="root"]/div/header/div/div[3]/div/div[1]').text
|
|
|
- service_name_used.add(server_name)
|
|
|
+ def get_human_info(self):
|
|
|
+ def _get_human_info(self, service_name):
|
|
|
|
|
|
- # 循环使用完service_name为止
|
|
|
- for i in range(len(service_name_all)):
|
|
|
+ # 耗时一秒以内
|
|
|
+ # self.driver.get('https://a.weixin.qq.com/client')
|
|
|
|
|
|
- service_names = self.driver.find_elements_by_xpath('//*[@class="CoreLayout__headerDropdownItem-X4S98"]/p')
|
|
|
- for _ in service_names:
|
|
|
- #TODO:服务商太多可能没法点击
|
|
|
- if _.text not in service_name_used:
|
|
|
- choice_service = _
|
|
|
- choice_service_name = _.text
|
|
|
- service_name_used.add(_.text)
|
|
|
- choice_service.click()
|
|
|
- api_get_name(choice_service_name)
|
|
|
- break
|
|
|
+ WebDriverWait(self.driver, 100).until(
|
|
|
+ lambda driver: True if service_name in self.driver.page_source and len(
|
|
|
+ re.findall('g_tk=(\d+)', self.driver.page_source)) else False)
|
|
|
+
|
|
|
+ cookie_dict = self.get_cookie()
|
|
|
+ url_token = re.findall('g_tk=(\d+)', self.driver.page_source)[0]
|
|
|
+
|
|
|
+ # 得到各个appid
|
|
|
+ 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(
|
|
|
+ token=url_token, time_=int(time.time()))
|
|
|
+ rsp = requests.get(url=wechat_names_url, cookies=cookie_dict)
|
|
|
+
|
|
|
+ print(wechat_names_url)
|
|
|
+ print(rsp.text)
|
|
|
+
|
|
|
+ wechat_id_list = []
|
|
|
+ for i in rsp.json()['list']:
|
|
|
+ wechat_id_list.append(i['appid'])
|
|
|
+
|
|
|
+ # 普通用户的需要在1s内获取到
|
|
|
+ # 得到wechat_token
|
|
|
+ for i in wechat_id_list:
|
|
|
+ wechat_id = i
|
|
|
+ wechat_tran_url = 'http://a.weixin.qq.com/cgi-bin/agency/redirect_mp?appid={wechat_id}&g_tk={token}&mgr_type=1'.format(
|
|
|
+ token=url_token, wechat_id=wechat_id)
|
|
|
+ session = requests.session()
|
|
|
+ rsp = session.get(wechat_tran_url, cookies=cookie_dict)
|
|
|
|
|
|
+ print(rsp.url)
|
|
|
+ token_id = re.findall('token=(\d+)', rsp.url)[0]
|
|
|
+ print(token_id)
|
|
|
+ 'http://a.weixin.qq.com/cgi-bin/agency/redirect_mp?appid=wxf82b302b1dde69e9&g_tk=1227235269&mgr_type=1'
|
|
|
+ # 得到人群包
|
|
|
+ human_url = 'https://mp.weixin.qq.com/promotion/dmpmgr?action=readlist&page=1&page_size=100&token={wechat_token}&appid=&spid=&_={time_}'.format(
|
|
|
+ wechat_token=token_id, time_=int(time.time()))
|
|
|
+ print(human_url)
|
|
|
+ rsp = session.get(url=human_url)
|
|
|
+ print(rsp.text)
|
|
|
+
|
|
|
+ service_name = self.driver.find_element_by_xpath('//*[@id="root"]/div/header/div/div[3]/div/div[1]').text
|
|
|
+ _get_human_info(self, service_name=service_name)
|
|
|
+ self.service_loop(_get_human_info, {'self': self, 'service_name': service_name})
|
|
|
+
|
|
|
+ def service_loop(self, function, kwargs):
|
|
|
+
|
|
|
+ def click_service_change():
|
|
|
self.driver.switch_to.window(self.driver.window_handles[-1])
|
|
|
WebDriverWait(self.driver, 10).until(
|
|
|
lambda x: self.driver.find_element_by_css_selector(
|
|
@@ -116,60 +153,68 @@ class WechatApi():
|
|
|
WebDriverWait(self.driver, 10).until(
|
|
|
lambda x: (service_name_button.is_displayed() and service_name_button.is_enabled()))
|
|
|
|
|
|
- #TODO:需要查看为什么无法点击
|
|
|
- self.driver.find_element_by_css_selector(
|
|
|
- '#root > div > header > div > div.CoreLayout__account-2lIr0 > div').click()
|
|
|
+ server_button = self.driver.find_element_by_css_selector(
|
|
|
+ '#root > div > header > div > div.CoreLayout__account-2lIr0 > div')
|
|
|
+ ActionChains(self.driver).move_to_element(server_button).click().perform()
|
|
|
+ # server_button.click()
|
|
|
+
|
|
|
time.sleep(random.uniform(0.1, 0.2))
|
|
|
|
|
|
self.driver.find_element_by_css_selector(
|
|
|
'#root > div > div.CoreLayout__headerDropdown-3xWkD > div > div:nth-child(1) > button').click()
|
|
|
time.sleep(random.uniform(0.1, 0.2))
|
|
|
|
|
|
- def get_human_info(self):
|
|
|
- # TODO:多服务商
|
|
|
-
|
|
|
- # 耗时一秒以内
|
|
|
- self.driver.get('https://a.weixin.qq.com/client')
|
|
|
- WebDriverWait(self.driver, 100).until(lambda driver: driver.find_elements_by_link_text('广告投放'))
|
|
|
-
|
|
|
- cookie_dict = self.get_cookie()
|
|
|
- url_token = re.findall('g_tk=(\d+)', self.driver.page_source)
|
|
|
- url_token = url_token[0]
|
|
|
+ # 得到所有service name
|
|
|
+ service_name_all = set()
|
|
|
+ service_name_used = set()
|
|
|
+ self.driver.execute_script('''
|
|
|
+ window.scroll(0,1000000);
|
|
|
+ ''')
|
|
|
+ time.sleep(random.uniform(3, 5))
|
|
|
+ click_service_change()
|
|
|
|
|
|
- # 得到各个appid
|
|
|
- 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(
|
|
|
- token=url_token, time_=int(time.time()))
|
|
|
- rsp = requests.get(url=wechat_names_url, cookies=cookie_dict)
|
|
|
- wechat_id_list = []
|
|
|
- for i in rsp.json()['list']:
|
|
|
- wechat_id_list.append(i['appid'])
|
|
|
- print(rsp.text)
|
|
|
+ # WebDriverWait(self.driver, 10).until(
|
|
|
+ # lambda x: self.driver.find_element_by_xpath('//*[@id="root"]/div/span/div/main/div/div[1]/div/h3'))
|
|
|
+ # self.driver.find_element_by_xpath('//*[@id="root"]/div/span/div/main/div/div[1]/div/h3').click()
|
|
|
+ # time.sleep(random.uniform(0.1,0.2))
|
|
|
|
|
|
- # 普通用户的需要在1s内获取到
|
|
|
- # 得到wechat_token
|
|
|
+ service_names = self.driver.find_elements_by_class_name('CoreLayout__headerDropdownItem-X4S98')
|
|
|
+ for _ in service_names:
|
|
|
+ service_name_all.add(_.text)
|
|
|
|
|
|
- time_one = time.time()
|
|
|
- for _ in range(25):
|
|
|
- for i in wechat_id_list:
|
|
|
- wechat_id = i
|
|
|
- wechat_tran_url = 'http://a.weixin.qq.com/cgi-bin/agency/redirect_mp?appid={wechat_id}&g_tk={token}&mgr_type=1'.format(
|
|
|
- token=url_token, wechat_id=wechat_id)
|
|
|
- session = requests.session()
|
|
|
- rsp = session.get(wechat_tran_url, cookies=cookie_dict)
|
|
|
+ # 第一个service_name
|
|
|
+ service_name = self.driver.find_element_by_xpath('//*[@id="root"]/div/header/div/div[3]/div/div[1]').text
|
|
|
+ service_name_used.add(service_name)
|
|
|
|
|
|
- # print(rsp.url)
|
|
|
- token_id = re.findall('token=(\d+)', rsp.url)[0]
|
|
|
- print(token_id)
|
|
|
+ # 循环使用完service_name为止
|
|
|
+ for i in range(len(service_name_all) - 1):
|
|
|
|
|
|
- # 得到人群包
|
|
|
- human_url = 'https://mp.weixin.qq.com/promotion/dmpmgr?action=readlist&page=1&page_size=100&token={wechat_token}&appid=&spid=&_={time_}'.format(
|
|
|
- wechat_token=token_id, time_=int(time.time()))
|
|
|
- print(human_url)
|
|
|
- rsp = session.get(url=human_url)
|
|
|
- print(rsp.text)
|
|
|
- time_two = time.time()
|
|
|
- print('耗时', time_two - time_one)
|
|
|
+ service_names = self.driver.find_elements_by_xpath('//*[@class="CoreLayout__headerDropdownItem-X4S98"]/p')
|
|
|
+ for _ in service_names:
|
|
|
+ print(_.text)
|
|
|
+ for service_num in range(len(service_names)):
|
|
|
+ _ = service_names[service_num]
|
|
|
+ # TODO:服务商太多可能没法点击----需要拿服务商比较多的号测验一下.
|
|
|
+ if _.text not in service_name_used:
|
|
|
+ choice_service = _
|
|
|
+ choice_service_name = _.text
|
|
|
+ service_name_used.add(_.text)
|
|
|
+ # self.driver.execute_script('''
|
|
|
+ # var e_one=document.getElementsByClassName('CoreLayout__headerDropdown-3xWkD')[0]; e_one.scroll(10000,100000);
|
|
|
+ # e_one.scroll(0,{y_localtion});
|
|
|
+ # '''.format(y_localtion=service_num * 45))
|
|
|
+
|
|
|
+ ActionChains(self.driver).move_to_element(choice_service).click().perform()
|
|
|
+ # choice_service.click()
|
|
|
+ if 'service_name' in kwargs.keys():
|
|
|
+ kwargs['service_name'] = choice_service_name
|
|
|
+ function(**kwargs)
|
|
|
+ break
|
|
|
+ # TODO:之后去除掉,time.sleep超过 1s 的,暂时先能跑
|
|
|
+ time.sleep(random.uniform(3, 5))
|
|
|
+ click_service_change()
|
|
|
|
|
|
|
|
|
if __name__ == "__main__":
|
|
|
+ # TODO:获取api失败时该怎么操作,
|
|
|
pass
|