Explorar el Código

MOD:创建广告之前

cxyu hace 4 años
padre
commit
c61b1b1eaf

+ 275 - 7
wechat_action/create_ad.py

@@ -1,12 +1,280 @@
-#这个页面是广告计划投放
+from wechat_action.login_ad import LogIn
+from selenium import webdriver
+from selenium.webdriver import ActionChains
+from selenium.webdriver.common.by import By
+from selenium.webdriver.support import expected_conditions as EC
+from selenium.webdriver.support.wait import WebDriverWait
+from selenium.webdriver import ChromeOptions
+import time
+import random
+import re
 
 
-#点击创建广告,切到广告页面
-    # gg_button=driver.find_element_by_css_selector('#wxadcontainer > div:nth-child(1) > div.weui-desktop-layout__main__bd > div.weui-desktop-panel > div.mod-infobox > div.mod-infobox__sub-head.ui-bt-none > div > div.ui-fl-r > button')
-    # gg_button.click()
+class CreateAd:
+    def __init__(self):
+        # TODO:创建完页面需要关闭所有页面并回到一开始的页面
+        self.driver = LogIn().get_driver_loged()
+        self.get_into_create_page()
+        self.send_file_limit_num = 8
 
-    #投放计划创建
+    def get_into_create_page(self):
+        # 进入创建页面
+        self.driver.find_element_by_id('material').click()
+        WebDriverWait(self.driver, 10).until(lambda driver: driver.find_element_by_class_name('ui-fl-r'))
+        time.sleep(random.uniform(0.1, 0.2))
+        self.driver.find_element_by_class_name('ui-fl-r').click()
+        WebDriverWait(self.driver, 5).until(lambda driver: driver.find_element_by_css_selector(
+            '#wxadcontainer > div:nth-child(1) > div:nth-child(2) > div.dialog-1fj_N480ZT > div > div > div:nth-child(1) > div.dialogCardFooter-17KpBD1lgN > button'))
+        self.driver.find_element_by_css_selector(
+            '#wxadcontainer > div:nth-child(1) > div:nth-child(2) > div.dialog-1fj_N480ZT > div > div > div:nth-child(1) > div.dialogCardFooter-17KpBD1lgN > button').click()
+        self.driver.switch_to.window(self.driver.window_handles[-1])
+        WebDriverWait(self.driver, 100).until(lambda driver: driver.find_element_by_class_name('addContent-8pexaaAGYy'))
+        self.driver.find_element_by_class_name('addContent-8pexaaAGYy').click()
+        WebDriverWait(self.driver, 100).until(lambda driver: driver.find_element_by_class_name('topArea-qOwEAeNuIn'))
 
-    #广告创建
+    def create_layout(self):
+        # 创建编排
+        pass
 
