You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Selenium WebDriver亚马逊登录遇验证问题:如何处理双因素认证?

处理亚马逊Selenium登录双因素认证的实用方案

嘿,我之前也遇到过亚马逊这种烦人的双因素认证问题,尤其是用Selenium自动化登录的时候,要么触发邮件验证,要么明明账号密码正确却被提示错误。结合Java+ChromeDriver的场景,给你几个实用的解决方案:

1. 复用已信任的浏览器会话

亚马逊触发新设备验证的核心原因是检测到陌生的浏览器环境,所以我们可以让Selenium复用你手动登录过、已经被亚马逊信任的Chrome会话,这样就不会触发验证了。

具体步骤:

  • 先手动打开Chrome,登录你的亚马逊账号,确保完成过验证,账号处于信任状态
  • 关闭所有Chrome窗口(否则会出现会话冲突)
  • 在脚本中指定Chrome的用户数据目录,让Selenium使用这个已信任的会话

Java代码示例:

import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.chrome.ChromeOptions;

public class AmazonLoginTest {
    public static void main(String[] args) {
        ChromeOptions options = new ChromeOptions();
        // 替换成你自己的Chrome用户数据目录,Windows路径示例如下
        // 格式:C:\\Users\\你的用户名\\AppData\\Local\\Google\\Chrome\\User Data
        options.addArguments("user-data-dir=C:\\Users\\JohnDoe\\AppData\\Local\\Google\\Chrome\\User Data");
        
        WebDriver driver = new ChromeDriver(options);
        driver.get("https://www.amazon.com");
        
        // 此时应该已经处于登录状态,无需再次输入账号密码
    }
}

2. 自动提取并输入邮件验证码

如果必须处理验证流程(比如测试新设备登录场景),可以通过Java读取邮箱中的验证码,自动输入到验证页面。这里以Gmail为例,使用JavaMail API实现:

步骤1:引入JavaMail依赖

在你的pom.xml(Maven)中添加:

<dependency>
    <groupId>com.sun.mail</groupId>
    <artifactId>javax.mail</artifactId>
    <version>1.6.2</version>
</dependency>

步骤2:编写验证码提取与输入代码

import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import javax.mail.*;
import javax.mail.search.FromStringTerm;
import java.util.Arrays;
import java.util.Properties;

public class AmazonMfaHandler {
    public static void main(String[] args) throws Exception {
        WebDriver driver = new ChromeDriver();
        driver.get("https://www.amazon.com/ap/signin");
        
        // 先输入账号密码并提交
        driver.findElement(By.id("ap_email")).sendKeys("your-amazon-email@example.com");
        driver.findElement(By.id("continue")).click();
        driver.findElement(By.id("ap_password")).sendKeys("your-amazon-password");
        driver.findElement(By.id("signInSubmit")).click();
        
        // 等待跳转到验证页面(建议用显式等待代替Thread.sleep)
        Thread.sleep(5000);
        
        // 提取邮件验证码
        String verificationCode = getAmazonVerificationCode("your-email@gmail.com", "your-app-password");
        
        // 输入验证码并提交
        driver.findElement(By.id("auth-mfa-otpcode")).sendKeys(verificationCode);
        driver.findElement(By.id("auth-signin-button")).click();
    }

    private static String getAmazonVerificationCode(String email, String appPassword) throws Exception {
        Properties props = new Properties();
        props.setProperty("mail.store.protocol", "imaps");
        props.setProperty("mail.imaps.host", "imap.gmail.com");
        props.setProperty("mail.imaps.port", "993");
        props.setProperty("mail.imaps.ssl.enable", "true");

        Session session = Session.getInstance(props);
        Store store = session.getStore("imaps");
        // 注意:Gmail需要开启"应用专用密码",不能直接用原密码
        store.connect(email, appPassword);

        Folder inbox = store.getFolder("INBOX");
        inbox.open(Folder.READ_WRITE);

        // 搜索来自亚马逊的最新邮件
        Message[] messages = inbox.search(new FromStringTerm("no-reply@amazon.com"));
        // 按邮件发送时间倒序排序,取最新的一封
        Arrays.sort(messages, (m1, m2) -> m2.getSentDate().compareTo(m1.getSentDate()));

        if (messages.length > 0) {
            String content = getMessageText(messages[0]);
            // 用正则匹配6位数字验证码
            java.util.regex.Pattern pattern = java.util.regex.Pattern.compile("\\b\\d{6}\\b");
            java.util.regex.Matcher matcher = pattern.matcher(content);
            if (matcher.find()) {
                return matcher.group();
            }
        }
        throw new RuntimeException("未找到亚马逊验证码邮件");
    }

    private static String getMessageText(Message message) throws Exception {
        if (message.isMimeType("text/plain")) {
            return message.getContent().toString();
        } else if (message.isMimeType("multipart/*")) {
            Multipart multipart = (Multipart) message.getContent();
            for (int i = 0; i < multipart.getCount(); i++) {
                BodyPart part = multipart.getBodyPart(i);
                if (part.isMimeType("text/plain")) {
                    return part.getContent().toString();
                }
            }
        }
        return "";
    }
}

3. 优化脚本避免触发验证/错误提示

你遇到的“邮箱或密码错误”很可能不是真的账号问题,而是亚马逊检测到了Selenium的自动化特征,故意拦截。可以通过以下参数优化ChromeOptions,规避检测:

import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.chrome.ChromeOptions;
import java.util.Collections;

public class AntiDetectionSetup {
    public static void main(String[] args) {
        ChromeOptions options = new ChromeOptions();
        
        // 禁用自动化检测特征
        options.setExperimentalOption("excludeSwitches", Collections.singletonList("enable-automation"));
        options.setExperimentalOption("useAutomationExtension", false);
        options.addArguments("--disable-blink-features=AutomationControlled");
        
        // 设置和手动浏览器一致的User-Agent(可以复制你自己Chrome的User-Agent)
        options.addArguments("user-agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36");
        
        // 禁用不必要的弹窗和通知,模拟真实用户行为
        options.addArguments("--disable-notifications");
        options.addArguments("--disable-popup-blocking");
        options.addArguments("--start-maximized");
        
        WebDriver driver = new ChromeDriver(options);
        driver.get("https://www.amazon.com");
    }
}

额外注意事项

  • 不要频繁运行自动化脚本,避免被亚马逊判定为恶意行为导致账号受限
  • 如果是企业级测试,建议联系亚马逊官方获取测试环境账号,避免在生产环境触发验证机制
  • 邮箱的应用专用密码需要在邮箱设置中开启(比如Gmail需要开启两步验证后才能生成)

内容的提问来源于stack exchange,提问作者n3rdm

火山引擎 最新活动