最可靠方案是Selenium模拟登录并人工输入2FA验证码:等待TOTP输入框出现后由人工填写,再点击确认;登录后保存完整Cookie与User-Agent供requests复用,并通过禁用webdriver特征、避免无头模式等措施降低反爬检测概率。

用 Selenium 模拟登录 + 手动输入 2FA 验证码最可靠
自动化处理双因子认证(2FA)没有通用绕过方案,浏览器自动化仍是当前最稳定的选择。Selenium 能保留登录态、触发 2FA 弹窗、等待人工输入,避免因验证码时效或设备绑定导致的失败。
关键点在于:不尝试自动识别或模拟 TOTP,而是把 input 控件留给人操作,再继续后续抓取。
- 启动时加
--start-maximized和--disable-blink-features=AutomationControlled减少被检测为 bot 的概率 - 登录表单提交后,用
WebDriverWait(driver, 60).until(EC.presence_of_element_located((By.ID, "totp-code")))等待 2FA 输入框出现,超时 60 秒足够人工输入 - 输入完成后,显式点击「确认」按钮(别用
submit(),有些站点会拦截表单自动提交) - 登录成功后,立刻调用
driver.get_cookies()保存会话,后续可用requests.Session()复用,避免重复走 UI 流程
requests + session 复用登录态时,必须同步 Cookie 和 headers
很多人以为拿到 driver.get_cookies() 就能直接塞进 requests.Session(),但实际常失败——因为部分网站校验 User-Agent、Sec-Fetch-* 头,或依赖 __cf_bm、_ga 等反爬 cookie。
- 从
driver中提取 cookie 后,用session.cookies.set(cookie['name'], cookie['value'], domain=cookie['domain'])逐个设置,不能直接传 list - 复制
driver.execute_script("return navigator.userAgent")获取 UA,并设为session.headers['User-Agent'] - 访问首页或任意页面后,检查响应状态码和
session.get(...).url是否跳转回登录页,验证态是否有效 - 若接口返回 403 或重定向到登录页,大概率是漏了某个动态生成的 cookie(比如 Cloudflare 的
__cf_bm),此时需回到 Selenium 页面刷新后再取一次
遇到 “Your browser is being controlled by automated software” 提示怎么办
这是 ChromeDriver 常见的反自动化检测,不是 2FA 本身的问题,但会卡在登录前。
立即学习“Python免费学习笔记(深入)”;
- 禁用
enable-automation开关:在options.add_experimental_option("excludeSwitches", ["enable-automation"]) - 移除
webdriver属性:执行driver.execute_cdp_cmd('Page.addScriptToEvaluateOnNewDocument', {'source': 'Object.defineProperty(navigator, "webdriver", {get: () => undefined})'}) - 避免使用无头模式(
--headless=new)——某些 2FA 页面(如 GitHub、Auth0)会拒绝无头环境渲染验证器 - 如果仍被拦截,换用 undetected-chromedriver2 或 playwright 的
chromium.launch(headless=False),它们对 navigator 属性和指纹隐藏更彻底
TOTP 动态码不能硬编码,但可本地缓存最近一次生成值
如果你控制后台(比如自己开发的 2FA 站点),且密钥已知,可以用 pyotp.TOTP 生成当前码;但绝大多数生产站点(Google、GitHub、Okta)不允许暴露密钥,所以这条路只适用于内部系统。
- 若真有密钥,用
pyotp.TOTP("JBSWY3DPEHPK3PXP").now()得到 6 位码,注意服务器时间和本地时间偏差不能超过 30 秒 - 不要把密钥写死在代码里,应从环境变量读取:
os.getenv("TOTP_SECRET") - 即使能生成,也建议首次仍走人工输入流程,后续才用 TOTP 自动填充——因为第一次登录往往要确认设备、勾选“信任此浏览器”,这些步骤无法跳过
- 缓存上一次生成的码没意义,TOTP 每 30 秒变一次,且多数网站限制同一码只能用一次


















