想用 n8n 跑通“提交任务 → 轮询结果 → 注入 token”这套验证码自动化链路,又不想给每个节点单独写胶水代码?完全可以,而且比 Zapier 更省事:n8n 原生支持循环,四个 HTTP Request 节点加一个 Wait 节点就够了,Zapier 只有 Paths,写不出真正的重试逻辑。下面按节点顺序搭建。
验证码自动化流程总览
Manual Trigger / Cron
↓
HTTP Request: Submit CAPTCHA
↓
Wait: 10 seconds
↓
Loop: Poll until solved
├── HTTP Request: Get result
├── IF: status == 1? → Exit loop
└── Wait: 5 seconds → Loop again
↓
HTTP Request: Use token
搭建步骤
第 1 步:提交验证码任务
加一个 HTTP Request 节点发送任务,配置如下:
- 方法:
POST - URL:
https://ocr.captchaai.com/in.php - 请求体类型:
Form URL Encoded
请求体参数:
key:{{ $credentials.captchaaiApiKey }},或直接硬编码密钥method:userrecaptchagooglekey:6Le-SITEKEYpageurl:https://example.comjson:1
提示:轮询间隔别设太短,容易频繁撞上
CAPCHA_NOT_READY。
正常返回:
{
"status": 1,
"request": "71823456"
}
第 2 步:等待求解器开始处理
再加一个 Wait 节点,别急着轮询:等待时长设为 10,单位选 Seconds。留出这段时间,避免第一次轮询就扑空。
第 3 步:轮询结果,并处理重试
n8n 有两种循环方式:Loop Over Items 节点,或把 IF 节点的 false 输出连回上一个节点。
方案 A:用 IF 节点做简单轮询
加一个 HTTP Request 节点(轮询用):
- 方法:
GET - URL:
https://ocr.captchaai.com/res.php - 查询参数:
key、action=get、id={{ $json.request }}、json=1
把它接到一个 IF 节点,条件设为 {{ $json.status }} Equal 1:
- True 输出 → 进入下一步(使用 token)
- False 输出 → Wait(5 秒)→ 回到轮询节点
方案 B:用 Code 节点写轮询逻辑
想要更精细的控制,就用 Code 节点:
const apiKey = 'YOUR_API_KEY';
const taskId = $input.first().json.request;
for (let i = 0; i < 24; i++) {
await new Promise(r => setTimeout(r, 5000));
const resp = await fetch(
`https://ocr.captchaai.com/res.php?key=${apiKey}&action=get&id=${taskId}&json=1`
);
const data = await resp.json();
if (data.status === 1) {
return [{ json: { token: data.request, taskId } }];
}
if (data.request !== 'CAPCHA_NOT_READY') {
throw new Error(`CaptchaAI error: ${data.request}`);
}
}
throw new Error(`Task ${taskId} timed out`);
第 4 步:把 token 提交到目标表单
再加一个 HTTP Request 节点,用 token 提交表单:
- 方法:
POST - URL:
https://staging.example.com/submit - 请求体类型:
Form URL Encoded
请求体参数里除了你原本的表单字段,还要带上 g-recaptcha-response,值为 {{ $json.token }}。
API Key 的安全存放方式
推荐用 n8n 自带的 Credentials 系统,不要写死在节点里:
- 打开 Credentials → Add Credential → Header Auth
- 名称填:
CaptchaAI API Key - 把密钥填进去,n8n 会加密存储
也可以用环境变量:
# In your n8n environment
export CAPTCHAAI_API_KEY="your_key_here"
在节点中这样引用:{{ $env.CAPTCHAAI_API_KEY }}
图片验证码怎么接入这套流程
图片验证码(Image/OCR)只需改提交节点参数:
method:base64body:Base64 编码后的图片(来自前面的节点或某个 URL)
图片是 URL 的话,先加一个 Code 节点转成 base64:
const imageUrl = $input.first().json.imageUrl;
const resp = await fetch(imageUrl);
const buffer = Buffer.from(await resp.arrayBuffer());
const base64 = buffer.toString('base64');
return [{ json: { imageBase64: base64 } }];
顺手加一个余额监控工作流
再建一个独立的定时工作流:
Cron (daily at 9 AM)
↓
HTTP Request: GET res.php?action=getbalance
↓
IF: balance < 5
↓
Slack / Email: "CaptchaAI balance low: $X.XX"
选型与排错
n8n 和 Zapier,哪个更适合验证码自动化
- 循环 / 重试支持:n8n 原生支持(IF 循环、Loop 节点);Zapier 有限,只能靠 Paths 绕。
- 自托管:n8n 支持且免费;Zapier 不支持,只有云端。
- Code 节点:n8n 提供完整 JavaScript;Zapier 功能受限。
- 成本:n8n 自托管免费,或选付费云端;Zapier 按任务计费。
- 上手难度:n8n 中等;Zapier 更简单。
轮询重试是验证码工作流的核心逻辑,n8n 靠原生循环和 Code 节点能完整实现,这一点比 Zapier 更合适。
常见故障排查
- 轮询循环一直停不下来:没设最大迭代次数 → 加一个计数器变量,24 次迭代后强制中断。
CAPCHA_NOT_READY反复出现:第一次轮询前等待太短 → 把初始等待时间拉长到 15–20 秒。- 下一个节点拿不到 token:表达式路径写错了 → 核对
{{ $json.token }}是否对应正确的输出字段。 - 提示找不到凭据:环境变量没设置 → 设置好环境变量后重启 n8n。
常见问题
n8n 搭建验证码自动化要花钱吗?
不一定。n8n 自托管免费,只需一台能跑 Docker 或 Node.js 的服务器;云端版本才收订阅费。
轮询一直返回 CAPCHA_NOT_READY 怎么办?
多半是首次轮询等太早。把第 2 步等待时长调到 15–20 秒,多数任务此时已出结果。
一个工作流能同时处理多个验证码任务吗?
可以。用 Split In Batches 节点拆开跑,每项各走一遍提交 → 轮询 → 使用。
这套流程能处理 GeeTest 或其他类型的验证码吗?
能,思路一样,只是 method 和参数不同。国内站点更常见 GeeTest(极验)滑块验证码,CaptchaAI 支持 GeeTest v3,换成 gt、challenge、pageurl 即可复用轮询逻辑。
开始为你的 n8n 工作流接入验证码解决
去 CaptchaAI 官网 拿到 API Key,照上面的节点顺序搭起来即可。