CAPSOLVER
博客
如何使用TinyFish AgentQL解决CAPTCHA——使用CapSolver的分步指南

如何使用TinyFish AgentQL解决CAPTCHA – 使用CapSolver的分步指南

Logo of CapSolver

Adélia Cruz

Neural Network Developer

05-Aug-2026

当你的AI驱动的网页自动化遇到验证码墙时,整个流程都会停滞。页面无法加载,表单无法提交,数据提取也会停止——这一切都是因为验证码设计用来阻止机器人。TinyFish AgentQL 是一个强大的工具套件,用于将AI连接到网络,具有自然语言查询、Playwright集成和企业级结构化数据提取功能。但和任何浏览器自动化框架一样,它也会被验证码卡住。

CapSolver 完全改变了这一状况。通过将 CapSolver Chrome 扩展加载到 AgentQL 的 Playwright 驱动的浏览器上下文中,验证码会在后台自动且不可见地被解决。无需手动解决,也不需要你在端上进行复杂的 API 协调。你的自动化脚本可以继续运行,仿佛验证码从未存在过。

最棒的是?你的 AgentQL 查询和脚本不需要任何一行与验证码相关的代码。扩展会自行处理检测、解决和令牌注入,而你的代理则专注于它最擅长的事情——提取数据和自动化工作流。

什么是 TinyFish AgentQL?

TinyFish AgentQL 是一个企业级工具包,用于将 AI 代理和 LLM 连接到实时网络环境。由 TinyFish 开发,它提供了一种 AI 驱动的查询语言,让你可以使用自然语言定位页面元素并提取结构化数据——无需脆弱的 CSS 选择器或 XPaths。

关键功能

  • AI 驱动的查询语言:根据页面内容直观地查找元素。随着 UI 随时间变化,查询会自我修复。
  • Playwright 集成:Python 和 JavaScript SDK 可与 Playwright 无缝集成,用于高级浏览器自动化。
  • 结构化数据提取:定义输出结构,从任何页面(公开或私有,静态或动态)中获取干净的结构化数据。
  • REST API:通过 REST 端点 执行查询,无需 SDK。
  • 浏览器调试器:一个 Chrome 扩展,用于实时测试和优化查询。
  • 跨站点弹性:无需修改即可在类似网站上运行,动态适应页面变化。
  • 企业级规模:专为高吞吐量工作负载设计,可并行运行数百个任务。

AgentQL 可以在任何页面上运行——包括经过身份验证的内容和动态生成的页面——使其成为大规模网页自动化、数据收集和 AI 代理工作流的理想选择。

什么是 CapSolver?

CapSolver 是一个领先的 AI 驱动的验证码解决服务,可以自动解决各种验证码挑战。凭借快速的响应时间和广泛的兼容性,CapSolver 可无缝集成到自动化工作流中。

支持的验证码类型

  • reCAPTCHA v2(复选框和不可见)
  • reCAPTCHA v3 & v3 企业版
  • Cloudflare Turnstile
  • Cloudflare 5 秒挑战
  • AWS WAF 验证码
  • 更多

为什么这个集成与众不同

大多数验证码解决集成需要你编写样板代码:创建任务、轮询结果、将令牌注入隐藏字段。这是使用原始 Playwright 或 Puppeteer 脚本的标准方法。

AgentQL + CapSolver 采用根本不同的方法:

传统(基于代码) AgentQL + CapSolver 扩展
编写 CapSolver 服务类 在 Playwright 上下文中加载扩展
调用 createTask() / getTaskResult() 扩展会自动处理一切
通过 page.evaluate() 注入令牌 令牌注入是不可见的
在代码中处理错误、重试、超时 扩展在内部管理重试
每种验证码类型需要不同的代码 自动处理所有类型

关键见解:CapSolver 扩展在 AgentQL 的 Playwright 浏览器上下文中运行。当 AgentQL 导航到包含验证码的页面时,扩展会检测到它,在后台解决它,并在你的脚本与表单交互之前注入令牌。你的自动化代码保持干净、专注且无验证码。

前提条件