-    #创意创建
+    def set_head_assemb(self, info):
+        def single_page_set():
+            pass
+
+        def multi_page_set():
+            self.driver.find_element_by_css_selector(
+                '#stage-sidebar > div.topArea-qOwEAeNuIn > div > div:nth-child(2)').click()
+            time.sleep(random.uniform(0.1, 0.2))
+            page_size = len(info_v)
+            if page_size == 3:
+                pass
+            if page_size == 4:
+                self.driver.find_element_by_css_selector(
+                    '#stage-settings > div:nth-child(1) > div > div > div:nth-child(3) > div.adui-form-item > div.adui-form-control > div > button:nth-child(2)').click()
+
+            if page_size == 6:
+                self.driver.find_element_by_css_selector(
+                    '#stage-settings > div:nth-child(1) > div > div > div:nth-child(3) > div.adui-form-item > div.adui-form-control > div > button:nth-child(3)').click()
+
+            time.sleep(random.uniform(0.1, 0.2))
+            self.driver.find_element_by_class_name('imageUploadItem-tA9JX0RWua').click()
+            WebDriverWait(self.driver, 1000).until(
+                lambda driver: self.driver.find_element_by_class_name('adui-tabs-tab')
+            )
+            input_elements = self.driver.find_elements_by_tag_name('input')
+            input_find_element = None
+            for _ in input_elements:
+                if '输入关键词搜索素材' in _.get_attribute('placeholder'):
+                    input_find_element = _
+            from selenium.webdriver.common.keys import Keys
+
+            for _ in info_v:
+                import os
+                file_name = os.path.basename(_)
+                print(file_name)
+                input_find_element.clear()
+                print('clear')
+                print(input_find_element.get_attribute('value'))
+                time.sleep(5)
+
+                #TODO:input----clear 进行清空有问题
+
+                input_find_element.send_keys(file_name)
+                input_find_element.send_keys(Keys.RETURN)
+                WebDriverWait(self.driver, 1000).until(
+                    lambda driver: driver.find_element_by_class_name('imgWrp-3KLtxlD1Db'))
+                file_element = self.driver.find_element_by_class_name('imgWrp-3KLtxlD1Db')
+                WebDriverWait(self.driver, 1000).until(
+                    lambda x: (file_element.is_displayed() and file_element.is_enabled()))
+
+                file_element.click()
+                time.sleep(random.uniform(1,4))
+
+            time.sleep(1000)
+            self.driver.find_elements_by_class_name('adui-tabs-tab')[1].click()
+            for i in range(len(info_v)):
+                self.driver.find_element_by_xpath("//div[starts-with(@id,'js_multi_upload_material')]/input").send_keys(
+                    info_v[i])
+
+        info_key = list(info.keys())[0]
+        info_v = info[info_key]
+
+        if info_key == 'page':
+            single_page_set()
+        if info_key == 'multi_page':
+            multi_page_set()
+        # 设置头部组件
+        pass
+
+    def set_page(self):
+        # 设置图片模块
+        pass
+
+    def set_title(self):
+        # 设置标题模块
+        pass
+
+    def set_content(self):
+        # 输入文本内容
+        pass
+
+    def set_follow_button(self):
+        # 设置关注按钮
+        pass
+
+    def set_set_text_button(self):
+        # 设置图文按钮
+        pass
+
+    def send_file_multi(self, layout, err_num=0):
+        # 上传文件,文件上传与整体流程切割开
+        token = re.findall('token=(\d+)', self.driver.current_url)
+        url_ = 'https://mp.weixin.qq.com/promotion/frame?t=ad_system/common_frame&t1=material_std/material_library&token={}'.format(
+            token[0])
+        js = "window.open('{}')".format(url_)
+        print(js)
+        self.driver.execute_script(js)
+        time.sleep(random.uniform(1, 2))
+        self.driver.switch_to.window(self.driver.window_handles[-1])
+        file_set = set()
+        for v in layout.values():
+            if isinstance(v, dict):
+                if 'multi_page' in v.keys() or 'page' in v.keys() or 'movie' in v.keys():
+                    v_name = list(v.keys())[0]
+                    if isinstance(v[v_name], list):
+                        for _ in v[v_name]:
+                            file_set.add(_)
+                    else:
+                        file_set.add(v[v_name])
+        file_list = list(file_set)
+        print(file_list)
+        print('file list size', len(file_list))
+        send_file_sign = self.send_file_limit_num
+        for _ in file_list:
+            print(_)
+            self.driver.find_element_by_xpath('//*[@id="wxadcontainer"]/div[1]/div[2]/div[4]/input').send_keys(_)
+
+        time.sleep(100)
+        while True:
+            # 失败,失败直接退出重跑
+            # 正在上传数量,如果是正在上传小于限定数量,就不断输入
+            # 上传完毕,小于限定数量,不断输入,.....已经上传好了,就关闭
+            time.sleep(1)
+            send_reslut_content = self.driver.find_element_by_xpath(
+                '//*[@id="wxadcontainer"]/div[1]/div[2]/div[4]/div/strong').text
+            if '失败' in send_reslut_content:
+                if err_num < 3:
+                    self.send_file(layout, err_num=err_num + 1)
+                else:
+                    exit()
+            if '正在上传' in send_reslut_content:
+                if send_file_sign < len(file_list):
+                    send_num = re.findall('(\d+)', send_reslut_content)[0]
+                    if int(send_num) < self.send_file_limit_num:
+                        # 还可以继续上传
+                        x = send_file_sign
+                        can_send_sign = send_file_sign + (self.send_file_limit_num - send_num)
+                        y = can_send_sign if can_send_sign < len(file_list) else len(file_list)
+                        for i in range(x, y):
+                            send_file_sign = send_file_sign + 1
+                            self.driver.find_element_by_xpath(
+                                '//*[@id="wxadcontainer"]/div[1]/div[2]/div[4]/input').send_keys(file_list[i])
+
+                else:
+                    pass
+            if '上传成功' in send_reslut_content:
+                if send_file_sign < len(file_list):
+                    send_num = re.findall('(\d+)', send_reslut_content)[0]
+                    if int(send_num) < self.send_file_limit_num:
+                        # 还可以继续上传
+                        x = send_file_sign
+                        can_send_sign = send_file_sign + (self.send_file_limit_num - send_num)
+                        y = can_send_sign if can_send_sign < len(file_list) else len(file_list)
+                        for i in range(x, y):
+                            send_file_sign = send_file_sign + 1
+                            self.driver.find_element_by_xpath(
+                                '//*[@id="wxadcontainer"]/div[1]/div[2]/div[4]/input').send_keys(file_list[i])
+                else:
+                    break
+
+        time.sleep(1000)
+        self.driver.execute_script('window.close();')
+
+    def send_file(self, file_path, err_num=0):
+        self.driver.execute_script('location.reload();')
+        self.driver.find_element_by_xpath('//*[@id="wxadcontainer"]/div[1]/div[2]/div[4]/input').send_keys(file_path)
+
+    def send_file_alone(self, layout):
+        # 上传文件,单线程
+        # 上传文件,文件上传与整体流程切割开
+        token = re.findall('token=(\d+)', self.driver.current_url)
+        url_ = 'https://mp.weixin.qq.com/promotion/frame?t=ad_system/common_frame&t1=material_std/material_library&token={}'.format(
+            token[0])
+        js = "window.open('{}')".format(url_)
+        self.driver.execute_script(js)
+        time.sleep(random.uniform(1, 2))
+        self.driver.switch_to.window(self.driver.window_handles[-1])
+        file_set = set()
+        for v in layout.values():
+            if isinstance(v, dict):
+                if 'multi_page' in v.keys() or 'page' in v.keys() or 'movie' in v.keys():
+                    v_name = list(v.keys())[0]
+                    if isinstance(v[v_name], list):
+                        for _ in v[v_name]:
+                            file_set.add(_)
+                    else:
+                        file_set.add(v[v_name])
+        for _ in file_set:
+            self.send_file(_)
+            err_num = 0
+            while True:
+                time.sleep(1)
+                send_reslut_content = self.driver.find_element_by_xpath(
+                    '//*[@id="wxadcontainer"]/div[1]/div[2]/div[4]/div/strong').text
+                if '上传成功' in send_reslut_content:
+                    break
+                if '失败' in send_reslut_content:
+                    err_num = err_num + 1
+                    self.send_file(_)
+                    if err_num > 3:
+                        # TODO:退出机制需要考虑一下,tornado返回错误信息
+                        exit()
+
+        self.driver.execute_script('window.close();')
+        self.driver.switch_to.window(self.driver.window_handles[-1])
+
+    def send_moive_spic(self):
+        # 特殊情况下,上传本地视频
+        pass
+
+    def get_layout(self):
+        # 得到编排
+
+        layout = {-1: {'page': '/usr/share/wallpapers/deepin/Beach_by_Samuel_Scrimshaw.jpg'},
+                  0: {'title': '这是标题'},
+                  1: {'content': '这是文本'},
+                  2: 'follow_button-1',
+                  3: {'title': '这是标题'},
+                  4: {'content': '这是文本'},
+                  5: {'page': '/usr/share/wallpapers/deepin/Beach_by_Samuel_Scrimshaw.jpg'},
+                  6: {'page': '/usr/share/wallpapers/deepin/Beach_by_Samuel_Scrimshaw.jpg'},
+                  7: 'follow_button-2',
+                  8: 'follow_button-3',
+                  }
+        # TODO:测试,多图,测试,图文表
+        layout = {-1: {'multi_page': ['/usr/share/wallpapers/deepin/Beach_by_Samuel_Scrimshaw.jpg',
+                                      '/usr/share/wallpapers/deepin/Sunset_of_the_Lake_Nam_by_Wang_Jinyu.jpg',
+                                      '/usr/share/wallpapers/deepin/The_Gongga_Mountain_by_wangjinyu.jpg',
+                                      '/usr/share/wallpapers/deepin/Reflection_of_the_Kanas_Lake_by_Wang_Jinyu.jpg']},
+                  0: {'page': '/usr/share/wallpapers/deepin/Beach_by_Samuel_Scrimshaw.jpg'}
+                  }
+
+        # self.send_file_alone(layout)
+        self.set_head_assemb(layout[-1])
+        for _ in range(max(layout.keys())):
+            pass
+        time.sleep(100)
+
+
+if __name__ == '__main__':
+    create_ad = CreateAd()
+    create_ad.get_layout()

