Selenium:实现Headless模式下遇hcaptcha时显示浏览器并事后隐藏
关于hcaptcha绕过及Headless模式切换可见状态的解决方案
一、免费hcaptcha绕过方案的可行性
hcaptcha的核心设计目标就是拦截自动化工具,不存在可靠的免费绕过方案。市面上声称免费的脚本、工具要么是针对旧版本hcaptcha的临时破解(很快会被官方修复),要么包含恶意代码,或者会触发网站的反爬机制导致IP/账号被封禁。
hcaptcha不仅依赖图像识别,还会分析用户的行为特征(比如鼠标移动轨迹、点击节奏、页面交互方式),自动化工具很难模拟真实人类的行为模式,免费方法几乎无法绕过这些检测。
二、Headless模式下切换浏览器可见/隐藏的实现方法
Selenium的Headless模式是启动时就确定的,无法直接动态切换,但可以通过以下两种替代方案实现需求:
方案1:启动可见浏览器,通过系统API控制窗口显示/隐藏
这种方法是一开始就启动正常的可见浏览器,然后用系统级的窗口控制工具来隐藏/显示窗口,模拟Headless的效果。
Windows平台示例(Python)
- 先安装依赖:
pip install pywin32 selenium
- 代码实现:
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工具控制窗口:
- 安装
wmctrl:
sudo apt install wmctrl
- 在代码中通过
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
相关产品推荐
相关产品推荐

