| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775 | from wechat_action.sql_tools import save_ad_layout_resultfrom selenium.webdriver.support.wait import WebDriverWaitfrom selenium.webdriver.common.keys import Keysfrom selenium.webdriver import ActionChainsfrom sqlalchemy import Tablefrom logging import handlersimport loggingimport randomimport timeimport jsonimport reimport osclass CreateAd:    def __init__(self, login_ad, layout_db, user_id):        self.user_id = user_id        self.service_name = login_ad.service_name        self.wechat_name = login_ad.wechat_name        # self.driver = LogIn(service_name, wechat_name).get_driver_loged()        self.driver = login_ad.get_driver_loged()        self.get_into_create_page()        self.db = layout_db        self.metadata = self.db.metadata        self.sql_session = self.db.DBSession()        self.layout_table = Table('layout_record', self.metadata,                                  autoload=True, autoload_with=self.db.engine)        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 get_layout(self):        # 数据库获取数据,然后进行编排        # 创建编排        pass    def set_advertisement_sign(self):        # 设置广告标记        now_time = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())        self.driver.find_element_by_xpath('//*[@class="icon-edQB0KK2VG"]').click()        input_element = self.driver.find_element_by_xpath('//input[@class="input-2lFnByGCRh"]')        input_element.send_keys(Keys.BACKSPACE)        input_element.send_keys(now_time)        return now_time    def set_background_color(self):        color_buttons = self.driver.find_elements_by_class_name('adui-cp-picker')        c_buttons_can_use = []        for _ in color_buttons:            if _.is_displayed() and _.is_enabled():                c_buttons_can_use.append(_)        c_buttons_can_use[0].click()        time.sleep(random.uniform(0.2, 0.3))        input_elements = self.driver.find_elements_by_xpath('//input[@class="adui-input-base"]')        for _ in input_elements:            if _.is_enabled() and _.is_displayed() and _.get_attribute("value") == 'FFFFFF':                _.click()                _.send_keys('F7F7F7')    def set_head_assemb(self, info):        def single_page_set():            self.driver.find_element_by_xpath('//*[@id="stage-sidebar"]/div[1]/div/div[1]/div/div').click()            time.sleep(random.uniform(0.1, 0.2))            file_name = os.path.basename(info_v)            self.driver.find_element_by_class_name('upload-img-item-inner-2gsg7NjaZ8').click()            WebDriverWait(self.driver, 10).until(                lambda x: len([_ for _ in self.driver.find_elements_by_class_name('title-29sncpKgTl') if                               _.is_displayed() and _.is_enabled()]) > 0)            turn_page_buttons = self.driver.find_elements_by_class_name('paginationIcon-1EfoH0sNRF')            can_use_button = []            for _ in turn_page_buttons:                if _.is_enabled() and _.is_displayed():                    can_use_button.append(_)            # 不断翻页获取到元素为止            chose_over = False            while True:                page_elements = self.driver.find_elements_by_class_name('title-29sncpKgTl')                for _ in page_elements:                    if _.is_displayed() and _.is_enabled():                        if file_name in _.text:                            _.click()                            chose_over = True                            break                if chose_over or len(can_use_button) == 0:                    break                # 翻到最后一页时停止                page_text = self.driver.find_element_by_class_name('count_small-37CcvfzoTl').text                page_nums = re.findall('\d+', page_text)                if int(page_nums[0].strip()) == int(page_nums[1].strip()):                    break                # 翻页                can_use_button[2].click()                # 确保翻页成功                WebDriverWait(self.driver, 10).until(                    lambda x: page_text != self.driver.find_element_by_class_name('count_small-37CcvfzoTl').text)            self.driver.find_element_by_xpath('//*[@id="test_material_container_confirm"]').click()            try:                WebDriverWait(self.driver, 4).until(                    lambda driver: driver.find_element_by_class_name(                        'btnFist-uueBS6DQFa'))                _ = self.driver.find_element_by_class_name(                    'btnFist-uueBS6DQFa')                WebDriverWait(self.driver, 4).until(                    lambda x: (_.is_displayed() and _.is_enabled()))                time.sleep(1)                _.click()                WebDriverWait(self.driver, 100).until(                    lambda driver: driver.find_element_by_class_name(                        'btn-3E823IXt3m'))                _ = self.driver.find_element_by_class_name(                    'btn-3E823IXt3m')                WebDriverWait(self.driver, 100).until(                    lambda x: (_.is_displayed() and _.is_enabled()))                time.sleep(1)                _.click()            except Exception as e:                pass            logging.info('头版首页单图上传结束')        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 = _            for _ in info_v:                file_name = os.path.basename(_)                logging.info(file_name)                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('img-2HvhMmpnzP'))                file_element = self.driver.find_element_by_class_name('img-2HvhMmpnzP')                WebDriverWait(self.driver, 1000).until(                    lambda x: (file_element.is_displayed() and file_element.is_enabled()))                ActionChains(self.driver).move_to_element(file_element).perform()                time.sleep(random.uniform(0.5, 1))                file_element.click()                for i in range(len(file_name) + 10):                    input_find_element.send_keys(Keys.BACKSPACE)                time.sleep(random.uniform(0.5, 1))            self.driver.find_element_by_xpath('/html/body/div[12]/div/div/div[2]/div/div[3]/button[2]').click()            # 切图操作如果有的话进行对应操作.            for i in range(len(info_v) + 1):                try:                    WebDriverWait(self.driver, 6).until(                        lambda driver: driver.find_element_by_xpath(                            '/html/body/div[13]/div/div/div[2]/div/div[3]/button[2]'))                    self.driver.find_element_by_xpath('/html/body/div[13]/div/div/div[2]/div/div[3]/button[2]').click()                except:                    pass            logging.info('头版多图选择 结束')        def movie_set():            file_name = os.path.basename(info_v)            self.driver.find_element_by_xpath('//*[@id="stage-sidebar"]/div[1]/div/div[3]/div/div').click()            self.driver.find_element_by_xpath('//*[@class="comptEditButton-2JsnAFdOGZ"]').click()            WebDriverWait(self.driver, 100).until(                lambda x: len([_ for _ in self.driver.find_elements_by_class_name('title-29sncpKgTl') if                               _.is_displayed() and _.is_enabled()]) > 0)            #            turn_page_buttons = self.driver.find_elements_by_class_name('paginationIcon-1EfoH0sNRF')            can_use_button = []            for _ in turn_page_buttons:                if _.is_enabled() and _.is_displayed():                    can_use_button.append(_)            # 不断翻页获取到元素为止            chose_over = False            while True:                page_elements = self.driver.find_elements_by_class_name('title-29sncpKgTl')                for _ in page_elements:                    if _.is_displayed() and _.is_enabled():                        if file_name in _.text:                            _.click()                            chose_over = True                            break                if chose_over or len(can_use_button) == 0:                    # can_use_button 数量说明是否可以翻页,如果不可以翻页,则直接停止                    break                # 翻到最后一页时停止                page_text_elements = self.driver.find_elements_by_class_name('count_small-37CcvfzoTl')                for _ in page_text_elements:                    if _.is_enabled() and _.is_displayed():                        page_text = _.text                        page_text_element = _                page_nums = re.findall('\d+', page_text)                if int(page_nums[0].strip()) == int(page_nums[1].strip()):                    break                # 翻页                can_use_button[2].click()                # 确保翻页成功                WebDriverWait(self.driver, 10).until(                    lambda x: page_text != page_text_element.text)            sc_buttons = self.driver.find_elements_by_id('test_material_container_confirm')            for _ in sc_buttons:                if _.is_enabled() and _.is_displayed():                    _.click()        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()        if info_key == 'movie':            movie_set()        # 设置头部组件        pass    def set_page(self, page_path):        # 设置图片模块        self.driver.find_element_by_xpath('//*[@id="stage-sidebar"]/section/div[2]/div[1]/div/div').click()        time.sleep(random.uniform(0.1, 0.2))        file_name = os.path.basename(page_path)        upload_elements = self.driver.find_elements_by_class_name('upload-img-item-inner-2gsg7NjaZ8')        for _ in upload_elements:            if _.is_displayed() and _.is_enabled():                _.click()        WebDriverWait(self.driver, 10).until(            lambda x: len([_ for _ in self.driver.find_elements_by_class_name('title-29sncpKgTl') if                           _.is_displayed() and _.is_enabled()]) > 0)        turn_page_buttons = self.driver.find_elements_by_class_name('paginationIcon-1EfoH0sNRF')        can_use_button = []        for _ in turn_page_buttons:            if _.is_enabled() and _.is_displayed():                can_use_button.append(_)        # 不断翻页获取到元素为止        chose_over = False        while True:            page_elements = self.driver.find_elements_by_class_name('title-29sncpKgTl')            for _ in page_elements:                if _.is_displayed() and _.is_enabled():                    if file_name in _.text:                        _.click()                        chose_over = True                        break            if chose_over or len(can_use_button) == 0:                # can_use_button 数量说明是否可以翻页,如果不可以翻页,则直接停止                break            # 翻到最后一页时停止            page_text_elements = self.driver.find_elements_by_class_name('count_small-37CcvfzoTl')            for _ in page_text_elements:                if _.is_enabled() and _.is_displayed():                    page_text = _.text                    page_text_element = _            page_nums = re.findall('\d+', page_text)            if int(page_nums[0].strip()) == int(page_nums[1].strip()):                break            # 翻页            can_use_button[2].click()            # 确保翻页成功            WebDriverWait(self.driver, 10).until(                lambda x: page_text != page_text_element.text)        sc_buttons = self.driver.find_elements_by_id('test_material_container_confirm')        for _ in sc_buttons:            if _.is_enabled() and _.is_displayed():                _.click()        try:            WebDriverWait(self.driver, 4).until(                lambda driver: driver.find_element_by_class_name(                    'btnFist-uueBS6DQFa'))            _ = self.driver.find_element_by_class_name(                'btnFist-uueBS6DQFa')            WebDriverWait(self.driver, 4).until(                lambda x: (_.is_displayed() and _.is_enabled()))            # 已经出现但任需要等待            time.sleep(1)            _.click()            WebDriverWait(self.driver, 100).until(                lambda x: len([_ for _ in self.driver.find_elements_by_class_name('btn-3E823IXt3m') if                               _.is_displayed() and _.is_enabled()]) > 0)            for _ in self.driver.find_elements_by_class_name('btn-3E823IXt3m'):                if _.is_displayed() and _.is_enabled():                    _.click()        except Exception as e:            logging.info(e)        logging.info('图片模块设置结束')    def set_content(self, config_info):        # 设置文本模块        # 1.文本内容2.文本颜色3.是否加粗4.文本位置设置5.文本大小        # 设置文本内容        self.driver.find_element_by_xpath('//*[@id="stage-sidebar"]/section/div[2]/div[5]/div/div').click()        time.sleep(random.uniform(0.2, 0.3))        input_elements = self.driver.find_elements_by_xpath('//textarea[@class="adui-input-base"]')        for _ in input_elements:            if _.is_enabled() and _.is_displayed():                _.send_keys(config_info['content'])        # 设置颜色        if config_info['color'] != '595959':            color_buttons = self.driver.find_elements_by_class_name('adui-cp-picker')            c_buttons_can_use = []            for _ in color_buttons:                if _.is_displayed() and _.is_enabled():                    c_buttons_can_use.append(_)            c_buttons_can_use[1].click()            time.sleep(random.uniform(0.2, 0.3))            input_elements = self.driver.find_elements_by_tag_name('input')            for _ in input_elements:                if _.is_enabled() and _.is_displayed() and _.get_attribute("value") == '595959':                    _.click()                    _.send_keys(config_info['color'])        # 设置是否加粗        if config_info['is_bold']:            big_elements = self.driver.find_elements_by_class_name('adui-button-content')            for _ in big_elements:                if _.text == '加粗' and _.is_displayed() and _.is_enabled():                    _.click()        # 设置文本位置        if config_info['loc'] != 'left':            loc_buttons = self.driver.find_elements_by_xpath(                "//div[contains(@class, 'adui-button-group_banner')]//button")            loc_buttons_can_use = []            for _ in loc_buttons:                if _.is_enabled() and _.is_displayed():                    loc_buttons_can_use.append(_)            if config_info['loc'] == 'middle':                loc_buttons_can_use[1].click()            if config_info['loc'] == 'right':                loc_buttons_can_use[2].click()        # 设置文本大小        if config_info['str_num'] != 15:            str_buttons = self.driver.find_elements_by_xpath("//*[@class='adui-select-selection__rendered']")            str_buttons_can_use = []            for _ in str_buttons:                if _.is_displayed() and _.is_enabled():                    str_buttons_can_use.append(_)            str_buttons_can_use[1].click()            time.sleep(random.uniform(0.5, 1))            str_num_buttons = self.driver.find_elements_by_xpath("//*[@class='adui-select-dropdown-menu-item']")            str_num_can_use = []            for _ in str_num_buttons:                if _.is_displayed() and _.is_enabled():                    str_num_can_use.append(_)            str_num_map = {14: 0, 16: 1, 18: 2, 20: 3, 24: 4, 36: 5}            str_num_can_use[str_num_map[config_info['str_num']]].click()        # 设置文本边距        if config_info['str_distance'][0] != 22 or config_info['str_distance'][1] != 22:            distance_buttons = self.driver.find_elements_by_xpath('//input[@class="adui-input-base"]')            distance_buttons_can_use = []            for _ in distance_buttons:                if _.is_enabled() and _.is_displayed() and _.get_attribute("value") == '22':                    distance_buttons_can_use.append(_)            distance_buttons_can_use[0].click()            for i in range(4):                distance_buttons_can_use[0].send_keys(Keys.BACKSPACE)            distance_buttons_can_use[0].send_keys(config_info['str_distance'][0])            distance_buttons_can_use[1].click()            for i in range(4):                distance_buttons_can_use[1].send_keys(Keys.BACKSPACE)            distance_buttons_can_use[1].send_keys(config_info['str_distance'][1])    def set_follow_button(self, button_type):        # 设置关注按钮        # 1.设置button文本内容2.是否加粗3.设置字体颜色,边框颜色,填充色4.设置边距        self.driver.find_element_by_xpath('//*[@id="stage-sidebar"]/section/div[4]/div[2]/div/div').click()        if button_type == 1:            input_elements = self.driver.find_elements_by_xpath('//input[@class="adui-input-base"]')            for _ in input_elements:                if _.is_enabled() and _.is_displayed() and _.get_attribute("value") == '关注公众号':                    _.click()                    _.clear()                    for i in range(10):                        _.send_keys(Keys.BACKSPACE)                    _.send_keys('保存阅读记录')            big_elements = self.driver.find_elements_by_xpath('//span[@class="adui-button-content"]')            for _ in big_elements:                if _.text == '加粗' and _.is_displayed() and _.is_enabled():                    _.click()            input_elements = self.driver.find_elements_by_xpath('//input[@class="adui-input-base"]')            for _ in input_elements:                if _.is_enabled() and _.is_displayed() and _.get_attribute("value") == '07C160':                    _.click()                    _.send_keys('DE2821')        if button_type == 2:            input_elements = self.driver.find_elements_by_xpath('//input[@class="adui-input-base"]')            for _ in input_elements:                if _.is_enabled() and _.is_displayed() and _.get_attribute("value") == '关注公众号':                    _.click()                    _.clear()                    for i in range(10):                        _.send_keys(Keys.BACKSPACE)                    _.send_keys('点击此处,继续阅读')            big_elements = self.driver.find_elements_by_xpath('//span[@class="adui-button-content"]')            for _ in big_elements:                if _.text == '加粗' and _.is_displayed() and _.is_enabled():                    _.click()            input_elements = self.driver.find_elements_by_xpath('//input[@class="adui-input-base"]')            for _ in input_elements:                if _.is_enabled() and _.is_displayed() and _.get_attribute("value") == '07C160':                    _.click()                    _.send_keys('DE2821')            size_buttons = self.driver.find_elements_by_xpath('//input[@class="adui-input-base"]')            size_buttons_can_use = []            for _ in size_buttons:                if _.is_enabled() and _.is_displayed() and _.get_attribute("value") == '28':                    size_buttons_can_use.append(_)            size_buttons_can_use[0].click()            for i in range(4):                size_buttons_can_use[0].send_keys(Keys.BACKSPACE)            size_buttons_can_use[0].send_keys('0')            size_buttons_can_use[1].click()            for i in range(4):                size_buttons_can_use[1].send_keys(Keys.BACKSPACE)            size_buttons_can_use[1].send_keys('0')        if button_type == 3:            input_elements = self.driver.find_elements_by_xpath('//input[@class="adui-input-base"]')            for _ in input_elements:                if _.is_enabled() and _.is_displayed() and _.get_attribute("value") == '关注公众号':                    _.click()                    _.clear()                    for i in range(10):                        _.send_keys(Keys.BACKSPACE)                    _.send_keys('点我,继续阅读')            big_elements = self.driver.find_elements_by_xpath('//span[@class="adui-button-content"]')            for _ in big_elements:                if _.text == '加粗' and _.is_displayed() and _.is_enabled():                    _.click()            input_elements = self.driver.find_elements_by_xpath('//input[@class="adui-input-base"]')            for _ in input_elements:                if _.is_enabled() and _.is_displayed() and _.get_attribute("value") == '07C160':                    _.click()                    _.send_keys('FFFFFF')            input_elements = self.driver.find_elements_by_xpath('//input[@class="adui-input-base"]')            for _ in input_elements:                if _.is_enabled() and _.is_displayed() and _.get_attribute("value") == 'FFFFFF':                    _.click()                    _.send_keys('DE2821')                    break            size_buttons = self.driver.find_elements_by_xpath('//input[@class="adui-input-base"]')            size_buttons_can_use = []            for _ in size_buttons:                if _.is_enabled() and _.is_displayed() and _.get_attribute("value") == '28':                    size_buttons_can_use.append(_)            size_buttons_can_use[0].click()            for i in range(4):                size_buttons_can_use[0].send_keys(Keys.BACKSPACE)            size_buttons_can_use[0].send_keys('0')            size_buttons_can_use[1].click()            for i in range(4):                size_buttons_can_use[1].send_keys(Keys.BACKSPACE)            size_buttons_can_use[1].send_keys('100')    def set_follow_button_(self, config_info):        # 设置关注按钮        # 1.设置button文本内容 2.是否加粗 3.设置字体颜色,边框颜色,填充色 4.设置边距        self.driver.find_element_by_xpath('//*[@id="stage-sidebar"]/section/div[4]/div[2]/div/div').click()        # 文本设置        input_elements = self.driver.find_elements_by_xpath('//input[@class="adui-input-base"]')        for _ in input_elements:            if _.is_enabled() and _.is_displayed() and _.get_attribute("value") == '关注公众号':                _.click()                _.clear()                for i in range(10):                    _.send_keys(Keys.BACKSPACE)                _.send_keys(config_info['content'])        # 文本是否加粗        if config_info['is_bold']:            big_elements = self.driver.find_elements_by_xpath('//span[@class="adui-button-content"]')            for _ in big_elements:                if _.text == '加粗' and _.is_displayed() and _.is_enabled():                    _.click()        # 颜色设置        input_elements = self.driver.find_elements_by_xpath('//input[@class="adui-input-base"]')        input_elements_can_use = []        for _ in input_elements:            if _.is_enabled() and _.is_displayed() and (                    _.get_attribute("value") == '07C160' or _.get_attribute("value") == 'FFFFFF'):                input_elements_can_use.append(_)        input_elements_can_use[0].click()        input_elements_can_use[0].send_keys(config_info['color1'])        time.sleep(random.uniform(0.1, 0.5))        input_elements_can_use[1].click()        input_elements_can_use[1].send_keys(config_info['color2'])        time.sleep(random.uniform(0.1, 0.5))        input_elements_can_use[2].click()        input_elements_can_use[2].send_keys(config_info['color3'])        time.sleep(random.uniform(0.1, 0.5))        # 间隙设置        size_buttons = self.driver.find_elements_by_xpath('//input[@class="adui-input-base"]')        size_buttons_can_use = []        for _ in size_buttons:            if _.is_enabled() and _.is_displayed() and _.get_attribute("value") == '28':                size_buttons_can_use.append(_)        size_buttons_can_use[0].click()        for i in range(4):            size_buttons_can_use[0].send_keys(Keys.BACKSPACE)        size_buttons_can_use[0].send_keys(config_info['str_distance'][0])        size_buttons_can_use[1].click()        for i in range(4):            size_buttons_can_use[1].send_keys(Keys.BACKSPACE)        size_buttons_can_use[1].send_keys(config_info['str_distance'][1])    def 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_)        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:                        raise ValueError("图片上传失败")        self.driver.execute_script('window.close();')        self.driver.switch_to.window(self.driver.window_handles[-1])    def set_share_content(self, share_info):        title_content = share_info['share_info']['title']        des_content = share_info['share_info']['des']        self.driver.find_element_by_xpath('//*[@id="wxadcontainer"]/div[1]/div/section/header/div[2]/button[2]').click()        WebDriverWait(self.driver, 50).until(lambda driver: driver.find_element_by_xpath(            '//*[@id="wxadcontainer"]/div[1]/div/div/div/div[1]/section/section/div[2]/div[1]/div/div/input'))        title_input = self.driver.find_element_by_xpath(            '//*[@id="wxadcontainer"]/div[1]/div/div/div/div[1]/section/section/div[2]/div[1]/div/div/input')        title_input.click()        title_input.send_keys(title_content)        des_input = self.driver.find_element_by_xpath(            '//*[@id="wxadcontainer"]/div[1]/div/div/div/div[1]/section/section/div[2]/div[2]/div/div/input')        des_input.click()        des_input.send_keys(des_content)        self.driver.find_element_by_xpath('//*[@id="wxadcontainer"]/div[1]/div/header/div[2]/button').click()        WebDriverWait(self.driver, 10).until(            lambda driver: driver.find_element_by_xpath('/html/body/div[6]/div/div/div[2]/div/div[3]/button[2]'))        self.driver.find_element_by_xpath('/html/body/div[6]/div/div/div[2]/div/div[3]/button[2]').click()        time.sleep(1)    def create_layout(self, layout, err_num=0):        #        try:            self.send_file_alone(layout)            advertisement_sign = self.set_advertisement_sign()            self.set_head_assemb(layout[-1])            if -2 in layout.keys():                self.set_background_color()            for _ in range(max(layout.keys()) + 1):                info = layout[_]                info_key = list(info.keys())[0]                info_v = info[info_key]                if info_key == 'page':                    self.set_page(info_v)                if info_key == 'content':                    self.set_content(info_v)                if info_key == 'follow_button':                    self.set_follow_button_(info_v)            self.set_share_content(layout[-3])            self.driver.execute_script('window.close();')            # 切回到前一页            self.driver.switch_to.window(self.driver.window_handles[-1])            layout_info = {}            layout_info['id'] = int(time.time() * 1000)            layout_info['userid'] = self.user_id            layout_info['result'] = 'sucess'            layout_info['layout'] = json.dumps(layout, ensure_ascii=False)            layout_insert = save_ad_layout_result(layout_info=layout_info, table_layout=self.layout_table)            self.sql_session.execute(layout_insert)            self.sql_session.commit()            return {'sucess': True, 'result_info': advertisement_sign}        except Exception as e:            #TODO:有空时讲 e 内容设置为原始内容            if err_num > 3:                layout_num = int(time.time() * 1000)                now_time = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())                try:                    self.driver.save_screenshot('{layout_num}-{now_time}-{service_name}-{wechat_name}.png'.format(                        layout_num=layout_num,                        now_time=now_time,                        service_name=self.service_name,                        wechat_name=self.wechat_name))                except:                    pass                layout_info = {}                layout_info['id'] = layout_num                layout_info['userid'] = self.user_id                layout_info['result'] = str(e)                layout_info['layout'] = json.dumps(layout)                layout_insert = save_ad_layout_result(layout_info=layout_info, table_layout=self.layout_table)                self.sql_session.execute(layout_insert)                self.sql_session.commit()                # 截图,传回错误信息                return {'sucess': False, 'result_info': e}            else:                self.create_layout(layout, err_num=err_num + 1)if __name__ == '__main__':    logging.basicConfig(        handlers=[            logging.handlers.RotatingFileHandler('./create_ad.log',                                                 maxBytes=10 * 1024 * 1024,                                                 backupCount=5,                                                 encoding='utf-8')            , logging.StreamHandler()  # 供输出使用        ],        level=logging.INFO,        format="%(asctime)s - %(levelname)s %(filename)s %(funcName)s %(lineno)s - %(message)s"    )
 |