+ 37 - 0
wechat_action/human_ad.py

@@ -0,0 +1,37 @@
+from selenium.webdriver.support.wait import WebDriverWait
+import time
+import re
+
+class HumanAd:
+    def __init__(self, driver):
+        self.driver = driver
+        self.name_set = set()  # 存储固有的name
+
+    def get_human_info(self, name_set_local):
+        names = self.driver.find_elements_by_class_name('adui-table-cellInner')
+
+        for name in names:
+            name_set_local.add(name.text)
+
+    def check_human_info(self):
+        # 处理玩完之后回到概览页面
+        # 检查人群数据包是否相同
+        self.driver.find_element_by_id('dmp').click()
+        WebDriverWait(self.driver, 100).until(lambda driver: driver.find_element_by_class_name(
+            'adui-pagination-text'))
+        page_info = self.driver.find_element_by_class_name('adui-pagination-text').text
+        nums = re.split('/', page_info)
+        name_set_local = set()
+        self.get_human_info(name_set_local)
+        for i in range(int(nums[1].strip())-int(nums[0].strip())):
+            self.driver.find_element_by_css_selector(
+                '#wxadcontainer > section > div.weui-desktop-layout__main__bd > div > div.adui-pagination-base.adui-pagination-small.adui-pagination-right > button:nth-child(4)').click()
+            time.sleep(1)
+            self.get_human_info(name_set_local)
+
+        # 切回正常页面
+        self.driver.find_element_by_id('overview').click()
+
+
+if __name__ == "__main__":
+    pass

