如何终止全部代码并回到循环开头?Selenium注册账号超时问题
问题描述
用Selenium批量注册游戏账号,调用手机号租赁API获取验证码,但部分号码因用户过多无法正常接收。通过if/elif逻辑实现验证码自动填充,需要在90秒后如果status仍为0,终止当前账号的注册流程,回到for循环处理下一个账号,但使用return仅能终止input_phone_number函数,无法中断整个流程。
尝试的代码
def input_phone_number(): while True: try: status_code = requests.get(f'https://api.viotp.com/session/getv2?requestId={request_id}&token={token}') code_data = status_code.json()['data'] status = code_data['Status'] code = code_data['Code'] if status == 0: sleep(5) elif status == 1: # Locate the element with the CSS selector '#code' and send the code as keyboard input driver.find_element(By.CSS_SELECTOR, '#code').send_keys(code) break if time.time() - start_time > 90: driver.close() return
原始代码
for index, row in df.iterrows(): Firstname = row['Fname'] Lastname = row['Lname'] Username = row['Username'] Password = row['Password'] def open_url(): #code def input_information(): #code def input_phone_number(): response = requests.get(f'https://api.viotp.com/request/getv2?token={token}&serviceId=3') data = response.json()['data'] number = data['phone_number'] balance = data['balance'] print('Phone Number:', number, '|', 'Balance:', balance) sleep(3) WebDriverWait(driver, 20).until( EC.presence_of_element_located((By.CSS_SELECTOR, '#phoneNumberId')) ) driver.find_element(By.CSS_SELECTOR, '#phoneNumberId').send_keys(number) sleep(3) driver.find_element(By.CSS_SELECTOR, '#view_container > div > div > div.pwWryf.bxPAYd > div > div.zQJV3 > div > div.qhFLie > div > div > button > span').click() request_id = data['request_id'] status = 0 while status != 1: status_code = requests.get(f'https://api.viotp.com/session/getv2?requestId={request_id}&token={token}') code_data = status_code.json()['data'] code = code_data['Code'] status = code_data['Status'] if status == 0: sleep(5) # Sleep for 5 seconds before repeating the request elif status == 1: # Locate the element with the CSS selector '#code' and send the code as keyboard input driver.find_element(By.CSS_SELECTOR, '#code').send_keys(code) sleep(3) driver.find_element(By.CSS_SELECTOR, '#view_container > div > div > div.pwWryf.bxPAYd > div > div.zQJV3 > div > div.qhFLie > div > div > button > span').click() def input_birthdate(): #code open_url() input_information() input_phone_number() input_birthdate()
解决方案
提供两种可靠实现方式:
方式1:自定义异常中断流程
通过抛出自定义异常,在for循环中捕获并跳过当前迭代,直接处理下一个账号。
步骤1:定义自定义异常
class VerificationTimeoutError(Exception): pass
步骤2:修改input_phone_number函数
添加超时判断,超时后抛出异常:
def input_phone_number(): start_time = time.time() response = requests.get(f'https://api.viotp.com/request/getv2?token={token}&serviceId=3') data = response.json()['data'] number = data['phone_number'] balance = data['balance'] print('Phone Number:', number, '|', 'Balance:', balance) sleep(3) WebDriverWait(driver, 20).until( EC.presence_of_element_located((By.CSS_SELECTOR, '#phoneNumberId')) ) driver.find_element(By.CSS_SELECTOR, '#phoneNumberId').send_keys(number) sleep(3) driver.find_element(By.CSS_SELECTOR, '#view_container > div > div > div.pwWryf.bxPAYd > div > div.zQJV3 > div > div.qhFLie > div > div > button > span').click() request_id = data['request_id'] status = 0 while status != 1: # 检查是否超时 if time.time() - start_time > 90: driver.close() raise VerificationTimeoutError("验证码等待超时,终止当前账号注册") status_code = requests.get(f'https://api.viotp.com/session/getv2?requestId={request_id}&token={token}') code_data = status_code.json()['data'] code = code_data['Code'] status = code_data['Status'] if status == 0: sleep(5) elif status == 1: driver.find_element(By.CSS_SELECTOR, '#code').send_keys(code) break sleep(3) driver.find_element(By.CSS_SELECTOR, '#view_container > div > div > div.pwWryf.bxPAYd > div > div.zQJV3 > div > div.qhFLie > div > div > button > span').click()
步骤3:修改for循环逻辑
捕获异常,跳过当前账号:
# 先定义自定义异常 class VerificationTimeoutError(Exception): pass for index, row in df.iterrows(): Firstname = row['Fname'] Lastname = row['Lname'] Username = row['Username'] Password = row['Password'] def open_url(): # 你的原有代码 pass def input_information(): # 你的原有代码 pass def input_phone_number(): # 上面修改后的函数代码 ... def input_birthdate(): # 你的原有代码 pass try: open_url() input_information() input_phone_number() input_birthdate() except VerificationTimeoutError as e: print(e) # 重新初始化driver,避免影响下一次注册 driver = webdriver.Chrome() # 根据你的实际浏览器驱动调整 continue # 直接进入下一次循环,处理下一个账号
方式2:返回状态标记
让input_phone_number返回布尔值标记是否成功,在for循环中根据返回值判断是否终止当前流程。
步骤1:修改input_phone_number函数
def input_phone_number(): start_time = time.time() response = requests.get(f'https://api.viotp.com/request/getv2?token={token}&serviceId=3') data = response.json()['data'] number = data['phone_number'] balance = data['balance'] print('Phone Number:', number, '|', 'Balance:', balance) sleep(3) WebDriverWait(driver, 20).until( EC.presence_of_element_located((By.CSS_SELECTOR, '#phoneNumberId')) ) driver.find_element(By.CSS_SELECTOR, '#phoneNumberId').send_keys(number) sleep(3) driver.find_element(By.CSS_SELECTOR, '#view_container > div > div > div.pwWryf.bxPAYd > div > div.zQJV3 > div > div.qhFLie > div > div > button > span').click() request_id = data['request_id'] status = 0 while status != 1: if time.time() - start_time > 90: driver.close() return False # 返回False表示超时失败 status_code = requests.get(f'https://api.viotp.com/session/getv2?requestId={request_id}&token={token}') code_data = status_code.json()['data'] code = code_data['Code'] status = code_data['Status'] if status == 0: sleep(5) elif status == 1: driver.find_element(By.CSS_SELECTOR, '#code').send_keys(code) break sleep(3) driver.find_element(By.CSS_SELECTOR, '#view_container > div > div > div.pwWryf.bxPAYd > div > div.zQJV3 > div > div.qhFLie > div > div > button > span').click() return True # 返回True表示成功
步骤2:修改for循环逻辑
for index, row in df.iterrows(): Firstname = row['Fname'] Lastname = row['Lname'] Username = row['Username'] Password = row['Password'] def open_url(): # 你的原有代码 pass def input_information(): # 你的原有代码 pass def input_phone_number(): # 上面修改后的函数代码 ... def input_birthdate(): # 你的原有代码 pass open_url() input_information() success = input_phone_number() if not success: # 重新初始化driver driver = webdriver.Chrome() continue input_birthdate()
注意事项
- 超时后必须确保driver被正确关闭或重新初始化,避免残留浏览器进程占用资源。
- 建议给API请求添加异常捕获(如
requests.exceptions.RequestException),防止网络波动导致程序崩溃。
内容的提问来源于stack exchange,提问作者Tái Hoảng
相关产品推荐
相关产品推荐

