send_ad.py 6.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164
  1. from selenium import webdriver
  2. from selenium.webdriver import ActionChains
  3. from selenium.webdriver.common.by import By
  4. from selenium.webdriver.support import expected_conditions as EC
  5. from selenium.webdriver.support.wait import WebDriverWait
  6. from wechat_action.send_ad_idea import IdeaAction
  7. from selenium.webdriver import ChromeOptions
  8. import time
  9. import random
  10. class SendAd():
  11. # TODO:一旦登录之后,driver就不要关闭,然后错误就部分不断重试
  12. def __init__(self, task):
  13. self.task = task
  14. self.task_check()
  15. self.driver = self.get_driver()
  16. self.ad_idea_action = IdeaAction(self.driver)
  17. def get_driver(self):
  18. options = ChromeOptions()
  19. # 防止selenium快速崩坏
  20. options.add_argument("--disable-dev-shm-usage")
  21. # driver = webdriver.Remote(
  22. # command_executor='http://192.168.7.245:4444/wd/hub',
  23. # options=options)
  24. driver=webdriver.Chrome()
  25. return driver
  26. def log_in(self):
  27. self.driver.get('https://a.weixin.qq.com/index.html')
  28. self.driver.save_screenshot('wechat_page_start.png')
  29. img_selector = 'body > div.old-template > div > div > div.waiting.panelContent > div.wrp_code > img'
  30. 'body > div.old-template > div > div > div.waiting.panelContent > div.wrp_code > img'
  31. frame_login = self.driver.find_element_by_xpath('//*[@id="login_container"]/iframe')
  32. self.driver.switch_to.frame(frame_login)
  33. # WebDriverWait(driver, 3).until(EC.invisibility_of_element_located((By.CSS_SELECTOR, img_selector)))
  34. # time.sleep(3)
  35. img_url = self.driver.find_element_by_css_selector(img_selector)
  36. print('img', img_url.get_attribute('src'))
  37. WebDriverWait(self.driver, 100).until(lambda driver: driver.find_elements_by_link_text('广告投放'))
  38. self.driver.save_screenshot('get_in_page.png')
  39. def select_ad_master(self):
  40. # TODO:切换服务商
  41. # 挑选广告投放位置
  42. self.driver.execute_script('''
  43. window.scroll(100000,1000000);
  44. var e_one=document.getElementsByClassName('Table_new__wrapper-1cpZN')[0];
  45. e_one.scroll(10000,100000);
  46. ''')
  47. elements = self.driver.find_elements_by_link_text('广告投放')
  48. # ActionChains(driver).move_to_element(elements[0]).perform()
  49. elements[1].click()
  50. time.sleep(1)
  51. # 切换窗口,点击创建广告,切到广告页面
  52. self.driver.switch_to.window(self.driver.window_handles[-1])
  53. WebDriverWait(self.driver, 100).until(lambda driver: driver.find_element_by_class_name(
  54. 'adui-button-hasLeftIcon'))
  55. gg_button = self.driver.find_element_by_class_name(
  56. 'adui-button-hasLeftIcon')
  57. gg_button.click()
  58. def select_ad_locations(self):
  59. # 设置广告形式
  60. self.driver.switch_to.window(self.driver.window_handles[-1])
  61. self.driver.execute_script('''
  62. window.scroll(100000,0);
  63. ''')
  64. WebDriverWait(self.driver, 10).until(
  65. lambda driver: self.driver.find_element_by_css_selector('#PRODUCTTYPE_WECHAT'))
  66. # 推广公众号
  67. wechat_gg = self.driver.find_element_by_css_selector('#PRODUCTTYPE_WECHAT')
  68. wechat_gg.click()
  69. localtion = self.task['localtion']
  70. if localtion == 'gzh_bottom':
  71. # 默认是这个选项,所以不用进行点选
  72. pass
  73. if localtion == 'gzh_movie':
  74. wechat_localtion = self.driver.find_element_by_id('pos_8')
  75. wechat_localtion.click()
  76. if localtion == 'pyq':
  77. wechat_localtion = self.driver.find_element_by_css_selector(
  78. '#wxadcontainer > div:nth-child(1) > div > div.content-2-HFBij0Uh > main > div > div:nth-child(3) > div.adui-grid-row > div:nth-child(1)')
  79. wechat_localtion.click()
  80. time.sleep(random.uniform(0.1, 0.3))
  81. # 花销设置
  82. # cost_input = self.driver.find_element_by_css_selector(
  83. # '#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')
  84. # cost_input.send_keys('100')
  85. # 进入下一页
  86. next_button = self.driver.find_element_by_css_selector('#plan_next_step')
  87. next_button.click()
  88. self.driver.save_screenshot('set_page_localtion.png')
  89. def set_ad_cost(self):
  90. # 投放计划创建
  91. # 广告创建
  92. WebDriverWait(self.driver, 10).until(
  93. lambda driver: self.driver.find_element_by_css_selector('#area_input > div > i'))
  94. self.driver.find_element_by_css_selector('#area_input > div > i').click()
  95. if self.task['localtion'] == 'gzh_botoom':
  96. self.driver.find_element_by_class_name('icon-3cAquX1RLZ').click()
  97. if self.task['localtion'] == 'gzh_movie':
  98. citys = self.driver.find_elements_by_class_name('checkbox-1pfRMRqv-R')
  99. for _ in citys:
  100. _.click()
  101. if self.task['localtion'] == 'pyq':
  102. pass
  103. day_cost = self.driver.find_element_by_css_selector('#budget_input')
  104. day_cost.send_keys('100')
  105. self.driver.save_screenshot('set_page_cost.png')
  106. self.driver.find_element_by_css_selector('#target_next_step').click()
  107. def set_ad_idea(self):
  108. # TODO:实验一下视频上传
  109. # TODO:创意创建这部分切割开
  110. # 创意创建
  111. if self.task['localtion'] == 'gzh_bottom':
  112. self.ad_idea_action.idea_pic_gzh_bottom()
  113. if self.task['localtion'] == 'gzh_movie':
  114. self.ad_idea_action.idea_movie_gzh_movie()
  115. if self.task['localtion'] == 'pyq':
  116. pass
  117. next_button = self.driver.find_element_by_class_name('adui-button-primary')
  118. next_button.click()
  119. def push_ad(self):
  120. # 提交
  121. time.sleep(random.uniform(3, 4))
  122. self.driver.find_element_by_class_name('icon-3cAquX1RLZ').click()
  123. time.sleep(random.uniform(0.5, 1))
  124. self.driver.save_screenshot('push_page.png')
  125. self.driver.find_element_by_class_name('adui-button-primary').click()
  126. def task_check(self):
  127. # TODO:检查任务有无输入问题,
  128. if 'master' not in self.task.keys() or 'localtion' not in self.task.keys():
  129. exit()
  130. def run(self):
  131. # TODO:出错就截图,然后保存
  132. self.log_in()
  133. self.select_ad_master()
  134. self.select_ad_locations()
  135. self.set_ad_cost()
  136. self.set_ad_idea()
  137. self.push_ad()
  138. if __name__ == '__main__':
  139. task = {'master': '', 'localtion': 'gzh_movie'}
  140. SendAd(task).run()