在设置集成之前,请确保你已:

  • 安装 TinyFish AgentQL(Python SDK 或 JavaScript SDK)
  • 一个 CapSolver 账户 和 API 密钥(在这里注册
  • Node.js 16+Python 3.8+(根据你的 SDK 选择)
  • 安装 Playwright 并包含 Chromium

重要提示:Chrome 扩展只能在 Chromium 中使用,并且需要 持久化上下文。这是 Playwright 的要求,不是 AgentQL 的限制。

分步设置

步骤 1:安装 AgentQL

Python SDK:

bash 复制代码
pip install agentql
playwright install chromium

JavaScript SDK:

bash 复制代码
npm install agentql
npx playwright install chromium

步骤 2:下载 CapSolver Chrome 扩展

将 CapSolver Chrome 扩展下载并提取到专用目录中:

  1. 访问 CapSolver Chrome 扩展 v1.17.0 发布页面
  2. 下载 CapSolver.Browser.Extension-chrome-v1.17.0.zip
  3. 解压 zip 文件:
bash 复制代码
mkdir -p ~/capsolver-extension
unzip CapSolver.Browser.Extension-chrome-v*.zip -d ~/capsolver-extension/
  1. 验证解压是否成功:
bash 复制代码
ls ~/capsolver-extension/manifest.json

你应该看到 manifest.json —— 这确认扩展已放置在正确的位置。

步骤 3:配置你的 CapSolver API 密钥

打开扩展配置文件 ~/capsolver-extension/assets/config.js 并将 apiKey 值替换为你的:

javascript 复制代码
export const defaultConfig = {
  apiKey: 'CAP-XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX', // ← 你的密钥在这里
  useCapsolver: true,
  // ...其余配置
};

你可以在你的 CapSolver 仪表板 上获取你的 API 密钥。

步骤 4:使用 CapSolver 扩展启动 AgentQL

关键步骤是使用 持久化上下文 启动 Playwright 的 Chromium,加载 CapSolver 扩展。

Python 示例:

python 复制代码
import agentql
from playwright.sync_api import sync_playwright
import time
import os

# CapSolver 扩展路径
CAPSOLVER_EXTENSION_PATH = os.path.expanduser("~/capsolver-extension")

def main():
    with sync_playwright() as p:
        # 使用持久化上下文和 CapSolver 扩展启动 Chromium
        context = p.chromium.launch_persistent_context(
            user_data_dir="./browser-data",
            headless=False,  # 扩展需要非无头模式
            args=[
                f"--disable-extensions-except={CAPSOLVER_EXTENSION_PATH}",
                f"--load-extension={CAPSOLVER_EXTENSION_PATH}",
            ],
        )

        # 使用 AgentQL 包装页面以进行 AI 驱动的查询
        page = agentql.wrap(context.pages[0])

        # 导航到目标页面
        page.goto("https://example.com/protected-page")

        # 等待 CapSolver 检测并解决任何验证码
        time.sleep(30)

        # 使用 AgentQL 的自然语言查询查找并点击提交按钮
        response = page.query_elements("""
        {
            submit_button
        }
        """)

        # 点击提交按钮 —— 验证码已解决!
        response.submit_button.click()

        # 提交后提取数据
        result = page.query_data("""
        {
            confirmation_message
        }
        """)

        print(f"结果: {result['confirmation_message']}")

        context.close()

if __name__ == "__main__":
    main()

JavaScript 示例:

javascript 复制代码
const { chromium } = require('playwright');
const agentql = require('agentql');
const path = require('path');
const os = require('os');

const CAPSOLVER_EXTENSION_PATH = path.join(os.homedir(), 'capsolver-extension');

(async () => {
  // 使用持久化上下文和 CapSolver 扩展启动 Chromium
  const context = await chromium.launchPersistentContext('./browser-data', {
    headless: false, // 扩展需要非无头模式
    args: [
      `--disable-extensions-except=${CAPSOLVER_EXTENSION_PATH}`,
      `--load-extension=${CAPSOLVER_EXTENSION_PATH}`,
    ],
  });

  // 获取第一个页面并用 AgentQL 包装
  const page = agentql.wrap(context.pages()[0]);

  // 导航到目标页面
  await page.goto('https://example.com/protected-page');

  // 等待 CapSolver 处理任何验证码
  await page.waitForTimeout(30000);

  // 使用 AgentQL 查询进行交互 —— 验证码已解决
  const response = await page.queryElements(`{
    submit_button
  }`);

  await response.submit_button.click();

  // 提取结果数据
  const result = await page.queryData(`{
    confirmation_message
  }`);

  console.log('结果:', result.confirmation_message);

  await context.close();
})();

步骤 5:验证扩展是否加载

启动浏览器后,你可以通过在浏览器窗口中导航到 chrome://extensions 来验证 CapSolver 扩展是否处于活动状态。你应该看到 CapSolver 扩展已列出并启用。

或者,检查浏览器控制台中的 CapSolver 日志消息,以确认服务工作线程正在运行。

如何使用

一旦设置完成,使用 CapSolver 与 AgentQL 就变得非常简单。

黄金法则

不要编写验证码特定的代码。 只需在与验证码保护的表单交互前添加等待时间,让扩展完成其工作。

示例 1:reCAPTCHA 后的表单提交

python 复制代码
page.goto("https://example.com/contact")

# 使用 AgentQL 查询填写表单
response = page.query_elements("""
{
    contact_form {
        name_field
        email_field
        message_field
        submit_button
    }
}
""")

response.contact_form.name_field.fill("John Doe")
response.contact_form.email_field.fill("john@example.com")
response.contact_form.message_field.fill("Hello, I have a question about your services.")

# 等待 CapSolver 解决验证码
time.sleep(30)

# 提交 —— 验证码令牌已注入
response.contact_form.submit_button.click()

示例 2:带有 Cloudflare Turnstile 的登录页面

python 复制代码
page.goto("https://example.com/login")

# 等待 CapSolver 解决 Turnstile 挑战
time.sleep(25)

# 使用 AgentQL 查找登录表单元素
response = page.query_elements("""
{
    login_form {
        email_input
        password_input
        login_button
    }
}
""")

# 填写表单 —— Turnstile 已处理
response.login_form.email_input.fill("me@example.com")
response.login_form.password_input.fill("mypassword123")

# 点击登录
response.login_form.login_button.click()

示例 3:从受保护页面提取数据

python 复制代码
page.goto("https://example.com/data")

# 等待任何验证码挑战清除
time.sleep(30)

# 使用 AgentQL 提取结构化数据
data = page.query_data("""
{
    products[] {
        name
        price
        rating
        availability
    }
}
""")

for product in data['products']:
    print(f"{product['name']}: ${product['price']} ({product['rating']} 星)")

推荐的等待时间

验证码类型 通常解决时间 推荐等待时间
reCAPTCHA v2(复选框) 5-15 秒 30-60 秒
reCAPTCHA v2(不可见) 5-15 秒 30 秒
reCAPTCHA v3 3-10 秒 20-30 秒
Cloudflare Turnstile 3-10 秒 20-30 秒

提示:如果不确定,使用 30 秒。等待更长时间比过早提交更好。额外的时间不会影响结果。

背后的工作原理

当 AgentQL 在加载 CapSolver 扩展的情况下运行时,会发生以下情况:

复制代码
你的 AgentQL 脚本
───────────────────────────────────────────────────
page.goto("https://...")       ──►  Chromium 加载页面
                                           │
                                           ▼
                               ┌─────────────────────────────┐
                               │  包含验证码小部件的页面     │
                               │                               │
                               │  CapSolver 扩展:         │
                               │  1. 内容脚本检测页面上的验证码 │
                               │  2. 服务工作线程调用 CapSolver API │
                               │  3. 收到令牌            │
                               │  4. 将令牌注入隐藏表单字段  │
                               └─────────────────────────────┘
                                           │
                                           ▼
time.sleep(30)                   扩展解决验证码...
                                           │
                                           ▼
page.query_elements(...)         AgentQL 找到表单元素
submit_button.click()            表单提交 —— 有效令牌已注入
                                           │
                                           ▼
                               "验证成功!"

扩展如何加载

当 Playwright 使用 --load-extension 标志启动 Chromium 时:

  1. Chromium 启动并加载 CapSolver 扩展
  2. 扩展激活 —— 其服务工作线程开始运行,内容脚本注入到每个页面
  3. 在包含验证码的页面上 —— 内容脚本检测到小部件,调用 CapSolver API,并将解决方案令牌注入页面
  4. AgentQL 正常运行 —— 查询、点击和数据提取正常工作,验证码已处理

完整配置参考

这是 AgentQL + CapSolver 集成的完整 Python 设置,包含所有配置选项:

python 复制代码
import agentql
from playwright.sync_api import sync_playwright
import os

# 配置
CAPSOLVER_EXTENSION_PATH = os.path.expanduser("~/capsolver-extension")
USER_DATA_DIR = "./browser-data"

with sync_playwright() as p:
    context = p.chromium.launch_persistent_context(
        user_data_dir=USER_DATA_DIR,
        headless=False,
        args=[
            f"--disable-extensions-except={CAPSOLVER_EXTENSION_PATH}",
            f"--load-extension={CAPSOLVER_EXTENSION_PATH}",
        ],
    )
    page = agentql.wrap(context.pages[0])
    # ... 你的自动化代码在这里
    context.close()

配置选项

选项 描述
user_data_dir 存储浏览器配置文件数据(cookie、会话)的目录。用于持久化上下文。
headless 必须为 False —— Chrome 扩展在无头模式下无法工作。
--disable-extensions-except 限制哪些扩展可以加载(防止冲突)。
--load-extension 指向未打包的CapSolver扩展目录的路径。
CAPSOLVER_EXTENSION_PATH 包含manifest.json的已解压CapSolver扩展的完整路径。

CapSolver API密钥直接配置在扩展的assets/config.js文件中(参见上文第3步)。

使用CapSolver与TinyFish浏览器

以上内容假设你自行在本地运行Chromium,并使用持久化Playwright上下文以加载CapSolver扩展。但并非所有设置都允许你直接控制Chromium进程——如果你的自动化运行在TinyFish浏览器的远程、按需浏览器会话服务上,你无法直接管理Chromium进程,因此无法以相同方式加载未打包的扩展。

在这种情况下,CapSolver可以通过其API直接集成到你的脚本中:你向TinyFish浏览器请求一个远程浏览器会话,通过CDP使用Playwright连接,使用CapSolver SDK解决CAPTCHA,并将生成的令牌注入到页面中。这是一种更“传统”的基于代码的方法,如本文前面所述——但当无法将扩展加载到你控制的浏览器实例中时,这是正确的工具。

在开始之前,安装CapSolver SDK:

bash 复制代码
pip install capsolver

以下代码展示了如何在TinyFish浏览器会话中使用CapSolver解决reCAPTCHA:

python 复制代码
import time
import requests
import capsolver
from playwright.sync_api import sync_playwright


TINYFISH_API_KEY = "YOUR TINYFISH API KEY"
capsolver.api_key = "YOUR CAPSOLVER API KEY"


website_url = "https://www.google.com/recaptcha/api2/demo"
website_key = "6Le-wvkSAAAAAPBMRTvw0Q4Muexq9bi0DJwx_mJ-"
captcha_type = "ReCaptchaV2TaskProxyLess"


def create_tinyfish_browser(url):
    resp = requests.post(
        "https://api.browser.tinyfish.ai",
        headers={
            "X-API-Key": TINYFISH_API_KEY,
            "Content-Type": "application/json",
        },
        json={
            "url": url,
            "timeout_seconds": 300,
        },
        timeout=90,
    )
    resp.raise_for_status()
    return resp.json()


def close_tinyfish_browser(session_id):
    try:
        requests.delete(
            f"https://api.browser.tinyfish.ai/{session_id}",
            headers={"X-API-Key": TINYFISH_API_KEY},
            timeout=30,
        )
    except Exception as exc:
        print("   Failed to close tinyfish browser session:", repr(exc))


def solve_recaptcha_v2():
    print("3. Solving reCAPTCHA with CapSolver")
    solution = capsolver.solve({
        "type": captcha_type,
        "websiteURL": website_url,
        "websiteKey": website_key,
    })

    token = solution.get("gRecaptchaResponse")
    if not token:
        raise RuntimeError(f"CapSolver did not return a reCAPTCHA token: {solution}")

    print("   CapSolver task solved:", token)
    return token


def inject_recaptcha_token(page, token):
    page.evaluate(
        """
        (token) => {
            const textarea = document.getElementById('g-recaptcha-response');
            if (textarea) {
                textarea.value = token;
            }
        }
        """,
        token,
    )
    print("   CapSolver token injected")
    page.click('input[type="submit"]')
    print("   Submit button clicked")


def main():
    session_id = None
    try:
        print("1. Creating tinyfish browser session")
        session = create_tinyfish_browser(website_url)

        session_id = session["session_id"]
        cdp_url = session["cdp_url"]
        print("   Tinyfish session id:", session_id)
        print("   Tinyfish cdp url:", cdp_url)

        with sync_playwright() as p:
            print("2. Connecting to tinyfish browser via cdp")
            browser = p.chromium.connect_over_cdp(cdp_url)
            context = browser.contexts[0]
            page = context.pages[0] if context.pages else context.new_page()
            page.wait_for_load_state("domcontentloaded", timeout=60000)
            print("   Current page url:", page.url)

            token = solve_recaptcha_v2()

            print("4. Injecting the capsolver token")
            inject_recaptcha_token(page, token)

            page.wait_for_load_state("domcontentloaded", timeout=30000)
            time.sleep(3)

            body_text = page.locator("body").inner_text(timeout=10000)
            print("5. Page result:", " ".join(body_text.split()))

            print("6. Closing browser sessions")
            browser.close()
    finally:
        if session_id:
            close_tinyfish_browser(session_id)


if __name__ == "__main__":
    main()

无论你的设置适合哪种方法——将CapSolver扩展加载到本地持久化Playwright上下文中,或直接通过远程TinyFish浏览器会话调用CapSolver API——目标都是相同的:你的AgentQL自动化永远不需要自行处理CAPTCHA逻辑。

故障排除

扩展未加载

症状:CAPTCHA未被自动解决。

原因:你可能在使用常规浏览器上下文而非持久化上下文,或在无头模式下运行。

解决方案:Playwright中的扩展需要持久化上下文和有头模式:

python 复制代码
# ✅ 正确 —— 持久化上下文,有头模式
context = p.chromium.launch_persistent_context(
    user_data_dir="./browser-data",
    headless=False,
    args=[...extension args...]
)

# ❌ 错误 —— 常规上下文(扩展不会加载)
browser = p.chromium.launch()
context = browser.new_context()

CAPTCHA未解决(表单失败)

可能原因

  • 等待时间不足 —— 增加到60秒
  • 无效的API密钥 —— 检查你的CapSolver仪表板
  • 余额不足 —— 为你的CapSolver账户充值
  • 扩展未加载 —— 参见“扩展未加载”部分

无头模式不被支持

症状:脚本运行但无扩展显示。

原因:Chrome扩展在无头模式下无法工作。

解决方案:在服务器上使用有头模式和虚拟显示:

bash 复制代码
# 安装Xvfb
sudo apt-get install xvfb

# 启动虚拟显示
Xvfb :99 -screen 0 1280x720x24 &

# 设置DISPLAY
export DISPLAY=:99

Google Chrome 137+兼容性

症状:扩展标志被静默忽略。

原因:Google Chrome 137+在品牌构建中移除了对--load-extension的支持。

解决方案:使用Playwright的捆绑Chromium(推荐)或Chrome for Testing:

bash 复制代码
# 安装Playwright的Chromium(推荐)
npx playwright install chromium

# 或下载Chrome for Testing
# 访问:https://googlechromelabs.github.io/chrome-for-testing/

最佳实践

  1. 始终使用较长的等待时间。 更长的等待时间总是更安全。CAPTCHA通常在5-20秒内解决,但网络延迟、复杂挑战或重试可能增加时间。30-60秒是最佳选择。

  2. 保持自动化脚本简洁。 不要在AgentQL查询中添加特定于CAPTCHA的逻辑。扩展会处理一切——你的代码应专注于数据提取和交互。

  3. 监控你的CapSolver余额。 每次CAPTCHA解决都会消耗积分。定期在capsolver.com/dashboard检查余额以避免中断。

  4. 始终一致地使用持久化上下文。 当需要扩展时,始终使用launch_persistent_context()。这也会在运行中保留cookie和会话数据,从而减少CAPTCHA频率。

  5. 在无头服务器上使用Xvfb。 Chrome扩展需要显示上下文。在没有物理显示的服务器环境中设置Xvfb。

  6. 根据环境选择集成方式。 当你直接控制Chromium进程并可以启动持久化上下文时,使用基于扩展的方法。当你连接到无法直接启动的浏览器时(如通过CDP的远程TinyFish浏览器会话),使用CapSolver SDK的API方法。

结论

TinyFish AgentQL + CapSolver集成将隐形CAPTCHA解决功能带入了最强大的网络自动化工具包之一。你无需编写复杂的CAPTCHA处理代码,只需:

  1. 下载CapSolver扩展并配置你的API密钥
  2. 使用扩展加载的持久化上下文启动AgentQL的Playwright浏览器
  3. 正常编写自动化脚本——在提交表单前添加等待时间

CapSolver Chrome扩展会处理其余内容——检测CAPTCHA,通过CapSolver API解决,并将令牌注入页面。你的AgentQL脚本根本不需要知道CAPTCHA的存在。

当你的自动化运行在远程会话上时(如TinyFish浏览器),CapSolver的API和SDK让你通过几行额外代码获得相同结果:请求会话,通过CDP连接,解决并注入令牌。

这就是结合AI驱动的网页自动化与AI驱动的CAPTCHA解决时的CAPTCHA处理方式:隐形、自动且无需代码。

准备好开始了吗? 注册CapSolver 并使用优惠码 AGENTQL 在首次充值时获得额外6%的优惠!

优惠码

FAQ

我需要在AgentQL脚本中编写特定于CAPTCHA的代码吗?

不需要。CapSolver扩展在Playwright浏览器上下文中完全在后台运行。在提交表单前添加time.sleep()waitForTimeout(),扩展会自动处理检测、解决和令牌注入。

为什么需要持久化上下文?

Playwright仅在使用launch_persistent_context()时支持Chrome扩展。这是Playwright架构的要求。通过browser.new_context()创建的常规浏览器上下文无法加载扩展。

我可以在无头模式下运行吗?

不可以。Chrome扩展需要有头浏览器。对于没有显示的服务器环境,使用Xvfb(X虚拟帧缓冲区)创建虚拟显示。

如果我使用的是远程TinyFish浏览器会话而不是自己的本地Chromium呢?

由于你无法直接控制浏览器的启动,无法将CapSolver扩展加载到TinyFish浏览器会话中。相反,使用CapSolver SDK解决CAPTCHA并通过page.evaluate()在连接到CDP后自行注入结果令牌,如上文“使用CapSolver与TinyFish浏览器”部分所示。

CapSolver支持哪些CAPTCHA类型?

CapSolver支持reCAPTCHA v2(复选框和隐形)、reCAPTCHA v3、Cloudflare Turnstile、AWS WAF CAPTCHA等。扩展会自动检测CAPTCHA类型并相应解决。

CapSolver的费用是多少?

CapSolver提供基于CAPTCHA类型和数量的有竞争力的价格。访问capsolver.com查看当前价格。

TinyFish AgentQL是免费的吗?

AgentQL提供免费和付费层级。SDK和查询语言可用于开发和测试。访问tinyfish.ai了解定价详情。

我应该等待多久让CAPTCHA被解决?

对于大多数CAPTCHA,30-60秒足够。实际解决时间通常为5-20秒,但添加额外缓冲可确保可靠性。不确定时,使用30秒。

合规声明: 本博客提供的信息仅供参考。CapSolver 致力于遵守所有适用的法律和法规。严禁以非法、欺诈或滥用活动使用 CapSolver 网络,任何此类行为将受到调查。我们的验证码解决方案在确保 100% 合规的同时,帮助解决公共数据爬取过程中的验证码难题。我们鼓励负责任地使用我们的服务。如需更多信息,请访问我们的服务条款和隐私政策。

更多