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.create_ad_plan_idea import IdeaAction from wechat_action.human_ad import HumanAd from selenium.webdriver.common.keys import Keys from wechat_action.login_ad import LogIn from selenium.webdriver import ChromeOptions import re import time import logging import random class CreateAdPlan(): # TODO:因为人群包现在可能存在唯一性,公众号间的复制,需要怎么处理 def __init__(self, task, login_ad): self.task = task # self.task_check() self.login_ad = login_ad self.driver = login_ad.get_driver_loged() self.ad_idea_action = IdeaAction(self.driver, task) self.ad_human_action = HumanAd(self.driver) def set_ad_title(self): # TODO:广告和投放计划,都需要修改名字,修改成一个名字 logging.info('开始设置广告标题') title_ = self.driver.find_element_by_xpath('//*[@class="input-2lFnByGCRh"]') for i in range(40): title_.send_keys(Keys.BACKSPACE) title_.click() time.sleep(0.1) title_.send_keys(self.task['title']) title_.send_keys(Keys.RETURN) time.sleep(random.uniform(0.1, 0.2)) def set_ad_cpm(self): # TODO:设置完之后,test函数中进行对应修改 logging.info('开始设置cpm') if self.task['cpm']['cpm_set'] == 2: self.driver.save_screenshot('cpm{}.png'.format(time.time())) self.driver.find_element_by_xpath( '//*[@id="wxadcontainer"]/div[1]/div/div[2]/main/div/div[2]/div[1]/div/div[2]/div/div[1]/section[2]/form/div/div[1]/div[1]/button[2]/span').click() time.sleep(0.1) select_elements = self.driver.find_elements_by_xpath('//*[@class="adui-radio-base adui-radio-small"]') for _ in select_elements: if '优先跑量' in _.text and self.task['cpm']['module'] == 2: _.click() time.sleep(0.1) if '下单' in _.text: _.click() time.sleep(0.1) def set_ad_locations(self): logging.info('设置对应广告位') gg_button = self.driver.find_element_by_class_name( 'adui-button-hasLeftIcon') gg_button.click() # 设置广告形式 self.driver.switch_to.window(self.driver.window_handles[-1]) self.driver.execute_script(''' window.scroll(100000,0); ''') WebDriverWait(self.driver, 10).until( lambda driver: self.driver.find_element_by_css_selector('#PRODUCTTYPE_WECHAT')) # 推广公众号 wechat_gg = self.driver.find_element_by_css_selector('#PRODUCTTYPE_WECHAT') wechat_gg.click() localtion = self.task['localtion'] if localtion == 'gzh_botoom': # 默认是这个选项,所以不用进行点选 pass if localtion == 'gzh_movie': wechat_localtion = self.driver.find_element_by_id('pos_8') wechat_localtion.click() if localtion == 'pyq': wechat_localtion = self.driver.find_element_by_css_selector( '#wxadcontainer > div:nth-child(1) > div > div.content-2-HFBij0Uh > main > div > div:nth-child(3) > div.adui-grid-row > div:nth-child(1)') wechat_localtion.click() if localtion == 'gzh_big_pic': self.driver.find_element_by_xpath( '//*[@id="wxadcontainer"]/div[1]/div/div[2]/main/div/div[3]/div[3]/div[1]/div/button').click() time.sleep(0.5) self.driver.find_element_by_xpath( '//*[@id="wxadcontainer"]/div[1]/div/div[2]/main/div/div[3]/div[3]/div[3]/ol/li[2]').click() time.sleep(random.uniform(0.1, 0.3)) # 花销设置 # cost_input = self.driver.find_element_by_css_selector( # '#wxadcontainer > div:nth-child(1) > div > div.content-2-HFBij0Uh > main > div > div:nth-child(5) > div:nth-child(2) > div:nth-child(1) > div > input') # cost_input.send_keys('100') # 进入下一页 next_button = self.driver.find_element_by_css_selector('#plan_next_step') next_button.click() def set_ad_time(self): logging.info('设置对应投放时间') WebDriverWait(self.driver, 10).until( lambda driver: self.driver.find_elements_by_xpath('//*[@class="adui-input-base"]')) input_elements = self.driver.find_elements_by_xpath('//*[@class="adui-input-base"]') if self.task['date_set']['date_module'] == 2: select_elements = self.driver.find_elements_by_xpath('//*[@class="adui-radio-base adui-radio-small"]') for _ in select_elements: if '长期投放' in _.text: _.click() input_elements[0].click() input_elements[0].send_keys(Keys.RIGHT) for i in range(7): time.sleep(random.uniform(0.1, 0.2)) input_elements[0].send_keys(Keys.BACKSPACE) for _ in self.task['date_set']['date_list'][0][1:]: time.sleep(random.uniform(0.1, 0.2)) input_elements[0].send_keys(_) time.sleep(random.uniform(0.1, 0.2)) else: input_elements[1].click() time.sleep(0.1) input_elements[1].send_keys(Keys.RIGHT) for i in range(7): time.sleep(random.uniform(0.1, 0.2)) input_elements[1].send_keys(Keys.BACKSPACE) time.sleep(random.uniform(0.1, 0.2)) for _ in self.task['date_set']['date_list'][1][1:]: time.sleep(random.uniform(0.1, 0.2)) input_elements[1].send_keys(_) self.driver.save_screenshot('time-{}.png'.format(time.time())) # self.driver.find_element_by_xpath( # '//*[@id="wxadcontainer"]/div[1]/div/div[2]/main/div/div[2]/div[1]/div/div[2]/div/div[1]/section[1]/div[2]/form/div[2]/div/div/div/svg').click() time.sleep(0.1) def set_ad_human_location(self): logging.info('设置对应人群信息-非人群包') WebDriverWait(self.driver, 10).until( lambda driver: self.driver.find_element_by_css_selector('#area_input > div > i')) self.driver.find_element_by_css_selector('#area_input > div > i').click() if self.task['localtion'] == 'gzh_botoom': self.driver.find_element_by_class_name('icon-3cAquX1RLZ').click() if self.task['localtion'] == 'gzh_movie': citys = self.driver.find_elements_by_class_name('checkbox-1pfRMRqv-R') for _ in citys: _.click() if self.task['localtion'] == 'gzh_big_pic': self.driver.find_element_by_class_name('icon-3cAquX1RLZ').click() self.driver.find_element_by_xpath('//*[@id="bid_objective_6"]/span[1]').click() if self.task['localtion'] == 'pyq': self.driver.find_element_by_class_name('icon-3cAquX1RLZ').click() def set_ad_cost(self): # 投放计划创建 # 广告创建 logging.info('设置对应广告花销') day_cost = self.driver.find_element_by_css_selector('#budget_input') WebDriverWait(self.driver, 10).until(lambda x: (day_cost.is_displayed() and day_cost.is_enabled())) day_cost.send_keys('101') time.sleep(5) self.driver.find_element_by_css_selector('#target_next_step').click() self.driver.save_screenshot('click{}.png'.format(time.time())) time_element = self.driver.find_element_by_xpath('//*[@class="title-1CSarR7XgH"]') ActionChains(self.driver).move_to_element(time_element).perform() time.sleep(10) self.driver.save_screenshot('click-2-{}.png'.format(time.time())) for i in range(4): if len(self.driver.find_elements_by_css_selector('#target_next_step')) == 0: break self.driver.find_element_by_css_selector('#target_next_step').click() time.sleep(5) ActionChains(self.driver).move_to_element(time_element).perform() self.driver.save_screenshot('click-{}-{}.png'.format((2 + i), time.time())) def set_ad_human(self): # TODO:检查人群是否正常 logging.info('设置人群包') self.driver.find_element_by_xpath('//*[@id="test-dmp-container"]/div[2]/span/span[1]').click() time.sleep(0.1) select_human_element = self.driver.find_element_by_xpath( '//*[@id="test-dmp-container"]/div[2]/div[2]/div[1]/div/div[1]/button/span') ActionChains(self.driver).move_to_element(select_human_element).click().perform() time.sleep(0.4) WebDriverWait(self.driver, 100).until( lambda x: [_ for _ in self.driver.find_elements_by_xpath('//*[@class="adui-input-base"]') if _.get_attribute("placeholder") == '输入名称搜索人群包']) human_input = [_ for _ in self.driver.find_elements_by_xpath('//*[@class="adui-input-base"]') if _.get_attribute("placeholder") == '输入名称搜索人群包'][0] for _ in self.task['human_info_package']: human_input.click() human_input.send_keys(_) human_input.send_keys(Keys.RETURN) time.sleep(random.uniform(1, 1.2)) human_names = self.driver.find_elements_by_xpath('//*[@class="adui-table-cellInner"]') for human_name in human_names: if human_name.text == _: human_name.click() for _ in range(len(_) + 1): time.sleep(0.1) human_input.send_keys(Keys.BACKSPACE) self.driver.find_element_by_xpath( '//*[@class="adui-button-base adui-button-primary adui-button-small"]').click() def set_ad_age(self): age_elements = self.driver.find_elements_by_xpath('//*[@class="adui-select-selector"]') age_elements[0].click() time.sleep(0.1) # 256,一截,[14(17),24][25,32][33,40][41,48][49,56][57,64] if self.task['age'][0] == 14: age_elements[1].click() else: self.driver.execute_script(''' document.getElementsByClassName('rc-virtual-list-holder')[0].scrollTop={}; '''.format(self.task['age'][0] - 17 / 7) * 256) time.sleep(random.uniform(0.1, 0.2)) self.driver.find_element_by_xpath('//*[@id="begin_age_{}"]'.format(int(self.task['age'][0]))).click() # 年龄---设置 age_elements[1].click() self.driver.execute_script(''' document.getElementsByClassName('rc-virtual-list-holder')[0].scrollTop={}; '''.format(self.task['age'][0] - 17 / 7) * 256) def set_ad_idea(self): # 创意创建 logging.info('设置创意') if self.task['localtion'] == 'gzh_botoom': self.ad_idea_action.idea_gzh_bottom() if self.task['localtion'] == 'gzh_movie': self.ad_idea_action.idea_movie_gzh_movie() if self.task['localtion'] == 'gzh_big_pic': self.ad_idea_action.idea_big_pic() if self.task['localtion'] == 'pyq': self.ad_idea_action.idea_pyq() next_button = self.driver.find_element_by_class_name('adui-button-primary') WebDriverWait(self.driver, 1000).until(lambda x: (next_button.is_displayed() and next_button.is_enabled())) next_button.click() def push_ad(self): # 提交 logging.info('提交广告') time.sleep(random.uniform(3, 4)) agreement_element = self.driver.find_element_by_class_name('label-3_CrbQVNtc') if agreement_element.get_attribute('aria-checked') != 'true': self.driver.find_element_by_class_name('icon-3cAquX1RLZ').click() time.sleep(random.uniform(0.5, 1)) self.driver.find_element_by_class_name('adui-button-primary').click() WebDriverWait(self.driver, 10).until( lambda driver: True if len( re.findall('广告已提交审核', self.driver.page_source)) else False) def task_check(self): # TODO: # 1.检查任务有无输入问题, # 2.需要重点确认输入金额,时间是否正确.从最后页面内容进行再次确认 # if 'master' not in self.task.keys() or 'localtion' not in self.task.keys(): # exit() pass def check_is_sucess(self, plan_name): logging.info('检查广告计划创建是否成功') # TODO:进一步修改 # 进入搜索页面, click_elements = self.driver.find_elements_by_xpath('//*[contains(@class, "navItem-3MjWMCbkWT")]/span') for _ in click_elements: if '广告' in _.text: _.click() time.sleep(random.uniform(0.1, 0.2)) # 设置状态为--审核中 choice_elements = self.driver.find_elements_by_xpath('//*[contains(@class, "tag-3loTlkncVq")]/span') for _ in choice_elements: if '状态' in _.text: _.click() time.sleep(random.uniform(0.1, 0.2)) lable_elements = self.driver.find_elements_by_xpath('//*[contains(@class, "label-2ZOAbuO31o")]/span') for _ in lable_elements: if '审核中' in _.text: _.click() # 输入搜索字段 input_element = self.driver.find_element_by_xpath('//*[contains(@class, "search-2yiDvyFHoH")]/span') input_element.click() time.sleep(random.uniform(0.1, 0.2)) input_element.send_keys() # 查看有无对应数据 def run(self, err_num=0): try: # self.ad_human_action.check_human_info() self.set_ad_locations() self.set_ad_time() self.set_ad_title() self.set_ad_cpm() self.set_ad_human_location() self.set_ad_human() self.set_ad_cost() self.set_ad_idea() self.push_ad() # 切回到前一页 self.driver.switch_to.window(self.driver.window_handles[-1]) logging.info('创建广告计划成功') return {'sucess': True, 'result_info': ''} except Exception as e: time.sleep(5) self.driver.save_screenshot('liuyi{}.png'.format(time.time())) time.sleep(5) raise # TODO:有空时讲 e 内容设置为原始内容 if err_num > 3: return {'sucess': False, 'result_info': str(e)} else: return self.run(err_num=err_num + 1) pass