outlook_register.py 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326
  1. #!/usr/bin/env python
  2. # -*- encoding: utf-8 -*-
  3. '''
  4. @Contact : liuyuqi.gov@msn.cn
  5. @Time : 2023/03/22 19:19:05
  6. @License : Copyright © 2017-2022 liuyuqi. All Rights Reserved.
  7. @Desc :
  8. '''
  9. from outlook_muti_register.register import Register
  10. from . import generate_email
  11. import os,sys,re,time,logging,random,requests,threading,queue,datetime
  12. import json
  13. import schedule
  14. import tempfile
  15. from selenium.common.exceptions import NoSuchElementException, ElementNotInteractableException
  16. from selenium.webdriver import DesiredCapabilities, Chrome, ChromeOptions
  17. from datetime import datetime
  18. from random import randrange, choice
  19. from selenium.webdriver.common import utils
  20. class OutlookRegister(Register):
  21. '''outlook register'''
  22. def __init__(self):
  23. '''init'''
  24. super(OutlookRegister, self).__init__()
  25. self.headers={
  26. 'accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9',
  27. 'accept-encoding': 'deflate',
  28. 'accept-language': 'en-US,en;q=0.9,zh-CN;q=0.8,zh;q=0.7',
  29. 'cache-control': 'max-age=0',
  30. 'dnt': '1',
  31. 'sec-fetch-dest': 'document',
  32. 'sec-fetch-mode': 'navigate',
  33. 'sec-fetch-site': 'none',
  34. 'sec-fetch-user': '?1',
  35. 'upgrade-insecure-requests': '1',
  36. 'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.149 Safari/537.36',
  37. }
  38. self.code_url = 'http://apigateway.jianjiaoshuju.com/api/v_1/yzmCustomized.html'
  39. self.code_headers = {
  40. 'appCode': 'X',
  41. 'appKey': 'X',
  42. 'appSecret': 'X'
  43. }
  44. def run(self):
  45. self.logger.info('outlook register start...')
  46. # get proxy ip list
  47. consecutive_fail_number = 0
  48. try:
  49. for tp, ip_port in self.get_ip_list():
  50. if datetime.now().minute == 10 or consecutive_fail_number > 10:
  51. break
  52. print('Proxy: {}://{}'.format(tp, ip_port))
  53. driver = self.create_driver(tp, ip_port)
  54. register_success = self.start_register(driver)
  55. driver.close()
  56. if register_success:
  57. consecutive_fail_number = 0
  58. if not register_success:
  59. consecutive_fail_number += 1
  60. except Exception as e:
  61. print(e)
  62. schedule.every().minute.at(':10').do(run_driver)
  63. # generate account and pwd (read from file)
  64. generate_email.generate_email()
  65. # start register with proxy ip and chrome driver
  66. #
  67. try:
  68. for ip, port in self.get_ip_list():
  69. pass
  70. except Exception as e:
  71. pass
  72. finally:
  73. pass
  74. def get_ip_list(self):
  75. '''get proxy ip list'''
  76. pass
  77. def register_email(self):
  78. '''register email'''
  79. pass
  80. # verification code Identification settings
  81. code_url = 'http://apigateway.jianjiaoshuju.com/api/v_1/yzmCustomized.html'
  82. code_headers = {
  83. 'appCode': 'X',
  84. 'appKey': 'X',
  85. 'appSecret': 'X'
  86. }
  87. last_image_data = ''
  88. last_code = ''
  89. def find_element_by_css_selector(driver, css_selector):
  90. try:
  91. time.sleep(0.1)
  92. return driver.find_element_by_css_selector(css_selector)
  93. except Exception:
  94. time.sleep(check_timeout)
  95. return find_element_by_css_selector(driver, css_selector)
  96. def find_elements_by_css_selector(driver, css_selector):
  97. try:
  98. time.sleep(0.1)
  99. return driver.find_elements_by_css_selector(css_selector)
  100. except Exception:
  101. time.sleep(check_timeout)
  102. return find_elements_by_css_selector(driver, css_selector)
  103. def find_element_by_link_text(driver, link_text):
  104. try:
  105. time.sleep(0.1)
  106. return driver.find_element_by_link_text(link_text)
  107. except Exception:
  108. time.sleep(check_timeout)
  109. return find_element_by_link_text(driver, link_text)
  110. def find_elements_by_tag_name(driver, tag_name, target_number=None, try_times=None):
  111. time.sleep(0.1)
  112. if try_times <= 0:
  113. raise Exception('Can not find element.')
  114. if try_times is not None:
  115. try_times -= 1
  116. try:
  117. l = driver.find_elements_by_tag_name(tag_name)
  118. if target_number is None:
  119. return l
  120. if len(l) == target_number:
  121. return l
  122. else:
  123. time.sleep(check_timeout)
  124. return find_elements_by_tag_name(driver, tag_name, target_number, try_times)
  125. except Exception:
  126. time.sleep(check_timeout)
  127. return find_elements_by_tag_name(driver, tag_name, target_number, try_times)
  128. def find_element_by_tag_name(driver, tag_name):
  129. try:
  130. time.sleep(0.1)
  131. return driver.find_element_by_tag_name(tag_name)
  132. except Exception:
  133. time.sleep(check_timeout)
  134. return find_element_by_tag_name(driver, tag_name)
  135. def get_code(img_data):
  136. global last_image_data
  137. global last_code
  138. if last_image_data == img_data:
  139. return last_code
  140. last_image_data = img_data
  141. data = {
  142. 'v_pic': img_data,
  143. 'pri_id': 'ne',
  144. }
  145. response = requests.post(code_url, headers=code_headers, data=data)
  146. code = json.loads(response.text)['v_code']
  147. last_code = code
  148. print('code is {}'.format(code))
  149. return code
  150. def register_email(driver, email, password):
  151. driver.get(url)
  152. time.sleep(check_timeout*2)
  153. sleep_timess = 0
  154. while True:
  155. try:
  156. driver.find_element_by_css_selector('#liveSwitch').click()
  157. break
  158. except Exception:
  159. time.sleep(check_timeout)
  160. sleep_timess += 1
  161. if sleep_timess > 10:
  162. return False
  163. while True:
  164. try:
  165. find_element_by_css_selector(driver, '#MemberName').clear()
  166. find_element_by_css_selector(
  167. driver, '#MemberName').send_keys(email)
  168. find_element_by_css_selector(driver, '#iSignupAction').click()
  169. break
  170. except Exception as e:
  171. time.sleep(check_timeout)
  172. sleep_timess = 0
  173. while driver.title != 'Create a password' and driver.title != '创建密码':
  174. time.sleep(check_timeout)
  175. sleep_timess += 1
  176. if sleep_timess > 15:
  177. return 'exist'
  178. find_element_by_css_selector(
  179. driver, '#PasswordInput').send_keys(password)
  180. find_element_by_css_selector(driver, '#iOptinEmail').click()
  181. find_element_by_css_selector(driver, '#iSignupAction').click()
  182. time.sleep(check_timeout)
  183. find_element_by_css_selector(
  184. driver, '#LastName').send_keys(choice(name_list))
  185. find_element_by_css_selector(
  186. driver, '#FirstName').send_keys(choice(name_list))
  187. find_element_by_css_selector(driver, '#iSignupAction').click()
  188. time.sleep(check_timeout)
  189. find_element_by_css_selector(
  190. driver, '#BirthYear option:nth-child({})'.format(randrange(2, 25))).click()
  191. find_element_by_css_selector(
  192. driver, '#BirthMonth option:nth-child({})'.format(randrange(2, 11))).click()
  193. find_element_by_css_selector(
  194. driver, '#BirthDay option:nth-child({})'.format(randrange(2, 22))).click()
  195. find_element_by_css_selector(driver, '#iSignupAction').click()
  196. time.sleep(check_timeout)
  197. t_url = driver.current_url
  198. try:
  199. while True:
  200. code_element = find_elements_by_tag_name(driver, 'input', 5, 2)[0]
  201. code_element.clear()
  202. code_element.send_keys(
  203. get_code(
  204. find_elements_by_tag_name(
  205. driver, 'img', 5, 2
  206. )[-1].screenshot_as_base64
  207. )
  208. )
  209. find_element_by_css_selector(driver, '#iSignupAction').click()
  210. time.sleep(check_timeout)
  211. try_times = 0
  212. while t_url == driver.current_url:
  213. time.sleep(check_timeout)
  214. try:
  215. driver.find_element_by_css_selector(
  216. '#iSignupAction').click()
  217. except Exception:
  218. pass
  219. try_times += 1
  220. if try_times > 8:
  221. break
  222. if t_url != driver.current_url:
  223. return True
  224. except Exception as e:
  225. print(e)
  226. return False
  227. def get_email_password():
  228. def _get_random_sign():
  229. return choice(sign_list)
  230. def _get_random_char(is_low=None):
  231. if is_low is None:
  232. r = randrange(0, 2)
  233. elif is_low is True:
  234. r = 0
  235. else:
  236. r = 1
  237. if r == 0:
  238. return chr(randrange(65, 91))
  239. else:
  240. return chr(randrange(97, 123))
  241. email = str(randrange(0, 10)).join(_get_random_char() for i in range(5))
  242. password = (
  243. str(randrange(0, 100)) + _get_random_sign()
  244. ).join(
  245. _get_random_char(True) + _get_random_char() + _get_random_char(False) for i in range(3)
  246. )
  247. return email, password
  248. def start_register(driver):
  249. email, password = get_email_password()
  250. result = register_email(driver, email, password)
  251. while result == 'exist':
  252. print('Already Register Account {}@outlook.com'.format(email))
  253. email, password = get_email_password()
  254. result = register_email(driver, email, password)
  255. if result:
  256. sleep_times = 0
  257. while 'account.microsoft.com' not in driver.current_url:
  258. sleep_times += 1
  259. time.sleep(check_timeout)
  260. if sleep_times >= 20:
  261. break
  262. if sleep_times >= 10:
  263. print('waiting time too long')
  264. else:
  265. with open('pass.txt', 'a+') as f:
  266. f.write(email + '@outlook.com ' + password + '\n')
  267. print('Success Register Account {}@outlook.com'.format(email))
  268. return True
  269. else:
  270. print('Fail')
  271. return False
  272. def create_driver(tp, ip_port):
  273. port = utils.free_port()
  274. options = ChromeOptions()
  275. desired_capabilities = DesiredCapabilities().CHROME
  276. desired_capabilities['pageLoadStrategy'] = 'none'
  277. os.popen(
  278. 'chrome.exe --remote-debugging-port={} --user-data-dir={} --proxy-server={}={}'.format(
  279. port, tempfile.mkdtemp(), tp, ip_port)
  280. )
  281. options.add_experimental_option(
  282. 'debuggerAddress', '127.0.0.1:{}'.format(port))
  283. driver = Chrome(
  284. options=options, desired_capabilities=desired_capabilities)
  285. driver.set_window_position(0, 0)
  286. driver.set_window_size(700, 600)
  287. return driver
  288. if __name__=='__main__':
  289. outlook_register = OutlookRegister()
  290. outlook_register.run()