+ 76 - 0
wechat_action/login_ad.py

@@ -0,0 +1,76 @@
+from selenium import webdriver
+from selenium.webdriver import ActionChains
+from selenium.webdriver.common.by import By
+from selenium.webdriver.support import expected_conditions as EC
+from selenium.webdriver.support.wait import WebDriverWait
+from wechat_action.send_ad_idea import IdeaAction
+from wechat_action.human_ad import HumanAd
+from selenium.webdriver import ChromeOptions
+import time
+
+class LogIn:
+    def __init__(self):
+        # 获取到单独服务商下的独立公众号页面
+        self.driver = self.get_driver()
+        self.log_in()
+        self.select_ad_master()
+        pass
+
+    def get_driver(self):
+        options = ChromeOptions()
+        # 防止selenium快速崩坏
+        options.add_argument("--disable-dev-shm-usage")
+        # driver = webdriver.Remote(
+        #     command_executor='http://192.168.7.245:4444/wd/hub',
+        #     options=options)
+        driver = webdriver.Chrome()
+        return driver
+
+    def log_in(self):
+        self.driver.get('https://a.weixin.qq.com/index.html')
+        self.driver.save_screenshot('wechat_page_start.png')
+
+        img_selector = 'body > div.old-template > div > div > div.waiting.panelContent > div.wrp_code > img'
+        'body > div.old-template > div > div > div.waiting.panelContent > div.wrp_code > img'
+        frame_login = self.driver.find_element_by_xpath('//*[@id="login_container"]/iframe')
+        self.driver.switch_to.frame(frame_login)
+        # WebDriverWait(driver, 3).until(EC.invisibility_of_element_located((By.CSS_SELECTOR, img_selector)))
+        # time.sleep(3)
+        img_url = self.driver.find_element_by_css_selector(img_selector)
+        print('img', img_url.get_attribute('src'))
+        WebDriverWait(self.driver, 100).until(lambda driver: driver.find_elements_by_link_text('广告投放'))
+        self.driver.save_screenshot('get_in_page.png')
+
+    def select_ad_master(self):
+        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()
+        self.driver.find_element_by_css_selector(
+            '#root > div > div.CoreLayout__headerDropdown-3xWkD > div > div:nth-child(1) > button').click()
+        service_names = self.driver.find_elements_by_class_name('CoreLayout__headerDropdownItem-X4S98')
+        choice_service = None
+        for service_name in service_names:
+            if '上饶' in service_name.text:
+                choice_service = service_name
+        choice_service.click()
+        # 挑选广告投放位置
+        self.driver.execute_script('''
+            window.scroll(100000,1000000);
+            var e_one=document.getElementsByClassName('Table_new__wrapper-1cpZN')[0];
+            e_one.scroll(10000,100000);
+            ''')
+        elements = self.driver.find_elements_by_link_text('广告投放')
+        # ActionChains(driver).move_to_element(elements[0]).perform()
+        elements[0].click()
+        time.sleep(1)
+        # 切换窗口,点击创建广告,切到广告页面
+
+        self.driver.switch_to.window(self.driver.window_handles[-1])
+
+        WebDriverWait(self.driver, 100).until(lambda driver: driver.find_element_by_class_name(
+            'adui-button-hasLeftIcon'))
+
+    def get_driver_loged(self):
+        return self.driver

+ 10 - 50
wechat_action/send_ad.py

