|
@@ -10,7 +10,15 @@
|
|
|
from outlook_muti_register.register import Register
|
|
|
from . import generate_email
|
|
|
import os,sys,re,time,logging,random,requests,threading,queue,datetime
|
|
|
-from selenium import webdriver
|
|
|
+import json
|
|
|
+import schedule
|
|
|
+import tempfile
|
|
|
+
|
|
|
+from selenium.common.exceptions import NoSuchElementException, ElementNotInteractableException
|
|
|
+from selenium.webdriver import DesiredCapabilities, Chrome, ChromeOptions
|
|
|
+from datetime import datetime
|
|
|
+from random import randrange, choice
|
|
|
+from selenium.webdriver.common import utils
|
|
|
|
|
|
class OutlookRegister(Register):
|
|
|
'''outlook register'''
|
|
@@ -46,8 +54,8 @@ class OutlookRegister(Register):
|
|
|
if datetime.now().minute == 10 or consecutive_fail_number > 10:
|
|
|
break
|
|
|
print('Proxy: {}://{}'.format(tp, ip_port))
|
|
|
- driver = create_driver(tp, ip_port)
|
|
|
- register_success = start_register(driver)
|
|
|
+ driver = self.create_driver(tp, ip_port)
|
|
|
+ register_success = self.start_register(driver)
|
|
|
driver.close()
|
|
|
if register_success:
|
|
|
consecutive_fail_number = 0
|
|
@@ -78,6 +86,241 @@ class OutlookRegister(Register):
|
|
|
'''register email'''
|
|
|
pass
|
|
|
|
|
|
+
|
|
|
+ # verification code Identification settings
|
|
|
+ code_url = 'http://apigateway.jianjiaoshuju.com/api/v_1/yzmCustomized.html'
|
|
|
+ code_headers = {
|
|
|
+ 'appCode': 'X',
|
|
|
+ 'appKey': 'X',
|
|
|
+ 'appSecret': 'X'
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ last_image_data = ''
|
|
|
+ last_code = ''
|
|
|
+
|
|
|
+ def find_element_by_css_selector(driver, css_selector):
|
|
|
+ try:
|
|
|
+ time.sleep(0.1)
|
|
|
+ return driver.find_element_by_css_selector(css_selector)
|
|
|
+ except Exception:
|
|
|
+ time.sleep(check_timeout)
|
|
|
+ return find_element_by_css_selector(driver, css_selector)
|
|
|
+
|
|
|
+
|
|
|
+ def find_elements_by_css_selector(driver, css_selector):
|
|
|
+ try:
|
|
|
+ time.sleep(0.1)
|
|
|
+ return driver.find_elements_by_css_selector(css_selector)
|
|
|
+ except Exception:
|
|
|
+ time.sleep(check_timeout)
|
|
|
+ return find_elements_by_css_selector(driver, css_selector)
|
|
|
+
|
|
|
+
|
|
|
+ def find_element_by_link_text(driver, link_text):
|
|
|
+ try:
|
|
|
+ time.sleep(0.1)
|
|
|
+ return driver.find_element_by_link_text(link_text)
|
|
|
+ except Exception:
|
|
|
+ time.sleep(check_timeout)
|
|
|
+ return find_element_by_link_text(driver, link_text)
|
|
|
+
|
|
|
+
|
|
|
+ def find_elements_by_tag_name(driver, tag_name, target_number=None, try_times=None):
|
|
|
+ time.sleep(0.1)
|
|
|
+ if try_times <= 0:
|
|
|
+ raise Exception('Can not find element.')
|
|
|
+ if try_times is not None:
|
|
|
+ try_times -= 1
|
|
|
+ try:
|
|
|
+ l = driver.find_elements_by_tag_name(tag_name)
|
|
|
+ if target_number is None:
|
|
|
+ return l
|
|
|
+ if len(l) == target_number:
|
|
|
+ return l
|
|
|
+ else:
|
|
|
+ time.sleep(check_timeout)
|
|
|
+ return find_elements_by_tag_name(driver, tag_name, target_number, try_times)
|
|
|
+ except Exception:
|
|
|
+ time.sleep(check_timeout)
|
|
|
+ return find_elements_by_tag_name(driver, tag_name, target_number, try_times)
|
|
|
+
|
|
|
+
|
|
|
+ def find_element_by_tag_name(driver, tag_name):
|
|
|
+ try:
|
|
|
+ time.sleep(0.1)
|
|
|
+ return driver.find_element_by_tag_name(tag_name)
|
|
|
+ except Exception:
|
|
|
+ time.sleep(check_timeout)
|
|
|
+ return find_element_by_tag_name(driver, tag_name)
|
|
|
+
|
|
|
+
|
|
|
+ def get_code(img_data):
|
|
|
+ global last_image_data
|
|
|
+ global last_code
|
|
|
+ if last_image_data == img_data:
|
|
|
+ return last_code
|
|
|
+ last_image_data = img_data
|
|
|
+ data = {
|
|
|
+ 'v_pic': img_data,
|
|
|
+ 'pri_id': 'ne',
|
|
|
+ }
|
|
|
+
|
|
|
+ response = requests.post(code_url, headers=code_headers, data=data)
|
|
|
+ code = json.loads(response.text)['v_code']
|
|
|
+ last_code = code
|
|
|
+ print('code is {}'.format(code))
|
|
|
+ return code
|
|
|
+
|
|
|
+ def register_email(driver, email, password):
|
|
|
+ driver.get(url)
|
|
|
+ time.sleep(check_timeout*2)
|
|
|
+ sleep_timess = 0
|
|
|
+ while True:
|
|
|
+ try:
|
|
|
+ driver.find_element_by_css_selector('#liveSwitch').click()
|
|
|
+ break
|
|
|
+ except Exception:
|
|
|
+ time.sleep(check_timeout)
|
|
|
+ sleep_timess += 1
|
|
|
+ if sleep_timess > 10:
|
|
|
+ return False
|
|
|
+ while True:
|
|
|
+ try:
|
|
|
+ find_element_by_css_selector(driver, '#MemberName').clear()
|
|
|
+ find_element_by_css_selector(
|
|
|
+ driver, '#MemberName').send_keys(email)
|
|
|
+ find_element_by_css_selector(driver, '#iSignupAction').click()
|
|
|
+ break
|
|
|
+ except Exception as e:
|
|
|
+ time.sleep(check_timeout)
|
|
|
+ sleep_timess = 0
|
|
|
+ while driver.title != 'Create a password' and driver.title != '创建密码':
|
|
|
+ time.sleep(check_timeout)
|
|
|
+ sleep_timess += 1
|
|
|
+ if sleep_timess > 15:
|
|
|
+ return 'exist'
|
|
|
+ find_element_by_css_selector(
|
|
|
+ driver, '#PasswordInput').send_keys(password)
|
|
|
+ find_element_by_css_selector(driver, '#iOptinEmail').click()
|
|
|
+ find_element_by_css_selector(driver, '#iSignupAction').click()
|
|
|
+ time.sleep(check_timeout)
|
|
|
+ find_element_by_css_selector(
|
|
|
+ driver, '#LastName').send_keys(choice(name_list))
|
|
|
+ find_element_by_css_selector(
|
|
|
+ driver, '#FirstName').send_keys(choice(name_list))
|
|
|
+ find_element_by_css_selector(driver, '#iSignupAction').click()
|
|
|
+ time.sleep(check_timeout)
|
|
|
+ find_element_by_css_selector(
|
|
|
+ driver, '#BirthYear option:nth-child({})'.format(randrange(2, 25))).click()
|
|
|
+ find_element_by_css_selector(
|
|
|
+ driver, '#BirthMonth option:nth-child({})'.format(randrange(2, 11))).click()
|
|
|
+ find_element_by_css_selector(
|
|
|
+ driver, '#BirthDay option:nth-child({})'.format(randrange(2, 22))).click()
|
|
|
+ find_element_by_css_selector(driver, '#iSignupAction').click()
|
|
|
+ time.sleep(check_timeout)
|
|
|
+ t_url = driver.current_url
|
|
|
+ try:
|
|
|
+ while True:
|
|
|
+ code_element = find_elements_by_tag_name(driver, 'input', 5, 2)[0]
|
|
|
+ code_element.clear()
|
|
|
+ code_element.send_keys(
|
|
|
+ get_code(
|
|
|
+ find_elements_by_tag_name(
|
|
|
+ driver, 'img', 5, 2
|
|
|
+ )[-1].screenshot_as_base64
|
|
|
+ )
|
|
|
+ )
|
|
|
+ find_element_by_css_selector(driver, '#iSignupAction').click()
|
|
|
+ time.sleep(check_timeout)
|
|
|
+ try_times = 0
|
|
|
+ while t_url == driver.current_url:
|
|
|
+ time.sleep(check_timeout)
|
|
|
+ try:
|
|
|
+ driver.find_element_by_css_selector(
|
|
|
+ '#iSignupAction').click()
|
|
|
+ except Exception:
|
|
|
+ pass
|
|
|
+ try_times += 1
|
|
|
+ if try_times > 8:
|
|
|
+ break
|
|
|
+ if t_url != driver.current_url:
|
|
|
+ return True
|
|
|
+ except Exception as e:
|
|
|
+ print(e)
|
|
|
+ return False
|
|
|
+
|
|
|
+
|
|
|
+ def get_email_password():
|
|
|
+ def _get_random_sign():
|
|
|
+ return choice(sign_list)
|
|
|
+
|
|
|
+ def _get_random_char(is_low=None):
|
|
|
+ if is_low is None:
|
|
|
+ r = randrange(0, 2)
|
|
|
+ elif is_low is True:
|
|
|
+ r = 0
|
|
|
+ else:
|
|
|
+ r = 1
|
|
|
+
|
|
|
+ if r == 0:
|
|
|
+ return chr(randrange(65, 91))
|
|
|
+ else:
|
|
|
+ return chr(randrange(97, 123))
|
|
|
+
|
|
|
+ email = str(randrange(0, 10)).join(_get_random_char() for i in range(5))
|
|
|
+ password = (
|
|
|
+ str(randrange(0, 100)) + _get_random_sign()
|
|
|
+ ).join(
|
|
|
+ _get_random_char(True) + _get_random_char() + _get_random_char(False) for i in range(3)
|
|
|
+ )
|
|
|
+ return email, password
|
|
|
+
|
|
|
+
|
|
|
+ def start_register(driver):
|
|
|
+ email, password = get_email_password()
|
|
|
+ result = register_email(driver, email, password)
|
|
|
+ while result == 'exist':
|
|
|
+ print('Already Register Account {}@outlook.com'.format(email))
|
|
|
+ email, password = get_email_password()
|
|
|
+ result = register_email(driver, email, password)
|
|
|
+
|
|
|
+ if result:
|
|
|
+ sleep_times = 0
|
|
|
+ while 'account.microsoft.com' not in driver.current_url:
|
|
|
+ sleep_times += 1
|
|
|
+ time.sleep(check_timeout)
|
|
|
+ if sleep_times >= 20:
|
|
|
+ break
|
|
|
+ if sleep_times >= 10:
|
|
|
+ print('waiting time too long')
|
|
|
+ else:
|
|
|
+ with open('pass.txt', 'a+') as f:
|
|
|
+ f.write(email + '@outlook.com ' + password + '\n')
|
|
|
+ print('Success Register Account {}@outlook.com'.format(email))
|
|
|
+ return True
|
|
|
+ else:
|
|
|
+ print('Fail')
|
|
|
+ return False
|
|
|
+
|
|
|
+
|
|
|
+ def create_driver(tp, ip_port):
|
|
|
+ port = utils.free_port()
|
|
|
+ options = ChromeOptions()
|
|
|
+ desired_capabilities = DesiredCapabilities().CHROME
|
|
|
+ desired_capabilities['pageLoadStrategy'] = 'none'
|
|
|
+ os.popen(
|
|
|
+ 'chrome.exe --remote-debugging-port={} --user-data-dir={} --proxy-server={}={}'.format(
|
|
|
+ port, tempfile.mkdtemp(), tp, ip_port)
|
|
|
+ )
|
|
|
+ options.add_experimental_option(
|
|
|
+ 'debuggerAddress', '127.0.0.1:{}'.format(port))
|
|
|
+ driver = Chrome(
|
|
|
+ options=options, desired_capabilities=desired_capabilities)
|
|
|
+ driver.set_window_position(0, 0)
|
|
|
+ driver.set_window_size(700, 600)
|
|
|
+ return driver
|
|
|
+
|
|
|
if __name__=='__main__':
|
|
|
outlook_register = OutlookRegister()
|
|
|
outlook_register.run()
|