You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何终止全部代码并回到循环开头?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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 11:55:25