从 n8n 调用 CAPTCHA 求解 API

作者:solvethree阅读需 2 分钟

使用 n8n 的 HTTP Request 节点创建任务,然后根据任务状态分支。如果任务仍在等待或求解中,请等待后查询同一个任务 ID,不要再次发送 POST。

本页内容

设置站点和凭据

  1. 1.

    启用站点配置文件

    在 solvethree 控制台中设置目标主机名,并确保其配置文件已在你的工作区中启用。在任务中发送主机名和操作并不会创建配置文件。

  2. 2.

    在 n8n 中创建请求头身份验证凭据

    将其配置为发送 Authorization 请求头,值为 Bearer 后接你的工作区 API 密钥。将密钥存储在凭据中,而不是任务 JSON 中。

配置创建请求

将 HTTP Request 节点命名为 Create task。轮询节点将引用此名称来获取原始任务 ID。

创建任务节点配置
创建任务节点配置
字段设置
方式POST
URLhttps://api.solvethree.com/v1/tasks
身份验证通用凭据类型
通用身份验证类型请求头身份验证;选择你创建的凭据
发送查询参数启用;添加 waitMs,值设为 15000
发送请求体启用;选择 JSON 并使用下面的请求体
reCAPTCHA Enterprise · 请求结构
{
  "site": "accounts.example.com",
  "action": "login",
  "proxy": "http://user:[email protected]:8080",
  "requestId": "example_login_001"
}

将 site、action 和 proxy 替换为本次请求的主机名、操作和代理。proxy 和 proxyCandidates 必须且只能发送其中一个;此示例使用单个代理。不要添加 type 或 url。默认 reCAPTCHA 类型为 Enterprise v3。

为每个新的逻辑任务,将示例中的 requestId 替换为唯一值。如果需要在超时后恢复此任务,请保持该值不变。它接受 1–64 个 ASCII 字母、数字、下划线或连字符。

waitMs 应放在 URL 查询参数中,而不是 JSON 请求体中。将 HTTP 请求超时设为大于所请求的 15 秒等待时间,以留出网络开销;30 秒是一个合理的初始配置,并非求解时间保证。请求头身份验证凭据会提供身份验证信息,因此无需在“发送请求头”中重复配置。

根据状态分支,而不是 HTTP 是否成功

检查任务载荷之前,先处理非成功的 HTTP 响应。对于成功响应,连接 IF 或 Switch 节点并检查 {{ $json.status }}。

让创建和轮询响应都经过这些检查
让创建和轮询响应都经过这些检查
状态下一步操作
ready退出轮询循环并使用解决结果。
failed停止轮询。记录 errorCode 和 error,以便诊断。
pending 或 solving检查轮询截止时间,然后等待并通过 GET 查询现有任务。

对于已就绪的 reCAPTCHA 任务,使用返回的 userAgent 和 secChUa 身份信息以及求解成功时使用的代理,提交返回的令牌。任务就绪表示已生成解决结果,并不代表网站接受了后续请求。

求解失败会退款。请诊断报告的错误,而不是用未修改的输入重试,或直接认定工作区余额不足。

等待后通过 GET 查询原始 ID

  1. 1.

    保存固定截止时间

    在 Create task 运行之前,在工作流中存储轮询截止时间,例如创建开始后的两分钟。这是工作流的停止策略,而不是 solvethree API 的限制。将截止时间保存在 HTTP 响应之外,以免后续响应覆盖它。

  2. 2.

    为每轮轮询设置检查

    对于等待中或求解中的任务,使用 IF 节点比较当前时间与保存的截止时间。如果已过期,则结束循环并保留任务 ID。否则,使用 Wait 节点暂停两秒,然后在发送 GET 之前再次检查截止时间。

  3. 3.

    查询现有任务

    按照以下设置配置第二个 HTTP Request 节点。将其响应送回同一个状态分支。绝不要将轮询分支重新连接到 Create task。

轮询 HTTP Request 节点配置
轮询 HTTP Request 节点配置
字段设置
方式GET
URLhttps://api.solvethree.com/v1/tasks/{{ $('Create task').item.json.id }}
身份验证通用凭据类型
通用身份验证类型请求头身份验证;选择同一个凭据
发送查询参数启用;添加 waitMs,值设为 15000
发送请求体禁用

任务 ID 表达式为 {{ $('Create task').item.json.id }}。即使最新数据项包含的是轮询响应或其他工作流数据,它也会从指定名称的创建节点中读取 id。请确保表达式中的节点名称与你的工作流一致。

GET 接受最长 15 秒的等待时间。为此 HTTP 请求设置与创建请求相同的超时余量。截止时间会阻止发起新的轮询;已在执行的请求可能在截止时间之后完成。

在 n8n 之外,等效的 GET 请求为:

任务 API · 获取现有任务
curl --fail-with-body --max-time 30 \
  "https://api.solvethree.com/v1/tasks/$TASK_ID?waitMs=15000" \
  -H "Authorization: Bearer $SOLVETHREE_API_KEY"

恢复超时的 POST,而不创建另一个任务

连接超时并不能证明创建失败。如果收到了 ID,请查询该任务。如果没有收到,请使用相同的任务输入和相同的 requestId 再次发送 POST,以恢复现有任务。使用不同的任务输入重复使用该 ID 会导致冲突。

同样,达到轮询截止时间只是本地停止条件,并不表示任务状态为失败。请保留原始 ID,以便后续执行查询该任务,而不是再次付费求解。

运行您的第一个任务。

使用 $5 工作区额度开始体验。

创建工作区
从 n8n 调用 CAPTCHA 求解 API · solvethree