Browse Source

MOD:暂时修复获取数据问题

cxyu 3 years ago
parent
commit
a081a935b7
1 changed files with 120 additions and 75 deletions
  1. 120 75
      wechat_api/get_wechat_info.py

+ 120 - 75
wechat_api/get_wechat_info.py

@@ -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