login_ad.py 6.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157
  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 wechat_action.human_ad import HumanAd
  8. from selenium.webdriver import ChromeOptions
  9. from selenium.webdriver.common.keys import Keys
  10. from sqlalchemy import Table
  11. import time
  12. import pickle
  13. from settings import using_config
  14. from wechat_action.sql_models import DB
  15. import requests
  16. import json
  17. class LogIn:
  18. # TODO:整体运行使用逻辑,需要修改几次
  19. def __init__(self):
  20. # 获取到单独服务商下的独立公众号页面
  21. # TODO:之后的落地页创建,推广计划创建,改动service_name,wechat_name通过,login函数主动改动
  22. self.driver = self.get_driver()
  23. # self.log_in()
  24. # self.select_ad_master()
  25. def get_driver(self):
  26. options = ChromeOptions()
  27. # 防止selenium快速崩坏
  28. options.add_argument("--disable-dev-shm-usage")
  29. # driver = webdriver.Remote(
  30. # command_executor='http://192.168.7.245:4444/wd/hub',
  31. # options=options)
  32. driver = webdriver.Chrome()
  33. driver.maximize_window()
  34. return driver
  35. def log_in(self):
  36. # self.wechat_cookie_use()
  37. self.driver.get('https://a.weixin.qq.com/index.html')
  38. img_selector = 'body > div.old-template > div > div > div.waiting.panelContent > div.wrp_code > img'
  39. frame_login = self.driver.find_element_by_xpath('//*[@id="login_container"]/iframe')
  40. self.driver.switch_to.frame(frame_login)
  41. # WebDriverWait(driver, 3).until(EC.invisibility_of_element_located((By.CSS_SELECTOR, img_selector)))
  42. # time.sleep(3)
  43. img_url = self.driver.find_element_by_css_selector(img_selector)
  44. print('img', img_url.get_attribute('src'))
  45. return img_url.get_attribute('src')
  46. def log_in_wait(self):
  47. # 默认等待6分钟
  48. WebDriverWait(self.driver, 6 * 60).until(lambda driver: driver.find_elements_by_link_text('广告投放'))
  49. def select_ad_master(self, service_name, wechat_name):
  50. time.sleep(5)
  51. self.driver.execute_script('''
  52. window.scroll(0,1000000);
  53. ''')
  54. self.driver.find_element_by_css_selector(
  55. '#root > div > header > div > div.CoreLayout__account-2lIr0 > div').click()
  56. self.driver.find_element_by_css_selector(
  57. '#root > div > div.CoreLayout__headerDropdown-3xWkD > div > div:nth-child(1) > button').click()
  58. service_names = self.driver.find_elements_by_class_name('CoreLayout__headerDropdownItem-X4S98')
  59. choice_service = None
  60. for _ in service_names:
  61. if service_name in _.text:
  62. choice_service = _
  63. choice_service.click()
  64. # 挑选广告投放位置
  65. input_wechat_name = self.driver.find_element_by_class_name('TextInput_new__iconRight-pekjS')
  66. input_wechat_name.click()
  67. input_wechat_name.send_keys(wechat_name)
  68. input_wechat_name.send_keys(Keys.RETURN)
  69. self.driver.execute_script('''
  70. window.scroll(100000,1000000);
  71. var e_one=document.getElementsByClassName('Table_new__wrapper-1cpZN')[0];
  72. e_one.scroll(10000,100000);
  73. ''')
  74. time.sleep(5)
  75. elements = self.driver.find_elements_by_link_text('广告投放')
  76. elements[0].click()
  77. time.sleep(1)
  78. # 切换窗口,点击创建广告,切到广告页面
  79. self.driver.switch_to.window(self.driver.window_handles[-1])
  80. WebDriverWait(self.driver, 100).until(lambda driver: driver.find_element_by_class_name(
  81. 'adui-button-hasLeftIcon'))
  82. @staticmethod
  83. def get_cookie(driver):
  84. WebDriverWait(driver, 100).until(
  85. lambda x: [True for _ in driver.get_cookies() if 'token_ticket' == _['name']]
  86. )
  87. cookies = driver.get_cookies()
  88. cookie_dict = {}
  89. for _ in cookies:
  90. print(_)
  91. cookie_dict[_['name']] = _['value']
  92. return cookie_dict
  93. def wechat_cookie_pickle(self):
  94. self.driver.get('https://a.weixin.qq.com/client')
  95. WebDriverWait(self.driver, 100).until(
  96. lambda x: [True for _ in self.driver.get_cookies() if 'token_ticket' == _['name']]
  97. )
  98. cookies = self.driver.get_cookies()
  99. cookies_obj = pickle.dumps(cookies)
  100. return cookies_obj
  101. def wechat_cookies_check_alive(self, driver_cookies):
  102. # wechat 检查cookies 是否可用
  103. # 可用返回ture
  104. check_url = 'https://a.weixin.qq.com/cgi-bin/agency/get_delivery_metrics?page=1&page_size=10&search_key=&order_by=&ascending=1&only_collect=0&g_tk=5381&_={}'.format(
  105. int(time.time() * 1000))
  106. # cookie_dict = {}
  107. # for _ in driver_cookies:
  108. # cookie_dict[_['name']] = _['value']
  109. # rsp_json = requests.get(url=check_url, cookies=cookie_dict).json()
  110. self.driver.get('https://www.baidu.com')
  111. for _ in driver_cookies:
  112. self.driver.add_cookie(_)
  113. self.driver.get('https://a.weixin.qq.com/client')
  114. self.driver.get(check_url)
  115. print('检查cookies 结果', self.driver.page_source)
  116. if '4101' in self.driver.page_source:
  117. return False
  118. else:
  119. return True
  120. def upadte_user_info(self):
  121. # TODO: 更新 用户相关信息
  122. # 每次登录就更新一次相关数据,------公众号相关数据,人群报相关数据
  123. pass
  124. def get_driver_loged(self):
  125. return self.driver
  126. def refresh_driver(self):
  127. while True:
  128. if len(self.driver.window_handles) > 1:
  129. self.driver.switch_to.window(self.driver.window_handles[-1])
  130. self.driver.execute_script('window.close();')
  131. time.sleep(0.1)
  132. else:
  133. self.driver.switch_to.window(self.driver.window_handles[-1])
  134. self.driver.get('https://a.weixin.qq.com/client')
  135. break