@@ -4,6 +4,8 @@ from selenium.webdriver.common.by import By
 from selenium.webdriver.support import expected_conditions as EC
 from selenium.webdriver.support.wait import WebDriverWait
 from wechat_action.send_ad_idea import IdeaAction
+from wechat_action.human_ad import HumanAd
+from wechat_action.login_ad import LogIn
 from selenium.webdriver import ChromeOptions
 
 import time
@@ -16,60 +18,16 @@ class SendAd():
     def __init__(self, task):
         self.task = task
         self.task_check()
-        self.driver = self.get_driver()
+        self.driver = LogIn().get_driver_loged()
         self.ad_idea_action = IdeaAction(self.driver)
+        self.ad_human_action = HumanAd(self.driver)
 
-    def get_driver(self):
-        options = ChromeOptions()
-        # 防止selenium快速崩坏
-        options.add_argument("--disable-dev-shm-usage")
-        # driver = webdriver.Remote(
-        #     command_executor='http://192.168.7.245:4444/wd/hub',
-        #     options=options)
-        driver=webdriver.Chrome()
-        return driver
-
-    def log_in(self):
-        self.driver.get('https://a.weixin.qq.com/index.html')
-        self.driver.save_screenshot('wechat_page_start.png')
-
-        img_selector = 'body > div.old-template > div > div > div.waiting.panelContent > div.wrp_code > img'
-        'body > div.old-template > div > div > div.waiting.panelContent > div.wrp_code > img'
-        frame_login = self.driver.find_element_by_xpath('//*[@id="login_container"]/iframe')
-        self.driver.switch_to.frame(frame_login)
-        # WebDriverWait(driver, 3).until(EC.invisibility_of_element_located((By.CSS_SELECTOR, img_selector)))
-        # time.sleep(3)
-        img_url = self.driver.find_element_by_css_selector(img_selector)
-        print('img', img_url.get_attribute('src'))
-        WebDriverWait(self.driver, 100).until(lambda driver: driver.find_elements_by_link_text('广告投放'))
-        self.driver.save_screenshot('get_in_page.png')
-
-    def select_ad_master(self):
-        # TODO:切换服务商
-
-
-        # 挑选广告投放位置
-        self.driver.execute_script('''
-            window.scroll(100000,1000000);
-            var e_one=document.getElementsByClassName('Table_new__wrapper-1cpZN')[0];
-            e_one.scroll(10000,100000);
-            ''')
-        elements = self.driver.find_elements_by_link_text('广告投放')
-        # ActionChains(driver).move_to_element(elements[0]).perform()
-        elements[1].click()
-        time.sleep(1)
-        # 切换窗口,点击创建广告,切到广告页面
-
-        self.driver.switch_to.window(self.driver.window_handles[-1])
 
-        WebDriverWait(self.driver, 100).until(lambda driver: driver.find_element_by_class_name(
-            'adui-button-hasLeftIcon'))
 
+    def select_ad_locations(self):
         gg_button = self.driver.find_element_by_class_name(
             'adui-button-hasLeftIcon')
         gg_button.click()
-
-    def select_ad_locations(self):
         # 设置广告形式
         self.driver.switch_to.window(self.driver.window_handles[-1])
         self.driver.execute_script('''
@@ -122,8 +80,11 @@ class SendAd():
         self.driver.save_screenshot('set_page_cost.png')
         self.driver.find_element_by_css_selector('#target_next_step').click()
 
+    def set_ad_human(self):
+        #TODO:设置人群
+        pass
+
     def set_ad_idea(self):
-        # TODO:实验一下视频上传
         # TODO:创意创建这部分切割开
         # 创意创建
         if self.task['localtion'] == 'gzh_bottom':
@@ -151,8 +112,7 @@ class SendAd():
 
     def run(self):
         # TODO:出错就截图,然后保存
-        self.log_in()
-        self.select_ad_master()
+        self.ad_human_action.check_human_info()
         self.select_ad_locations()
         self.set_ad_cost()
         self.set_ad_idea()

+ 1 - 1
wechat_action/send_ad_idea.py

@@ -42,7 +42,7 @@ class IdeaAction:
             lambda driver: driver.find_element_by_class_name('webuploader-element-invisible'))
 
         self.driver.find_element_by_class_name('webuploader-element-invisible').send_keys(
-            '/home/cxyu/Downloads/老奶奶.mp4')
+            '/home/cxyu/Downloads/上门龙婿-竖3(1).mp4')
         suc_button = self.driver.find_element_by_id('test_progress_confirm')
         WebDriverWait(self.driver, 1000).until(lambda  x:(suc_button.is_displayed() and suc_button.is_enabled()))