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




