Kaynağa Gözat

ADD:图片上传搞定

cxyu 4 yıl önce
ebeveyn
işleme
7c67cb7825
1 değiştirilmiş dosya ile 204 ekleme ve 30 silme
  1. 204 30
      wechat_action/create_ad.py

+ 204 - 30
wechat_action/create_ad.py

@@ -5,9 +5,12 @@ 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 logging
 import time
 import random
 import re
+import os
+from logging import handlers
 
 
 class CreateAd:
@@ -33,12 +36,76 @@ class CreateAd:
         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
+
+            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(
@@ -68,32 +135,36 @@ class CreateAd:
             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 进行清空有问题
-
+                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('imgWrp-3KLtxlD1Db'))
-                file_element = self.driver.find_element_by_class_name('imgWrp-3KLtxlD1Db')
+                    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(1, 2))
                 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])
+                for i in range(len(file_name) + 10):
+                    input_find_element.send_keys(Keys.BACKSPACE)
+                time.sleep(random.uniform(1, 4))
+
+            self.driver.find_element_by_xpath('/html/body/div[12]/div/div/div[2]/div/div[3]/button[2]').click()
+            time.sleep(random.uniform(2, 4))
+            # 切图操作如果有的话进行对应操作.
+            for i in range(len(info_v) + 1):
+                try:
+                    WebDriverWait(self.driver, 4).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('头版多图选择 结束')
 
         info_key = list(info.keys())[0]
         info_v = info[info_key]
@@ -105,9 +176,81 @@ class CreateAd:
         # 设置头部组件
         pass
 
-    def set_page(self):
+    def set_page(self, page_path):
         # 设置图片模块
-        pass
+        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)
+            pass
+        logging.info('图片模块设置结束')
 
     def set_title(self):
         # 设置标题模块
@@ -118,6 +261,7 @@ class CreateAd:
         pass
 
     def set_follow_button(self):
+        # TODO:先暂定设置三种格式
         # 设置关注按钮
         pass
 
@@ -126,12 +270,12 @@ class CreateAd:
         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])
@@ -146,11 +290,11 @@ class CreateAd:
                     else:
                         file_set.add(v[v_name])
         file_list = list(file_set)
-        print(file_list)
-        print('file list size', len(file_list))
+        # print(file_list)
+        # print('file list size', len(file_list))
         send_file_sign = self.send_file_limit_num
         for _ in file_list:
-            print(_)
+            # print(_)
             self.driver.find_element_by_xpath('//*[@id="wxadcontainer"]/div[1]/div[2]/div[4]/input').send_keys(_)
 
         time.sleep(100)
@@ -200,6 +344,7 @@ class CreateAd:
         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)
 
@@ -252,13 +397,13 @@ class CreateAd:
         layout = {-1: {'page': '/usr/share/wallpapers/deepin/Beach_by_Samuel_Scrimshaw.jpg'},
                   0: {'title': '这是标题'},
                   1: {'content': '这是文本'},
-                  2: 'follow_button-1',
+                  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',
+                  7: {'follow_button': 2},
+                  8: {'follow_button': 3},
                   }
         # TODO:测试,多图,测试,图文表
         layout = {-1: {'multi_page': ['/usr/share/wallpapers/deepin/Beach_by_Samuel_Scrimshaw.jpg',
@@ -267,14 +412,43 @@ class CreateAd:
                                       '/usr/share/wallpapers/deepin/Reflection_of_the_Kanas_Lake_by_Wang_Jinyu.jpg']},
                   0: {'page': '/usr/share/wallpapers/deepin/Beach_by_Samuel_Scrimshaw.jpg'}
                   }
+        layout = {
+            -1: {'page': '/usr/share/wallpapers/deepin/Reflection_of_the_Kanas_Lake_by_Wang_Jinyu.jpg'},
+            0: {'page': '/usr/share/wallpapers/deepin/Reflection_of_the_Kanas_Lake_by_Wang_Jinyu.jpg'},
+            1: {'page': '/usr/share/wallpapers/deepin/Beach_by_Samuel_Scrimshaw.jpg'},
+            2: {'page': '/usr/share/wallpapers/deepin/The_Gongga_Mountain_by_wangjinyu.jpg'},
+            3: {'page': '/usr/share/wallpapers/deepin/Reflection_of_the_Kanas_Lake_by_Wang_Jinyu.jpg'},
+
+        }
 
         # self.send_file_alone(layout)
         self.set_head_assemb(layout[-1])
         for _ in range(max(layout.keys())):
-            pass
-        time.sleep(100)
+            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 == 'title':
+                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)
 
 
 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"
+    )
+
     create_ad = CreateAd()
     create_ad.get_layout()