├── README.md ├── Sunset ├── utilities │ ├── cmd.py │ ├── log.py │ ├── proxy.py │ ├── color.py │ ├── assets.py │ ├── account.py │ ├── install.py │ ├── chrome.py │ └── config.py ├── requirements.cmd ├── assets │ ├── config.json │ └── banners.json └── main.py └── LICENSE /README.md: -------------------------------------------------------------------------------- 1 | # Sunset 2 | Free and open source Microsoft/Outlook account generator. 3 | -------------------------------------------------------------------------------- /Sunset/utilities/cmd.py: -------------------------------------------------------------------------------- 1 | import os 2 | 3 | def do(commands): 4 | for command in commands: 5 | os.system(command) 6 | -------------------------------------------------------------------------------- /Sunset/requirements.cmd: -------------------------------------------------------------------------------- 1 | python -m pip install selenium 2 | python -m pip install colorama 3 | python -m pip install requests 4 | python -m pip install pywin32 5 | -------------------------------------------------------------------------------- /Sunset/assets/config.json: -------------------------------------------------------------------------------- 1 | {"account-file-directory": "default", "account-file-name": "default", "account-file-extension": "default", "account-domain-name": "default"} 2 | -------------------------------------------------------------------------------- /Sunset/utilities/log.py: -------------------------------------------------------------------------------- 1 | from random import randint 2 | import os 3 | 4 | def crash(data): 5 | if not os.path.exists("crashlogs"): 6 | os.mkdir("crashlogs") 7 | 8 | with open(f"crashlogs/crash-{randint(100000, 999999)}.log", "w+") as crash: 9 | crash.write(str(data)) 10 | crash.close() 11 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2022 b8ff 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /Sunset/utilities/proxy.py: -------------------------------------------------------------------------------- 1 | from utilities import color 2 | import requests 3 | 4 | class data: 5 | enabled = False 6 | check = False 7 | current = 0 8 | list = [] 9 | 10 | def parse_proxies(): 11 | with open("proxies.txt") as proxies_file: 12 | data.list = proxies_file.readlines() 13 | proxies_file.close() 14 | 15 | if data.check: 16 | color.print_("light_black", "\nChecking proxies...") 17 | for proxy in data.list: 18 | try: 19 | requests.get("https://account.microsoft.com/account?lang=en-en", proxies={ 20 | "https" : proxy 21 | }, timeout=5) 22 | except: 23 | data.list.remove(proxy) 24 | 25 | good_proxies = len(data.list) 26 | if good_proxies == 0: 27 | data.enabled = False 28 | 29 | phrase = f"Found {good_proxies} good proxy!" 30 | if good_proxies > 1 or good_proxies == 0: 31 | phrase = f"Found {good_proxies} good proxies!" 32 | 33 | color.print_("light_black", phrase) 34 | -------------------------------------------------------------------------------- /Sunset/utilities/color.py: -------------------------------------------------------------------------------- 1 | from colorama import Fore 2 | 3 | colors = { 4 | "white" : Fore.WHITE, 5 | "black" : Fore.BLACK, 6 | "blue" : Fore.BLUE, 7 | "cyan" : Fore.CYAN, 8 | "green" : Fore.GREEN, 9 | "magenta" : Fore.MAGENTA, 10 | "red" : Fore.RED, 11 | "yellow" : Fore.YELLOW, 12 | 13 | "light_white" : Fore.LIGHTWHITE_EX, 14 | "light_black" : Fore.LIGHTBLACK_EX, 15 | "light_blue" : Fore.LIGHTBLUE_EX, 16 | "light_cyan" : Fore.LIGHTCYAN_EX, 17 | "light_green" : Fore.LIGHTGREEN_EX, 18 | "light_magenta" : Fore.LIGHTMAGENTA_EX, 19 | "light_red" : Fore.LIGHTRED_EX, 20 | "light_yellow" : Fore.LIGHTYELLOW_EX, 21 | } 22 | history = [] 23 | 24 | def load_history(): 25 | for batch in history: 26 | print(colors[batch[0]] + batch[1] + Fore.RESET) 27 | 28 | def print_(color, message, save=True): 29 | print(colors[color] + message + Fore.RESET) 30 | if save: 31 | history.append([color, message]) 32 | 33 | def input_(color, message, save=True): 34 | data = input(colors[color] + message + Fore.RESET) 35 | if save: 36 | history.append([color, message + Fore.RESET + data]) 37 | return data 38 | -------------------------------------------------------------------------------- /Sunset/utilities/assets.py: -------------------------------------------------------------------------------- 1 | from datetime import datetime 2 | import shutil 3 | import json 4 | 5 | date = datetime.now() 6 | day, month, year = date.day, date.month, date.year 7 | console_columns = shutil.get_terminal_size().columns 8 | 9 | def get_banner(banners_file): 10 | loaded_banners = json.load(open(banners_file, encoding="utf-8")) 11 | banner = "" 12 | 13 | if day == 25 and month == 12: 14 | parts = loaded_banners["christmas"].splitlines() 15 | elif day == 31 and month == 10: 16 | parts = loaded_banners["halloween"].splitlines() 17 | elif day == 1 and month == 1: 18 | parts = loaded_banners["new-year"].splitlines() 19 | else: 20 | parts = loaded_banners["default"].splitlines() 21 | 22 | for part in parts: 23 | banner = banner + part.center(console_columns) + "\n" 24 | 25 | return banner 26 | 27 | def get_config_banner(banners_file): 28 | loaded_banners = json.load(open(banners_file, encoding="utf-8")) 29 | banner = "" 30 | 31 | parts = loaded_banners["config"].splitlines() 32 | 33 | for part in parts: 34 | banner = banner + part.center(console_columns) + "\n" 35 | 36 | return banner 37 | -------------------------------------------------------------------------------- /Sunset/utilities/account.py: -------------------------------------------------------------------------------- 1 | from string import digits, punctuation, ascii_letters 2 | from random import randint, sample, choice 3 | import os 4 | 5 | def generate_credentials(domain): 6 | account = {} 7 | 8 | holder = ( 9 | "".join(sample(ascii_letters, randint(5, 6))), 10 | "".join(sample(ascii_letters, randint(5, 6))) 11 | ) 12 | if domain == "default": 13 | domain = "outlook" 14 | account["email"] = f"{holder[0]}{holder[1]}@{domain}.com" 15 | 16 | account["password"] = "".join(sample(ascii_letters + digits + punctuation, 10)) 17 | 18 | account["country"] = choice(["United States", "United Kingdom", "Canada", "Australia", "Ireland"]) 19 | 20 | account["birthmonth"] = choice(["May", "October", "January", "March", "July", "August", "December"]) 21 | account["birthday"] = randint(1, 31) 22 | account["birthyear"] = randint(2000, 2004) 23 | 24 | return account 25 | 26 | def save(credentials, directory, file_name, extension): 27 | if directory == "default": 28 | directory = os.getcwdb().decode() + "\\" 29 | if file_name == "default": 30 | file_name = "sunset_accounts" 31 | if extension == "default": 32 | extension = ".txt" 33 | account_directory = f"{directory}{file_name}{extension}" 34 | 35 | if os.path.exists(account_directory): 36 | with open(account_directory, "r") as previous_account: 37 | start_of_file = previous_account.read() 38 | previous_account.close 39 | else: 40 | start_of_file = "Accounts generated with Sunset!" 41 | 42 | with open(account_directory, "w+") as account_file: 43 | account_file.write(f"{start_of_file}\n\nEmail : " + credentials["email"] + "\nPassword : " + credentials["password"]) 44 | account_file.close() 45 | -------------------------------------------------------------------------------- /Sunset/utilities/install.py: -------------------------------------------------------------------------------- 1 | from utilities import log 2 | import requests 3 | import zipfile 4 | import os 5 | 6 | def sunset(): 7 | try: 8 | appdata = os.getenv("appdata") 9 | if not os.path.exists(f"{appdata}/Sunset"): 10 | main_folder = f"{appdata}/Sunset" 11 | os.mkdir(main_folder) 12 | os.mkdir(f"{main_folder}/drivers") 13 | 14 | if not os.path.exists("proxies.txt"): 15 | with open("proxies.txt", "w+") as proxies: 16 | proxies.close() 17 | except Exception as data: 18 | log.crash(data) 19 | exit() 20 | 21 | def driver(driver_version): 22 | try: 23 | drivers_folder = os.getenv("appdata") + "/Sunset/drivers" 24 | for file in os.listdir(drivers_folder): 25 | if file.replace(".exe", "") != driver_version: 26 | os.remove(f"{drivers_folder}/{file}") 27 | 28 | if os.path.exists(f"{drivers_folder}/{driver_version}.exe"): 29 | return 30 | 31 | request = requests.get(f"https://chromedriver.storage.googleapis.com/{driver_version}/chromedriver_win32.zip") 32 | if not request.ok: 33 | log.crash("could not download driver") 34 | exit() 35 | 36 | zipped_driver_directory = f"{drivers_folder}/driver.zip" 37 | with open(zipped_driver_directory, "wb") as zipped_driver: 38 | zipped_driver.write(request.content) 39 | zipped_driver.close() 40 | with zipfile.ZipFile(zipped_driver_directory,"r") as zipped_driver: 41 | zipped_driver.extractall(drivers_folder) 42 | os.remove(zipped_driver_directory) 43 | if os.path.exists(f"{drivers_folder}/LICENSE.chromedriver"): 44 | os.remove(f"{drivers_folder}/LICENSE.chromedriver") 45 | os.rename(f"{drivers_folder}/chromedriver.exe", f"{drivers_folder}/{driver_version}.exe") 46 | except Exception as data: 47 | log.crash(data) 48 | exit() 49 | -------------------------------------------------------------------------------- /Sunset/utilities/chrome.py: -------------------------------------------------------------------------------- 1 | from selenium.webdriver.common.proxy import Proxy, ProxyType 2 | from selenium.webdriver.support import expected_conditions 3 | from selenium.webdriver.support.wait import WebDriverWait 4 | from selenium.webdriver.common.by import By 5 | from win32api import GetSystemMetrics 6 | from selenium import webdriver 7 | from utilities import ( 8 | proxy, 9 | log, 10 | ) 11 | import os 12 | 13 | def start(driver_version): 14 | driver_directory = os.getenv("appdata") + f"/Sunset/drivers/{driver_version}.exe" 15 | 16 | driver_options = webdriver.ChromeOptions() 17 | driver_options.add_argument("--log-level=OFF") 18 | driver_options.add_experimental_option("prefs", { 19 | "credentials_enable_service" : False, 20 | "profile.password_manager_enabled" : False 21 | }) 22 | driver_options.add_experimental_option("excludeSwitches", ["enable-logging"]) 23 | 24 | if len(proxy.data.list) != 0 and proxy.data.enabled: 25 | proxy_server = proxy.data.list[proxy.data.current] 26 | driver_options.add_argument(f"--proxy-server={proxy_server}") 27 | 28 | size = (450, 600) 29 | position = (round(GetSystemMetrics(0) / 2 - size[0] / 2), round(GetSystemMetrics(1) / 2 - size[1] / 2)) 30 | 31 | try: 32 | driver = webdriver.Chrome(executable_path=driver_directory, options=driver_options) 33 | except Exception as data: 34 | log.crash(data) 35 | exit() 36 | driver.set_window_position(position[0], position[1]) 37 | driver.set_window_size(size[0], size[1]) 38 | 39 | return driver 40 | 41 | def wait_for_element(driver, id): 42 | try: 43 | return WebDriverWait(driver, 60).until(expected_conditions.visibility_of_element_located((By.ID, id))) 44 | except Exception as data: 45 | log.crash(data) 46 | exit() 47 | 48 | def is_displayed(driver, id): 49 | try: 50 | WebDriverWait(driver, 5).until(expected_conditions.visibility_of_element_located((By.ID, id))) 51 | return True 52 | except: 53 | return False 54 | -------------------------------------------------------------------------------- /Sunset/assets/banners.json: -------------------------------------------------------------------------------- 1 | { 2 | "config" : "______ ______ __ __ ______ __ ______\n/\\ ___\\ /\\ __ \\ /\\ \"-.\\ \\ /\\ ___\\/\\ \\ /\\ ___\\\n \\ \\ \\____\\ \\ \\/\\ \\\\ \\ \\-. \\\\ \\ __\\\\ \\ \\\\ \\ \\__ \\\n \\ \\_____\\\\ \\_____\\\\ \\_\\\\\"\\_\\\\ \\_\\ \\ \\_\\\\ \\_____\\\n \\/_____/ \\/_____/ \\/_/ \\/_/ \\/_/ \\/_/ \\/_____/", 3 | "default" : " ______ __ __ __ __ ______ ______ ______ \n/\\ ___\\ /\\ \\/\\ \\ /\\ \"-.\\ \\ /\\ ___\\ /\\ ___\\/\\__ _\\ \n\\ \\___ \\\\ \\ \\_\\ \\\\ \\ \\-. \\\\ \\___ \\\\ \\ __\\\\/_/\\ \\/ \n \\/\\_____\\\\ \\_____\\\\ \\_\\\\\"\\_\\\\/\\_____\\\\ \\_____\\ \\ \\_\\ \n \\/_____/ \\/_____/ \\/_/ \\/_/ \\/_____/ \\/_____/ \\/_/ \n", 4 | "christmas" : "_==_ _ ______ __ __ __ __ ______ ______ ______ _ _==_\n _.(\".)|_| /\\ ___\\ /\\ \\/\\ \\ /\\ \"-.\\ \\ /\\ ___\\ /\\ ___\\/\\__ _\\ |_|(.\")._ \n \\/. \\-| \\ \\___ \\\\ \\ \\_\\ \\\\ \\ \\-. \\\\ \\___ \\\\ \\ __\\\\/_/\\ \\/ |-/ .\\/ \n__( : )|_ \\/\\_____\\\\ \\_____\\\\ \\_\\\\\"\\_\\\\/\\_____\\\\ \\_____\\ \\ \\_\\ _|( : )__\n########## \\/_____/ \\/_____/ \\/_/ \\/_/ \\/_____/ \\/_____/ \\/_/ ##########\n!!! Merry Christmas !!!", 5 | "halloween" : " ██████ █ ██ ███▄ █ ██████ ▓█████▄▄▄█████▓\n/\\ /\\ ▒██ ▒ ██ ▓██▒ ██ ▀█ █ ▒██ ▒ ▓█ ▀▓ ██▒ ▓▒ /\\ /\\\n/ \\'._ (\\_/) _.'/ \\ ░ ▓██▄ ▓██ ▒██░▓██ ▀█ ██▒░ ▓██▄ ▒███ ▒ ▓██░ ▒░ / \\'._ (\\_/) _.'/ \\\n|.''._'--(o.o)--'_.''.| ▒ ██▒▓▓█ ░██░▓██▒ ▐▌██▒ ▒ ██▒▒▓█ ▄░ ▓██▓ ░ |.''._'--(o.o)--'_.''.|\n\\_ / `;=/ \" \\=;` \\ _/ ▒██████▒▒▒▒█████▓ ▒██░ ▓██░▒██████▒▒░▒████▒ ▒██▒ ░ \\_ / `;=/ \" \\=;` \\ _/\n`\\__| \\___/ |__/` ▒ ▒▓▒ ▒ ░░▒▓▒ ▒ ▒ ░ ▒░ ▒ ▒ ▒ ▒▓▒ ▒ ░░░ ▒░ ░ ▒ ░░ `\\__| \\___/ |__/`\n\\(_|_)/ ░ ░▒ ░ ░░░▒░ ░ ░ ░ ░░ ░ ▒░░ ░▒ ░ ░ ░ ░ ░ ░ \\(_|_)/\n\" ` \" ░ ░ ░ ░░░ ░ ░ ░ ░ ░ ░ ░ ░ ░ ░ \" ` \"\n░ ░ ░ ░ ░ ░\n!!!Happy Halloween!!!", 6 | "new-year" : ". .\n.' | | '.\n.' | ______ __ __ __ __ ______ ______ ______ | '.\n/`-._' /\\ ___\\ /\\ \\/\\ \\ /\\ \"-.\\ \\ /\\ ___\\ /\\ ___\\/\\__ _\\ '_.-`\\\n/ / \\ \\___ \\\\ \\ \\_\\ \\\\ \\ \\-. \\\\ \\___ \\\\ \\ __\\\\/_/\\ \\/ \\ \\\n/ / \\/\\_____\\\\ \\_____\\\\ \\_\\\\\"\\_\\\\/\\_____\\\\ \\_____\\ \\ \\_\\ \\ \\\n/ / \\/_____/ \\/_____/ \\/_/ \\/_/ \\/_____/ \\/_____/ \\/_/ \\ \\\n(`-./ \\.-`)\n) !!!Happy New Year!!! (\n' '" 7 | } 8 | -------------------------------------------------------------------------------- /Sunset/utilities/config.py: -------------------------------------------------------------------------------- 1 | from string import ascii_lowercase 2 | from utilities import color 3 | from time import sleep 4 | import json 5 | import os 6 | 7 | def edit(config_file, current_config, banner): 8 | animation = True 9 | while True: 10 | color.print_("light_blue", banner, save=False) 11 | if animation: 12 | sleep(1) 13 | 14 | new_config = current_config 15 | current_directory = new_config["account-file-directory"] 16 | current_file_name = new_config["account-file-name"] 17 | current_extension = new_config["account-file-extension"] 18 | current_domain = new_config["account-domain-name"] 19 | if current_directory == "default": 20 | current_directory = os.getcwdb().decode() + "\\" 21 | if current_file_name == "default": 22 | current_file_name = "sunset_accounts" 23 | if current_extension == "default": 24 | current_extension = ".txt" 25 | if current_domain == "default": 26 | current_domain = "outlook" 27 | color.print_("cyan", "\nConfig options :\n - back\n - account file directory : " + current_directory + "\n - account file name : " + current_file_name + "\n - account file extension : " + current_extension + "\n - account domain : " + current_domain, save=False) 28 | color.print_("cyan", "(1 = back, 2 = file directory, etc...)", save=False) 29 | 30 | if animation: 31 | sleep(.5) 32 | 33 | option = color.input_("yellow", "\nSelect an option : ", save=False) 34 | match option: 35 | case "1": 36 | break 37 | case "2": 38 | new_directory = color.input_("yellow", "New account file directory : ", save=False) 39 | 40 | if "\\" in new_directory and not new_directory.endswith("\\") and new_directory != "default": 41 | new_directory = f"{new_directory}\\" 42 | elif "/" in new_directory and not new_directory.endswith("/") and new_directory != "default": 43 | new_directory = f"{new_directory}/" 44 | 45 | if not os.path.exists(new_directory): 46 | new_directory = "default" 47 | 48 | new_config["account-file-directory"] = new_directory 49 | case "3": 50 | new_name = color.input_("yellow", "New account file name : ", save=False) 51 | 52 | invalid_new_name = False 53 | for blacklisted_character in ["<", ">", ":", "\"", "/", "\\", "|", "?", "*"]: 54 | if blacklisted_character in new_name: 55 | invalid_new_name = True 56 | break 57 | 58 | if new_name.replace(" ", "") == "" or invalid_new_name: 59 | new_name = "default" 60 | 61 | new_config["account-file-name"] = new_name 62 | case "4": 63 | new_extension = color.input_("yellow", "New account file extension : ", save=False).replace(" ", "") 64 | 65 | invalid_new_extension = False 66 | for blacklisted_character in ["<", ">", ":", "\"", "/", "\\", "|", "?", "*"]: 67 | if blacklisted_character in new_extension: 68 | invalid_new_extension = True 69 | break 70 | 71 | if new_extension == "" or invalid_new_extension: 72 | new_extension = "default" 73 | 74 | new_config["account-file-extension"] = new_extension 75 | case "5": 76 | new_domain = color.input_("yellow", "New account domain name : ", save=False).replace(" ", "") 77 | 78 | invalid_new_domain = False 79 | if new_domain not in ["outlook", "hotmail"]: 80 | invalid_new_domain = True 81 | 82 | if new_domain == "" or invalid_new_domain: 83 | new_domain = "default" 84 | 85 | new_config["account-domain-name"] = new_domain 86 | 87 | if animation: 88 | animation = False 89 | os.system("cls") 90 | 91 | with open(config_file, "w+") as config: 92 | config.write(json.dumps(new_config)) 93 | config.close() 94 | 95 | def load(config_file): 96 | loaded_config = json.load(open(config_file, encoding="utf-8")) 97 | return { 98 | "account-file-directory" : loaded_config["account-file-directory"], 99 | "account-file-name" : loaded_config["account-file-name"], 100 | "account-file-extension" : loaded_config["account-file-extension"], 101 | "account-domain-name" : loaded_config["account-domain-name"], 102 | } 103 | -------------------------------------------------------------------------------- /Sunset/main.py: -------------------------------------------------------------------------------- 1 | from utilities import ( 2 | install, 3 | account, 4 | config, 5 | chrome, 6 | assets, 7 | color, 8 | proxy, 9 | log, 10 | cmd, 11 | ) 12 | from msvcrt import getch 13 | from time import sleep 14 | import os 15 | 16 | class Sunset: 17 | def __init__(self): 18 | super(Sunset, self).__init__() 19 | 20 | self.driver_version = "112.0.5615.49" 21 | self.accounts_per_ip = None 22 | 23 | self.print = color.print_ 24 | self.input = color.input_ 25 | 26 | try: 27 | self.load() 28 | self.console() 29 | except Exception as data: 30 | log.crash(data) 31 | exit() 32 | 33 | def load(self): 34 | cmd.do(["title Sunset", "mode con: cols=120 lines=30", "cls"]) 35 | for _ in range(15): 36 | print() 37 | self.print("light_black", "loading...".center(120), save=False) 38 | for _ in range(14): 39 | print() 40 | 41 | install.sunset() 42 | install.driver(self.driver_version) 43 | 44 | def start(self): 45 | configuration = config.load("assets/config.json") 46 | while True: 47 | for _ in range(self.accounts_per_ip): 48 | if proxy.data.enabled and proxy.data.current == len(proxy.data.list): 49 | proxy.data.enabled = False 50 | self.print("light_black", "All proxies have been used, skipping cycle...\n") 51 | break 52 | 53 | credentials = account.generate_credentials(configuration["account-domain-name"]) 54 | driver = chrome.start(self.driver_version) 55 | 56 | driver.get("https://account.microsoft.com/account?lang=en-en") 57 | 58 | self.print("light_black", "Generating account...") 59 | if chrome.is_displayed(driver, "id__10"): 60 | chrome.wait_for_element(driver, "id__10").click() 61 | else: 62 | chrome.wait_for_element(driver, "createaccounthero").click() 63 | 64 | chrome.wait_for_element(driver, "MemberName").send_keys(credentials["email"]) 65 | chrome.wait_for_element(driver, "iSignupAction").click() 66 | 67 | chrome.wait_for_element(driver, "PasswordInput").send_keys(credentials["password"]) 68 | chrome.wait_for_element(driver, "iOptinEmail").click() 69 | chrome.wait_for_element(driver, "iSignupAction").click() 70 | 71 | entered_country, entered_age = False, False 72 | if chrome.is_displayed(driver, "Country"): 73 | chrome.wait_for_element(driver, "Country").send_keys(credentials["country"]) 74 | entered_country = True 75 | if chrome.is_displayed(driver, "BirthMonth"): 76 | chrome.wait_for_element(driver, "BirthMonth").send_keys(credentials["birthmonth"]) 77 | chrome.wait_for_element(driver, "BirthDay").send_keys(credentials["birthday"]) 78 | chrome.wait_for_element(driver, "BirthYear").send_keys(credentials["birthyear"]) 79 | entered_age = True 80 | if chrome.is_displayed(driver, "iSignupAction") and entered_country or entered_age: 81 | chrome.wait_for_element(driver, "iSignupAction").click() 82 | 83 | if chrome.is_displayed(driver, "wlspispHipControlButtonsContainer"): 84 | driver.quit() 85 | self.print("light_black", "Phone verification detected, skipping cycle...\n") 86 | break 87 | else: 88 | chrome.wait_for_element(driver, "enforcementFrame") 89 | self.print("light_black", "Complete the bot verification to continue...") 90 | 91 | chrome.wait_for_element(driver, "KmsiCheckboxField").click() 92 | chrome.wait_for_element(driver, "idBtn_Back").click() 93 | 94 | account.save(credentials, configuration["account-file-directory"], configuration["account-file-name"], configuration["account-file-extension"]) 95 | self.print("light_black", "Account generated and stored successfully!\n") 96 | 97 | driver.quit() 98 | sleep(1) 99 | 100 | cycle_phrase = "Finished generation cycle, once you have changed your IP press ENTER to resume or any other key to exit..." 101 | if proxy.data.enabled: 102 | cycle_phrase = "Finished generation cycle, once you're ready press ENTER to resume or any other key to exit..." 103 | proxy.data.current += 1 104 | self.print("yellow", cycle_phrase) 105 | print() 106 | 107 | pressed_key = getch() 108 | if pressed_key.lower() != b"\r": 109 | break 110 | exit() 111 | 112 | def console(self): 113 | cmd.do(["cls"]) 114 | self.print("light_blue", assets.get_banner("assets/banners.json")) 115 | sleep(1) 116 | self.print("cyan", "\nWelcome to Sunset!\n") 117 | sleep(.25) 118 | 119 | if self.input("yellow", "Do you want to generate new Microsoft Accounts? (y, n) : ").lower().replace(" ", "") != "y": 120 | exit() 121 | 122 | if self.input("yellow", "Do you want to edit the current configuration? (y, n) : ").lower().replace(" ", "") == "y": 123 | cmd.do(["cls"]) 124 | config.edit("assets/config.json", config.load("assets/config.json"), assets.get_config_banner("assets/banners.json")) 125 | cmd.do(["cls"]) 126 | color.load_history() 127 | 128 | self.accounts_per_ip = int(self.input("yellow", "How many accounts do you want to generate per IP? (min 1, max 3) : ").lower().replace(" ", "")) 129 | if self.accounts_per_ip > 3: 130 | self.accounts_per_ip = 3 131 | elif self.accounts_per_ip < 1: 132 | self.accounts_per_ip = 1 133 | 134 | if os.path.exists("proxies.txt") and os.path.getsize("proxies.txt") != 0 and self.input("yellow", "Do you want to use proxies? (y, n) : ").lower().replace(" ", "") == "y": 135 | proxy.data.enabled = True 136 | if self.input("yellow", "Do you want check the proxies before using them? (y, n) : ").lower().replace(" ", "") == "y": 137 | proxy.data.check = True 138 | proxy.parse_proxies() 139 | 140 | self.print("cyan", "\nStarting... (if the captcha doesn't work change IP)\n") 141 | sleep(1) 142 | self.start() 143 | 144 | Sunset() 145 | --------------------------------------------------------------------------------