create_ad_layout.py 35 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735
  1. from selenium.webdriver.support.wait import WebDriverWait
  2. from selenium.webdriver.common.keys import Keys
  3. from selenium.webdriver import ActionChains
  4. from logging import handlers
  5. import logging
  6. import random
  7. import time
  8. import re
  9. import os
  10. class CreateAd:
  11. def __init__(self, login_ad, user_id):
  12. self.user_id = user_id
  13. self.driver = login_ad.get_driver_loged()
  14. self.get_into_create_page()
  15. self.send_file_limit_num = 8
  16. def get_into_create_page(self):
  17. # 进入创建页面
  18. self.driver.find_element_by_id('material').click()
  19. WebDriverWait(self.driver, 10).until(lambda driver: driver.find_element_by_class_name('ui-fl-r'))
  20. time.sleep(random.uniform(0.1, 0.2))
  21. self.driver.find_element_by_class_name('ui-fl-r').click()
  22. WebDriverWait(self.driver, 5).until(lambda driver: driver.find_element_by_css_selector(
  23. '#wxadcontainer > div:nth-child(1) > div:nth-child(2) > div.dialog-1fj_N480ZT > div > div > div:nth-child(1) > div.dialogCardFooter-17KpBD1lgN > button'))
  24. self.driver.find_element_by_css_selector(
  25. '#wxadcontainer > div:nth-child(1) > div:nth-child(2) > div.dialog-1fj_N480ZT > div > div > div:nth-child(1) > div.dialogCardFooter-17KpBD1lgN > button').click()
  26. self.driver.switch_to.window(self.driver.window_handles[-1])
  27. WebDriverWait(self.driver, 100).until(lambda driver: driver.find_element_by_class_name('addContent-8pexaaAGYy'))
  28. self.driver.find_element_by_class_name('addContent-8pexaaAGYy').click()
  29. WebDriverWait(self.driver, 100).until(lambda driver: driver.find_element_by_class_name('topArea-qOwEAeNuIn'))
  30. def set_advertisement_sign(self):
  31. # 设置广告标记
  32. now_time = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())
  33. self.driver.find_element_by_xpath('//*[@class="icon-edQB0KK2VG"]').click()
  34. input_element = self.driver.find_element_by_xpath('//input[@class="input-2lFnByGCRh"]')
  35. input_element.send_keys(Keys.BACKSPACE)
  36. input_element.send_keys(now_time)
  37. return now_time
  38. def set_background_color(self):
  39. color_buttons = self.driver.find_elements_by_class_name('adui-cp-picker')
  40. c_buttons_can_use = []
  41. for _ in color_buttons:
  42. if _.is_displayed() and _.is_enabled():
  43. c_buttons_can_use.append(_)
  44. c_buttons_can_use[0].click()
  45. time.sleep(random.uniform(0.2, 0.3))
  46. input_elements = self.driver.find_elements_by_xpath('//input[@class="adui-input-base"]')
  47. for _ in input_elements:
  48. if _.is_enabled() and _.is_displayed() and _.get_attribute("value") == 'FFFFFF':
  49. _.click()
  50. _.send_keys('F7F7F7')
  51. def set_head_assemb(self, info):
  52. def single_page_set():
  53. self.driver.find_element_by_xpath('//*[@id="stage-sidebar"]/div[1]/div/div[1]/div/div').click()
  54. time.sleep(random.uniform(0.1, 0.2))
  55. file_name = os.path.basename(info_v)
  56. self.driver.find_element_by_class_name('upload-img-item-inner-2gsg7NjaZ8').click()
  57. WebDriverWait(self.driver, 10).until(
  58. lambda x: len([_ for _ in self.driver.find_elements_by_class_name('title-29sncpKgTl') if
  59. _.is_displayed() and _.is_enabled()]) > 0)
  60. turn_page_buttons = self.driver.find_elements_by_class_name('paginationIcon-1EfoH0sNRF')
  61. can_use_button = []
  62. for _ in turn_page_buttons:
  63. if _.is_enabled() and _.is_displayed():
  64. can_use_button.append(_)
  65. # 不断翻页获取到元素为止
  66. chose_over = False
  67. while True:
  68. page_elements = self.driver.find_elements_by_class_name('title-29sncpKgTl')
  69. for _ in page_elements:
  70. if _.is_displayed() and _.is_enabled():
  71. if file_name in _.text:
  72. _.click()
  73. chose_over = True
  74. break
  75. if chose_over or len(can_use_button) == 0:
  76. break
  77. # 翻到最后一页时停止
  78. page_text = self.driver.find_element_by_class_name('count_small-37CcvfzoTl').text
  79. page_nums = re.findall('\d+', page_text)
  80. if int(page_nums[0].strip()) == int(page_nums[1].strip()):
  81. break
  82. # 翻页
  83. can_use_button[2].click()
  84. # 确保翻页成功
  85. WebDriverWait(self.driver, 10).until(
  86. lambda x: page_text != self.driver.find_element_by_class_name('count_small-37CcvfzoTl').text)
  87. self.driver.find_element_by_xpath('//*[@id="test_material_container_confirm"]').click()
  88. try:
  89. WebDriverWait(self.driver, 4).until(
  90. lambda driver: driver.find_element_by_class_name(
  91. 'btnFist-uueBS6DQFa'))
  92. _ = self.driver.find_element_by_class_name(
  93. 'btnFist-uueBS6DQFa')
  94. WebDriverWait(self.driver, 4).until(
  95. lambda x: (_.is_displayed() and _.is_enabled()))
  96. time.sleep(1)
  97. _.click()
  98. WebDriverWait(self.driver, 100).until(
  99. lambda driver: driver.find_element_by_class_name(
  100. 'btn-3E823IXt3m'))
  101. _ = self.driver.find_element_by_class_name(
  102. 'btn-3E823IXt3m')
  103. WebDriverWait(self.driver, 100).until(
  104. lambda x: (_.is_displayed() and _.is_enabled()))
  105. time.sleep(1)
  106. _.click()
  107. except Exception as e:
  108. pass
  109. logging.info('头版首页单图上传结束')
  110. def multi_page_set():
  111. self.driver.find_element_by_css_selector(
  112. '#stage-sidebar > div.topArea-qOwEAeNuIn > div > div:nth-child(2)').click()
  113. time.sleep(random.uniform(0.1, 0.2))
  114. page_size = len(info_v)
  115. if page_size == 3:
  116. pass
  117. if page_size == 4:
  118. self.driver.find_element_by_css_selector(
  119. '#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()
  120. if page_size == 6:
  121. self.driver.find_element_by_css_selector(
  122. '#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()
  123. time.sleep(random.uniform(0.1, 0.2))
  124. self.driver.find_element_by_class_name('imageUploadItem-tA9JX0RWua').click()
  125. WebDriverWait(self.driver, 1000).until(
  126. lambda driver: self.driver.find_element_by_class_name('adui-tabs-tab')
  127. )
  128. input_elements = self.driver.find_elements_by_tag_name('input')
  129. input_find_element = None
  130. for _ in input_elements:
  131. if '输入关键词搜索素材' in _.get_attribute('placeholder'):
  132. input_find_element = _
  133. for _ in info_v:
  134. file_name = os.path.basename(_)
  135. logging.info(file_name)
  136. input_find_element.send_keys(file_name)
  137. input_find_element.send_keys(Keys.RETURN)
  138. WebDriverWait(self.driver, 1000).until(
  139. lambda driver: driver.find_element_by_class_name('img-2HvhMmpnzP'))
  140. file_element = self.driver.find_element_by_class_name('img-2HvhMmpnzP')
  141. WebDriverWait(self.driver, 1000).until(
  142. lambda x: (file_element.is_displayed() and file_element.is_enabled()))
  143. ActionChains(self.driver).move_to_element(file_element).perform()
  144. time.sleep(random.uniform(0.5, 1))
  145. file_element.click()
  146. for i in range(len(file_name) + 10):
  147. input_find_element.send_keys(Keys.BACKSPACE)
  148. time.sleep(random.uniform(0.5, 1))
  149. self.driver.find_element_by_xpath('/html/body/div[12]/div/div/div[2]/div/div[3]/button[2]').click()
  150. # 切图操作如果有的话进行对应操作.
  151. for i in range(len(info_v) + 1):
  152. try:
  153. WebDriverWait(self.driver, 6).until(
  154. lambda driver: driver.find_element_by_xpath(
  155. '/html/body/div[13]/div/div/div[2]/div/div[3]/button[2]'))
  156. self.driver.find_element_by_xpath('/html/body/div[13]/div/div/div[2]/div/div[3]/button[2]').click()
  157. except:
  158. pass
  159. logging.info('头版多图选择 结束')
  160. def movie_set():
  161. file_name = os.path.basename(info_v)
  162. self.driver.find_element_by_xpath('//*[@id="stage-sidebar"]/div[1]/div/div[3]/div/div').click()
  163. self.driver.find_element_by_xpath('//*[@class="comptEditButton-2JsnAFdOGZ"]').click()
  164. WebDriverWait(self.driver, 100).until(
  165. lambda x: len([_ for _ in self.driver.find_elements_by_class_name('title-29sncpKgTl') if
  166. _.is_displayed() and _.is_enabled()]) > 0)
  167. #
  168. turn_page_buttons = self.driver.find_elements_by_class_name('paginationIcon-1EfoH0sNRF')
  169. can_use_button = []
  170. for _ in turn_page_buttons:
  171. if _.is_enabled() and _.is_displayed():
  172. can_use_button.append(_)
  173. # 不断翻页获取到元素为止
  174. chose_over = False
  175. while True:
  176. page_elements = self.driver.find_elements_by_class_name('title-29sncpKgTl')
  177. for _ in page_elements:
  178. if _.is_displayed() and _.is_enabled():
  179. if file_name in _.text:
  180. _.click()
  181. chose_over = True
  182. break
  183. if chose_over or len(can_use_button) == 0:
  184. # can_use_button 数量说明是否可以翻页,如果不可以翻页,则直接停止
  185. break
  186. # 翻到最后一页时停止
  187. page_text_elements = self.driver.find_elements_by_class_name('count_small-37CcvfzoTl')
  188. for _ in page_text_elements:
  189. if _.is_enabled() and _.is_displayed():
  190. page_text = _.text
  191. page_text_element = _
  192. page_nums = re.findall('\d+', page_text)
  193. if int(page_nums[0].strip()) == int(page_nums[1].strip()):
  194. break
  195. # 翻页
  196. can_use_button[2].click()
  197. # 确保翻页成功
  198. WebDriverWait(self.driver, 10).until(
  199. lambda x: page_text != page_text_element.text)
  200. sc_buttons = self.driver.find_elements_by_id('test_material_container_confirm')
  201. for _ in sc_buttons:
  202. if _.is_enabled() and _.is_displayed():
  203. _.click()
  204. info_key = list(info.keys())[0]
  205. info_v = info[info_key]
  206. if info_key == 'page':
  207. single_page_set()
  208. if info_key == 'multi_page':
  209. multi_page_set()
  210. if info_key == 'movie':
  211. movie_set()
  212. # 设置头部组件
  213. pass
  214. def set_page(self, page_path):
  215. # 设置图片模块
  216. self.driver.find_element_by_xpath('//*[@id="stage-sidebar"]/section/div[2]/div[1]/div/div').click()
  217. time.sleep(random.uniform(0.1, 0.2))
  218. file_name = os.path.basename(page_path)
  219. upload_elements = self.driver.find_elements_by_class_name('upload-img-item-inner-2gsg7NjaZ8')
  220. for _ in upload_elements:
  221. if _.is_displayed() and _.is_enabled():
  222. _.click()
  223. WebDriverWait(self.driver, 10).until(
  224. lambda x: len([_ for _ in self.driver.find_elements_by_class_name('title-29sncpKgTl') if
  225. _.is_displayed() and _.is_enabled()]) > 0)
  226. turn_page_buttons = self.driver.find_elements_by_class_name('paginationIcon-1EfoH0sNRF')
  227. can_use_button = []
  228. for _ in turn_page_buttons:
  229. if _.is_enabled() and _.is_displayed():
  230. can_use_button.append(_)
  231. # 不断翻页获取到元素为止
  232. chose_over = False
  233. while True:
  234. page_elements = self.driver.find_elements_by_class_name('title-29sncpKgTl')
  235. for _ in page_elements:
  236. if _.is_displayed() and _.is_enabled():
  237. if file_name in _.text:
  238. _.click()
  239. chose_over = True
  240. break
  241. if chose_over or len(can_use_button) == 0:
  242. # can_use_button 数量说明是否可以翻页,如果不可以翻页,则直接停止
  243. break
  244. # 翻到最后一页时停止
  245. page_text_elements = self.driver.find_elements_by_class_name('count_small-37CcvfzoTl')
  246. for _ in page_text_elements:
  247. if _.is_enabled() and _.is_displayed():
  248. page_text = _.text
  249. page_text_element = _
  250. page_nums = re.findall('\d+', page_text)
  251. if int(page_nums[0].strip()) == int(page_nums[1].strip()):
  252. break
  253. # 翻页
  254. can_use_button[2].click()
  255. # 确保翻页成功
  256. WebDriverWait(self.driver, 10).until(
  257. lambda x: page_text != page_text_element.text)
  258. sc_buttons = self.driver.find_elements_by_id('test_material_container_confirm')
  259. for _ in sc_buttons:
  260. if _.is_enabled() and _.is_displayed():
  261. _.click()
  262. try:
  263. WebDriverWait(self.driver, 4).until(
  264. lambda driver: driver.find_element_by_class_name(
  265. 'btnFist-uueBS6DQFa'))
  266. _ = self.driver.find_element_by_class_name(
  267. 'btnFist-uueBS6DQFa')
  268. WebDriverWait(self.driver, 4).until(
  269. lambda x: (_.is_displayed() and _.is_enabled()))
  270. # 已经出现但任需要等待
  271. time.sleep(1)
  272. _.click()
  273. WebDriverWait(self.driver, 100).until(
  274. lambda x: len([_ for _ in self.driver.find_elements_by_class_name('btn-3E823IXt3m') if
  275. _.is_displayed() and _.is_enabled()]) > 0)
  276. for _ in self.driver.find_elements_by_class_name('btn-3E823IXt3m'):
  277. if _.is_displayed() and _.is_enabled():
  278. _.click()
  279. except Exception as e:
  280. logging.info(e)
  281. logging.info('图片模块设置结束')
  282. def set_content(self, config_info):
  283. # 设置文本模块
  284. # 1.文本内容2.文本颜色3.是否加粗4.文本位置设置5.文本大小
  285. # 设置文本内容
  286. self.driver.find_element_by_xpath('//*[@id="stage-sidebar"]/section/div[2]/div[5]/div/div').click()
  287. time.sleep(random.uniform(0.2, 0.3))
  288. input_elements = self.driver.find_elements_by_xpath('//textarea[@class="adui-input-base"]')
  289. for _ in input_elements:
  290. if _.is_enabled() and _.is_displayed():
  291. _.send_keys(config_info['content'])
  292. # 设置颜色
  293. if config_info['color'] != '595959':
  294. color_buttons = self.driver.find_elements_by_class_name('adui-cp-picker')
  295. c_buttons_can_use = []
  296. for _ in color_buttons:
  297. if _.is_displayed() and _.is_enabled():
  298. c_buttons_can_use.append(_)
  299. c_buttons_can_use[1].click()
  300. time.sleep(random.uniform(0.2, 0.3))
  301. input_elements = self.driver.find_elements_by_tag_name('input')
  302. for _ in input_elements:
  303. if _.is_enabled() and _.is_displayed() and _.get_attribute("value") == '595959':
  304. _.click()
  305. _.send_keys(config_info['color'])
  306. # 设置是否加粗
  307. if config_info['is_bold']:
  308. big_elements = self.driver.find_elements_by_class_name('adui-button-content')
  309. for _ in big_elements:
  310. if _.text == '加粗' and _.is_displayed() and _.is_enabled():
  311. _.click()
  312. # 设置文本位置
  313. if config_info['loc'] != 'left':
  314. loc_buttons = self.driver.find_elements_by_xpath(
  315. "//div[contains(@class, 'adui-button-group_banner')]//button")
  316. loc_buttons_can_use = []
  317. for _ in loc_buttons:
  318. if _.is_enabled() and _.is_displayed():
  319. loc_buttons_can_use.append(_)
  320. if config_info['loc'] == 'middle':
  321. loc_buttons_can_use[1].click()
  322. if config_info['loc'] == 'right':
  323. loc_buttons_can_use[2].click()
  324. # 设置文本大小
  325. if config_info['str_num'] != 15:
  326. str_buttons = self.driver.find_elements_by_xpath("//*[@class='adui-select-selection-search']")
  327. str_buttons_can_use = []
  328. for _ in str_buttons:
  329. if _.is_displayed() and _.is_enabled():
  330. str_buttons_can_use.append(_)
  331. str_buttons_can_use[1].click()
  332. time.sleep(random.uniform(0.5, 1))
  333. str_num_buttons = self.driver.find_elements_by_xpath("//*[@class='adui-select-item-option-content']")
  334. str_num_can_use = []
  335. for _ in str_num_buttons:
  336. if _.is_displayed() and _.is_enabled():
  337. str_num_can_use.append(_)
  338. str_num_map = {14: 0, 16: 1, 18: 2, 20: 3, 24: 4, 36: 5}
  339. str_num_can_use[str_num_map[config_info['str_num']]].click()
  340. # 设置文本边距
  341. if config_info['str_distance'][0] != 22 or config_info['str_distance'][1] != 22:
  342. distance_buttons = self.driver.find_elements_by_xpath('//input[@class="adui-input-base"]')
  343. distance_buttons_can_use = []
  344. for _ in distance_buttons:
  345. if _.is_enabled() and _.is_displayed() and _.get_attribute("value") == '22':
  346. distance_buttons_can_use.append(_)
  347. distance_buttons_can_use[0].click()
  348. for i in range(4):
  349. distance_buttons_can_use[0].send_keys(Keys.BACKSPACE)
  350. distance_buttons_can_use[0].send_keys(config_info['str_distance'][0])
  351. distance_buttons_can_use[1].click()
  352. for i in range(4):
  353. distance_buttons_can_use[1].send_keys(Keys.BACKSPACE)
  354. distance_buttons_can_use[1].send_keys(config_info['str_distance'][1])
  355. def set_follow_button(self, button_type):
  356. # 设置关注按钮
  357. # 1.设置button文本内容2.是否加粗3.设置字体颜色,边框颜色,填充色4.设置边距
  358. self.driver.find_element_by_xpath('//*[@id="stage-sidebar"]/section/div[4]/div[2]/div/div').click()
  359. if button_type == 1:
  360. input_elements = self.driver.find_elements_by_xpath('//input[@class="adui-input-base"]')
  361. for _ in input_elements:
  362. if _.is_enabled() and _.is_displayed() and _.get_attribute("value") == '关注公众号':
  363. _.click()
  364. _.clear()
  365. for i in range(10):
  366. _.send_keys(Keys.BACKSPACE)
  367. _.send_keys('保存阅读记录')
  368. big_elements = self.driver.find_elements_by_xpath('//span[@class="adui-button-content"]')
  369. for _ in big_elements:
  370. if _.text == '加粗' and _.is_displayed() and _.is_enabled():
  371. _.click()
  372. input_elements = self.driver.find_elements_by_xpath('//input[@class="adui-input-base"]')
  373. for _ in input_elements:
  374. if _.is_enabled() and _.is_displayed() and _.get_attribute("value") == '07C160':
  375. _.click()
  376. _.send_keys('DE2821')
  377. if button_type == 2:
  378. input_elements = self.driver.find_elements_by_xpath('//input[@class="adui-input-base"]')
  379. for _ in input_elements:
  380. if _.is_enabled() and _.is_displayed() and _.get_attribute("value") == '关注公众号':
  381. _.click()
  382. _.clear()
  383. for i in range(10):
  384. _.send_keys(Keys.BACKSPACE)
  385. _.send_keys('点击此处,继续阅读')
  386. big_elements = self.driver.find_elements_by_xpath('//span[@class="adui-button-content"]')
  387. for _ in big_elements:
  388. if _.text == '加粗' and _.is_displayed() and _.is_enabled():
  389. _.click()
  390. input_elements = self.driver.find_elements_by_xpath('//input[@class="adui-input-base"]')
  391. for _ in input_elements:
  392. if _.is_enabled() and _.is_displayed() and _.get_attribute("value") == '07C160':
  393. _.click()
  394. _.send_keys('DE2821')
  395. size_buttons = self.driver.find_elements_by_xpath('//input[@class="adui-input-base"]')
  396. size_buttons_can_use = []
  397. for _ in size_buttons:
  398. if _.is_enabled() and _.is_displayed() and _.get_attribute("value") == '28':
  399. size_buttons_can_use.append(_)
  400. size_buttons_can_use[0].click()
  401. for i in range(4):
  402. size_buttons_can_use[0].send_keys(Keys.BACKSPACE)
  403. size_buttons_can_use[0].send_keys('0')
  404. size_buttons_can_use[1].click()
  405. for i in range(4):
  406. size_buttons_can_use[1].send_keys(Keys.BACKSPACE)
  407. size_buttons_can_use[1].send_keys('0')
  408. if button_type == 3:
  409. input_elements = self.driver.find_elements_by_xpath('//input[@class="adui-input-base"]')
  410. for _ in input_elements:
  411. if _.is_enabled() and _.is_displayed() and _.get_attribute("value") == '关注公众号':
  412. _.click()
  413. _.clear()
  414. for i in range(10):
  415. _.send_keys(Keys.BACKSPACE)
  416. _.send_keys('点我,继续阅读')
  417. big_elements = self.driver.find_elements_by_xpath('//span[@class="adui-button-content"]')
  418. for _ in big_elements:
  419. if _.text == '加粗' and _.is_displayed() and _.is_enabled():
  420. _.click()
  421. input_elements = self.driver.find_elements_by_xpath('//input[@class="adui-input-base"]')
  422. for _ in input_elements:
  423. if _.is_enabled() and _.is_displayed() and _.get_attribute("value") == '07C160':
  424. _.click()
  425. _.send_keys('FFFFFF')
  426. input_elements = self.driver.find_elements_by_xpath('//input[@class="adui-input-base"]')
  427. for _ in input_elements:
  428. if _.is_enabled() and _.is_displayed() and _.get_attribute("value") == 'FFFFFF':
  429. _.click()
  430. _.send_keys('DE2821')
  431. break
  432. size_buttons = self.driver.find_elements_by_xpath('//input[@class="adui-input-base"]')
  433. size_buttons_can_use = []
  434. for _ in size_buttons:
  435. if _.is_enabled() and _.is_displayed() and _.get_attribute("value") == '28':
  436. size_buttons_can_use.append(_)
  437. size_buttons_can_use[0].click()
  438. for i in range(4):
  439. size_buttons_can_use[0].send_keys(Keys.BACKSPACE)
  440. size_buttons_can_use[0].send_keys('0')
  441. size_buttons_can_use[1].click()
  442. for i in range(4):
  443. size_buttons_can_use[1].send_keys(Keys.BACKSPACE)
  444. size_buttons_can_use[1].send_keys('100')
  445. def set_follow_button_(self, config_info):
  446. # 设置关注按钮
  447. # 1.设置button文本内容 2.是否加粗 3.设置字体颜色,边框颜色,填充色 4.设置边距
  448. self.driver.find_element_by_xpath('//*[@id="stage-sidebar"]/section/div[4]/div[2]/div/div').click()
  449. # 文本设置
  450. input_elements = self.driver.find_elements_by_xpath('//input[@class="adui-input-base"]')
  451. for _ in input_elements:
  452. if _.is_enabled() and _.is_displayed() and _.get_attribute("value") == '关注公众号':
  453. _.click()
  454. _.clear()
  455. for i in range(10):
  456. _.send_keys(Keys.BACKSPACE)
  457. _.send_keys(config_info['content'])
  458. # 文本是否加粗
  459. if config_info['is_bold']:
  460. big_elements = self.driver.find_elements_by_xpath('//span[@class="adui-button-content"]')
  461. for _ in big_elements:
  462. if _.text == '加粗' and _.is_displayed() and _.is_enabled():
  463. _.click()
  464. # 颜色设置
  465. input_elements = self.driver.find_elements_by_xpath('//input[@class="adui-input-base"]')
  466. input_elements_can_use = []
  467. for _ in input_elements:
  468. if _.is_enabled() and _.is_displayed() and (
  469. _.get_attribute("value") == '07C160' or _.get_attribute("value") == 'FFFFFF'):
  470. input_elements_can_use.append(_)
  471. input_elements_can_use[0].click()
  472. input_elements_can_use[0].send_keys(config_info['color1'])
  473. time.sleep(random.uniform(0.1, 0.5))
  474. input_elements_can_use[1].click()
  475. input_elements_can_use[1].send_keys(config_info['color2'])
  476. time.sleep(random.uniform(0.1, 0.5))
  477. input_elements_can_use[2].click()
  478. input_elements_can_use[2].send_keys(config_info['color3'])
  479. time.sleep(random.uniform(0.1, 0.5))
  480. # 间隙设置
  481. size_buttons = self.driver.find_elements_by_xpath('//input[@class="adui-input-base"]')
  482. size_buttons_can_use = []
  483. for _ in size_buttons:
  484. if _.is_enabled() and _.is_displayed() and _.get_attribute("value") == '28':
  485. size_buttons_can_use.append(_)
  486. size_buttons_can_use[0].click()
  487. for i in range(4):
  488. size_buttons_can_use[0].send_keys(Keys.BACKSPACE)
  489. size_buttons_can_use[0].send_keys(config_info['str_distance'][0])
  490. size_buttons_can_use[1].click()
  491. for i in range(4):
  492. size_buttons_can_use[1].send_keys(Keys.BACKSPACE)
  493. size_buttons_can_use[1].send_keys(config_info['str_distance'][1])
  494. def set_text_button(self):
  495. # 设置图文按钮
  496. pass
  497. def send_file_multi(self, layout, err_num=0):
  498. # 有问题,暂时不使用
  499. # 上传文件,文件上传与整体流程切割开
  500. token = re.findall('token=(\d+)', self.driver.current_url)
  501. url_ = 'https://mp.weixin.qq.com/promotion/frame?t=ad_system/common_frame&t1=material_std/material_library&token={}'.format(
  502. token[0])
  503. js = "window.open('{}')".format(url_)
  504. self.driver.execute_script(js)
  505. time.sleep(random.uniform(1, 2))
  506. self.driver.switch_to.window(self.driver.window_handles[-1])
  507. file_set = set()
  508. for v in layout.values():
  509. if isinstance(v, dict):
  510. if 'multi_page' in v.keys() or 'page' in v.keys() or 'movie' in v.keys():
  511. v_name = list(v.keys())[0]
  512. if isinstance(v[v_name], list):
  513. for _ in v[v_name]:
  514. file_set.add(_)
  515. else:
  516. file_set.add(v[v_name])
  517. file_list = list(file_set)
  518. # print(file_list)
  519. # print('file list size', len(file_list))
  520. send_file_sign = self.send_file_limit_num
  521. for _ in file_list:
  522. # print(_)
  523. self.driver.find_element_by_xpath('//*[@id="wxadcontainer"]/div[1]/div[2]/div[4]/input').send_keys(_)
  524. time.sleep(100)
  525. while True:
  526. # 失败,失败直接退出重跑
  527. # 正在上传数量,如果是正在上传小于限定数量,就不断输入
  528. # 上传完毕,小于限定数量,不断输入,.....已经上传好了,就关闭
  529. time.sleep(1)
  530. send_reslut_content = self.driver.find_element_by_xpath(
  531. '//*[@id="wxadcontainer"]/div[1]/div[2]/div[4]/div/strong').text
  532. if '失败' in send_reslut_content:
  533. if err_num < 3:
  534. self.send_file(layout, err_num=err_num + 1)
  535. else:
  536. exit()
  537. if '正在上传' in send_reslut_content:
  538. if send_file_sign < len(file_list):
  539. send_num = re.findall('(\d+)', send_reslut_content)[0]
  540. if int(send_num) < self.send_file_limit_num:
  541. # 还可以继续上传
  542. x = send_file_sign
  543. can_send_sign = send_file_sign + (self.send_file_limit_num - send_num)
  544. y = can_send_sign if can_send_sign < len(file_list) else len(file_list)
  545. for i in range(x, y):
  546. send_file_sign = send_file_sign + 1
  547. self.driver.find_element_by_xpath(
  548. '//*[@id="wxadcontainer"]/div[1]/div[2]/div[4]/input').send_keys(file_list[i])
  549. else:
  550. pass
  551. if '上传成功' in send_reslut_content:
  552. if send_file_sign < len(file_list):
  553. send_num = re.findall('(\d+)', send_reslut_content)[0]
  554. if int(send_num) < self.send_file_limit_num:
  555. # 还可以继续上传
  556. x = send_file_sign
  557. can_send_sign = send_file_sign + (self.send_file_limit_num - send_num)
  558. y = can_send_sign if can_send_sign < len(file_list) else len(file_list)
  559. for i in range(x, y):
  560. send_file_sign = send_file_sign + 1
  561. self.driver.find_element_by_xpath(
  562. '//*[@id="wxadcontainer"]/div[1]/div[2]/div[4]/input').send_keys(file_list[i])
  563. else:
  564. break
  565. time.sleep(1000)
  566. self.driver.execute_script('window.close();')
  567. def send_file(self, file_path, err_num=0):
  568. # 有问题,暂时不使用
  569. self.driver.execute_script('location.reload();')
  570. self.driver.find_element_by_xpath('//*[@id="wxadcontainer"]/div[1]/div[2]/div[4]/input').send_keys(file_path)
  571. def send_file_alone(self, layout):
  572. # 上传文件,单线程
  573. # 上传文件,文件上传与整体流程切割开
  574. token = re.findall('token=(\d+)', self.driver.current_url)
  575. url_ = 'https://mp.weixin.qq.com/promotion/frame?t=ad_system/common_frame&t1=material_std/material_library&token={}'.format(
  576. token[0])
  577. js = "window.open('{}')".format(url_)
  578. self.driver.execute_script(js)
  579. time.sleep(random.uniform(1, 2))
  580. self.driver.switch_to.window(self.driver.window_handles[-1])
  581. file_set = set()
  582. for v in layout.values():
  583. if isinstance(v, dict):
  584. if 'multi_page' in v.keys() or 'page' in v.keys() or 'movie' in v.keys():
  585. v_name = list(v.keys())[0]
  586. if isinstance(v[v_name], list):
  587. for _ in v[v_name]:
  588. file_set.add(_)
  589. else:
  590. file_set.add(v[v_name])
  591. for _ in file_set:
  592. self.send_file(_)
  593. err_num = 0
  594. while True:
  595. time.sleep(1)
  596. send_reslut_content = self.driver.find_element_by_xpath(
  597. '//*[@id="wxadcontainer"]/div[1]/div[2]/div[4]/div/strong').text
  598. if '上传成功' in send_reslut_content:
  599. break
  600. if '失败' in send_reslut_content:
  601. err_num = err_num + 1
  602. self.send_file(_)
  603. if err_num > 3:
  604. raise ValueError("图片上传失败")
  605. self.driver.execute_script('window.close();')
  606. self.driver.switch_to.window(self.driver.window_handles[-1])
  607. def set_share_content(self, share_info):
  608. title_content = share_info['share_info']['title']
  609. des_content = share_info['share_info']['des']
  610. self.driver.find_element_by_xpath('//*[@id="wxadcontainer"]/div[1]/div/section/header/div[2]/button[2]').click()
  611. WebDriverWait(self.driver, 50).until(lambda driver: driver.find_element_by_xpath(
  612. '//*[@id="wxadcontainer"]/div[1]/div/div/div/div[1]/section/section/div[2]/div[1]/div/div/input'))
  613. title_input = self.driver.find_element_by_xpath(
  614. '//*[@id="wxadcontainer"]/div[1]/div/div/div/div[1]/section/section/div[2]/div[1]/div/div/input')
  615. title_input.click()
  616. title_input.send_keys(title_content)
  617. des_input = self.driver.find_element_by_xpath(
  618. '//*[@id="wxadcontainer"]/div[1]/div/div/div/div[1]/section/section/div[2]/div[2]/div/div/input')
  619. des_input.click()
  620. des_input.send_keys(des_content)
  621. self.driver.find_element_by_xpath('//*[@id="wxadcontainer"]/div[1]/div/header/div[2]/button').click()
  622. WebDriverWait(self.driver, 10).until(
  623. lambda driver: driver.find_element_by_xpath('/html/body/div[6]/div/div/div[2]/div/div[3]/button[2]'))
  624. self.driver.find_element_by_xpath('/html/body/div[6]/div/div/div[2]/div/div[3]/button[2]').click()
  625. time.sleep(1)
  626. def create_layout(self, layout, err_num=0):
  627. #
  628. try:
  629. self.send_file_alone(layout)
  630. advertisement_sign = self.set_advertisement_sign()
  631. self.set_head_assemb(layout[str(-1)])
  632. if -2 in layout.keys():
  633. self.set_background_color()
  634. for _ in range(max([int(x) for x in layout.keys()]) + 1):
  635. info = layout[str(_)]
  636. info_key = list(info.keys())[0]
  637. info_v = info[info_key]
  638. if info_key == 'page':
  639. self.set_page(info_v)
  640. if info_key == 'content':
  641. self.set_content(info_v)
  642. if info_key == 'follow_button':
  643. self.set_follow_button_(info_v)
  644. self.set_share_content(layout[str(-3)])
  645. self.driver.execute_script('window.close();')
  646. # 切回到前一页
  647. self.driver.switch_to.window(self.driver.window_handles[-1])
  648. return {'sucess': True, 'result_info': advertisement_sign}
  649. except Exception as e:
  650. # TODO:有空时讲 e 内容设置为原始内容
  651. if err_num > 3:
  652. return {'sucess': False, 'result_info': str(e)}
  653. else:
  654. return self.create_layout(layout, err_num=err_num + 1)
  655. def check_sucess(self):
  656. # TODO: 添加一个页面检查,查看落地页是否已经在微信后台创建
  657. pass
  658. if __name__ == '__main__':
  659. logging.basicConfig(
  660. handlers=[
  661. logging.handlers.RotatingFileHandler('./create_ad.log',
  662. maxBytes=10 * 1024 * 1024,
  663. backupCount=5,
  664. encoding='utf-8')
  665. , logging.StreamHandler() # 供输出使用
  666. ],
  667. level=logging.INFO,
  668. format="%(asctime)s - %(levelname)s %(filename)s %(funcName)s %(lineno)s - %(message)s"
  669. )