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

Selenium:实现Headless模式下遇hcaptcha时显示浏览器并事后隐藏

关于hcaptcha绕过及Headless模式切换可见状态的解决方案

一、免费hcaptcha绕过方案的可行性

hcaptcha的核心设计目标就是拦截自动化工具,不存在可靠的免费绕过方案。市面上声称免费的脚本、工具要么是针对旧版本hcaptcha的临时破解(很快会被官方修复),要么包含恶意代码,或者会触发网站的反爬机制导致IP/账号被封禁。

hcaptcha不仅依赖图像识别,还会分析用户的行为特征(比如鼠标移动轨迹、点击节奏、页面交互方式),自动化工具很难模拟真实人类的行为模式,免费方法几乎无法绕过这些检测。

二、Headless模式下切换浏览器可见/隐藏的实现方法

Selenium的Headless模式是启动时就确定的,无法直接动态切换,但可以通过以下两种替代方案实现需求:

方案1:启动可见浏览器,通过系统API控制窗口显示/隐藏

这种方法是一开始就启动正常的可见浏览器,然后用系统级的窗口控制工具来隐藏/显示窗口,模拟Headless的效果。

Windows平台示例(Python)

  1. 先安装依赖:
pip install pywin32 selenium
  1. 代码实现:
import win32gui
import win32con
from selenium import webdriver
from selenium.webdriver.chrome.options import Options

def get_chrome_window_handle():
    # 遍历窗口匹配Chrome进程,可根据实际页面标题调整匹配规则
    def callback(hwnd, extra):
        if win32gui.IsWindowVisible(hwnd):
            title = win32gui.GetWindowText(hwnd)
            if "Google Chrome" in title:
                extra.append(hwnd)
    hwnds = []
    win32gui.EnumWindows(callback, hwnds)
    return hwnds[0] if hwnds else None

def show_browser():
    hwnd = get_chrome_window_handle()
    if hwnd:
        win32gui.ShowWindow(hwnd, win32con.SW_SHOW)
        win32gui.SetForegroundWindow(hwnd)

def hide_browser():
    hwnd = get_chrome_window_handle()
    if hwnd:
        win32gui.ShowWindow(hwnd, win32con.SW_HIDE)

# 初始化可见浏览器,先隐藏
options = Options()
options.add_argument("--incognito")  # 避免缓存干扰
driver = webdriver.Chrome(options=options)

# 隐藏浏览器窗口
hide_browser()

# 执行注册流程(示例)
driver.get("https://目标注册页面.com")
# ... 填写表单等操作 ...

# 检测到hcaptcha出现时,显示浏览器
show_browser()
input("请完成hcaptcha验证后按回车键继续...")
# 验证完成后重新隐藏
hide_browser()

# 继续后续操作
# ...

driver.quit()

Linux平台示例

使用wmctrl工具控制窗口:

  1. 安装wmctrl:
sudo apt install wmctrl
  1. 在代码中通过subprocess调用命令:
import subprocess
from selenium import webdriver

def hide_browser():
    subprocess.run(["wmctrl", "-r", "Google Chrome", "-b", "add,hidden"])

def show_browser():
    subprocess.run(["wmctrl", "-r", "Google Chrome", "-b", "remove,hidden"])

# 后续逻辑同Windows版本,初始化浏览器后调用hide_browser()

方案2:双浏览器实例同步会话

启动一个Headless浏览器处理常规步骤,遇到hcaptcha时,将会话cookies同步到一个可见浏览器实例,人工完成验证后再将更新后的会话同步回Headless浏览器。

代码示例:

from selenium import webdriver
from selenium.webdriver.chrome.options import Options

# 1. 启动Headless浏览器处理前置流程
headless_opts = Options()
headless_opts.add_argument("--headless=new")
headless_opts.add_argument("--incognito")
headless_driver = webdriver.Chrome(options=headless_opts)

headless_driver.get("https://目标注册页面.com")
# ... 填写注册信息等操作,直到触发hcaptcha ...

# 2. 同步会话到可见浏览器
session_cookies = headless_driver.get_cookies()
current_url = headless_driver.current_url

visible_opts = Options()
visible_opts.add_argument("--incognito")
visible_driver = webdriver.Chrome(options=visible_opts)
visible_driver.get(current_url)

# 导入cookies同步会话
for cookie in session_cookies:
    visible_driver.add_cookie(cookie)
visible_driver.refresh()

# 3. 等待人工验证
input("完成hcaptcha验证后按回车键继续...")

# 4. 同步验证后的会话回Headless浏览器
updated_cookies = visible_driver.get_cookies()
headless_driver.delete_all_cookies()
for cookie in updated_cookies:
    headless_driver.add_cookie(cookie)
headless_driver.refresh()

# 关闭可见浏览器
visible_driver.quit()

# 5. 继续Headless模式下的后续操作
# ...

headless_driver.quit()

注意事项

  • 窗口标题匹配需要根据实际情况调整,避免找不到窗口句柄。
  • 双实例同步会话时,确保两个浏览器使用相同的配置(比如都用隐身模式),避免缓存或会话冲突。
  • 频繁切换窗口或使用自动化工具可能会被网站检测,建议添加适当的延迟,模拟人类操作节奏。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 00:43:23