Airtable 是一个灵活的数据库平台,用于项目管理、数据收集和工作流程自动化。当您的 Airtable 工作流程需要与受验证码保护的服务交互时(提交表单、处理 URL 或自动输入数据)CaptchaAI可以使用其自动化和脚本扩展直接从 Airtable 解决验证码。
本指南介绍如何设置 Airtable Automation,以便在创建或更新新记录时通过 CaptchaAI 触发验证码解决。
真实场景
您可以在 Airtable 表中跟踪目标 URL。每个 URL 都有一个验证码,需要先解决该验证码才能提取数据。添加新 URL 时:
- Airtable Automation 检测到新记录
- 脚本将验证码参数提交给 CaptchaAI
- CaptchaAI 返回已解决的令牌
- 令牌被保存回 Airtable 记录
表结构
使用以下字段创建一个名为 CAPTCHA Tasks 的 Airtable 表:
| 字段名称 | 类型 | 目的 |
|---|---|---|
| 网址 | 网址 | 目标页面网址 |
| 站点密钥 | 单行文本 | reCAPTCHA 站点密钥 |
| 地位 | 单选 | 待决、正在解决、已解决、失败 |
| 代币 | 长文本 | 已解决验证码令牌 |
| 解决于 | 日期/time | 解决的时间戳 |
| 错误 | 单行文本 | 如果失败则出现错误消息 |
第 1 步:创建自动化
在空中表中:
- 转到 自动化 选项卡
- 单击创建自动化
- 将其命名为:“在新记录上解决验证码”
扳机
选择当记录符合条件:
- 表:CAPTCHA 任务
- 条件:状态为“待处理”
每当记录设置为“待处理”时就会触发 - 涵盖新记录和重新解决。
第 2 步:添加脚本操作
添加操作 → 运行脚本:
// Airtable Automation Script — Solve CAPTCHA via CaptchaAI
// Input configuration (set in the left panel):
// - recordId: Record ID from trigger
// - sitekey: Sitekey field from trigger
// - pageurl: URL field from trigger
const config = input.config();
const recordId = config.recordId;
const sitekey = config.sitekey;
const pageurl = config.pageurl;
const API_KEY = 'YOUR_API_KEY'; // Use input.config() for security
// Update status to "solving"
const table = base.getTable('CAPTCHA Tasks');
await table.updateRecordAsync(recordId, {
'Status': { name: 'solving' },
});
try {
// Step 1: Submit task to CaptchaAI
const submitUrl = `https://ocr.captchaai.com/in.php?key=${API_KEY}&method=userrecaptcha&googlekey=${encodeURIComponent(sitekey)}&pageurl=${encodeURIComponent(pageurl)}&json=1`;
const submitResponse = await fetch(submitUrl);
const submitResult = await submitResponse.json();
if (submitResult.status !== 1) {
throw new Error(`Submit failed: ${submitResult.request}`);
}
const taskId = submitResult.request;
console.log(`Task submitted: ${taskId}`);
// Step 2: Poll for result (wait 15 seconds first)
await new Promise(resolve => setTimeout(resolve, 15000));
let token = null;
for (let i = 0; i < 20; i++) {
const pollUrl = `https://ocr.captchaai.com/res.php?key=${API_KEY}&action=get&id=${taskId}&json=1`;
const pollResponse = await fetch(pollUrl);
const pollResult = await pollResponse.json();
if (pollResult.status === 1) {
token = pollResult.request;
break;
}
if (pollResult.request !== 'CAPCHA_NOT_READY') {
throw new Error(`Solve failed: ${pollResult.request}`);
}
await new Promise(resolve => setTimeout(resolve, 5000));
}
if (!token) {
throw new Error('Polling timeout — CAPTCHA not solved in time');
}
// Step 3: Update record with solved token
await table.updateRecordAsync(recordId, {
'Status': { name: 'solved' },
'Token': token,
'Solved At': new Date().toISOString(),
'Error': '',
});
console.log(`CAPTCHA solved for record ${recordId}`);
} catch (error) {
// Update record with error
await table.updateRecordAsync(recordId, {
'Status': { name: 'failed' },
'Error': error.message,
});
console.error(`Failed: ${error.message}`);
}
配置脚本输入
在脚本操作的左侧面板中,映射输入变量:
recordId→ 记录触发步骤的 IDsitekey→ 触发步骤中的 Sitekey 字段pageurl→ 触发步骤中的 URL 字段
第 3 步:使用脚本扩展进行批处理
要一次处理多个记录,请使用 Airtable 的 脚本扩展(在“应用程序”面板中提供):
// Batch CAPTCHA Solver — Airtable Scripting Extension
const API_KEY = 'YOUR_API_KEY';
const table = base.getTable('CAPTCHA Tasks');
// Get all pending records
const query = await table.selectRecordsAsync({
fields: ['URL', 'Sitekey', 'Status'],
});
const pendingRecords = query.records.filter(
r => r.getCellValueAsString('Status') === 'pending'
);
output.text(`Found ${pendingRecords.length} pending CAPTCHAs`);
for (const record of pendingRecords) {
const sitekey = record.getCellValueAsString('Sitekey');
const pageurl = record.getCellValueAsString('URL');
if (!sitekey || !pageurl) {
output.text(`Skipping ${record.id} — missing sitekey or URL`);
continue;
}
output.text(`Solving for: ${pageurl}`);
await table.updateRecordAsync(record.id, {
'Status': { name: 'solving' },
});
try {
// Submit
const submitResp = await fetch(
`https://ocr.captchaai.com/in.php?key=${API_KEY}&method=userrecaptcha&googlekey=${encodeURIComponent(sitekey)}&pageurl=${encodeURIComponent(pageurl)}&json=1`
);
const submitData = await submitResp.json();
if (submitData.status !== 1) throw new Error(submitData.request);
// Poll
await new Promise(r => setTimeout(r, 15000));
let token = null;
for (let i = 0; i < 20; i++) {
const pollResp = await fetch(
`https://ocr.captchaai.com/res.php?key=${API_KEY}&action=get&id=${submitData.request}&json=1`
);
const pollData = await pollResp.json();
if (pollData.status === 1) { token = pollData.request; break; }
if (pollData.request !== 'CAPCHA_NOT_READY') throw new Error(pollData.request);
await new Promise(r => setTimeout(r, 5000));
}
if (!token) throw new Error('Timeout');
await table.updateRecordAsync(record.id, {
'Status': { name: 'solved' },
'Token': token,
'Solved At': new Date().toISOString(),
});
output.text(`✓ Solved: ${pageurl}`);
} catch (e) {
await table.updateRecordAsync(record.id, {
'Status': { name: 'failed' },
'Error': e.message,
});
output.text(`✗ Failed: ${e.message}`);
}
}
output.text('Batch processing complete');
故障排除
| 问题 | 原因 | 处理方式 |
|---|---|---|
| 自动化不触发 | 记录与“待处理”条件不匹配 | 验证状态字段值完全匹配 |
fetch is not defined |
Airtable 脚本在某些情况下使用 remoteFetchAsync |
尝试 remoteFetchAsync 而不是 fetch |
| 脚本超时 | Airtable 脚本的自动化时间限制为 30 秒 | 使用更少的轮询迭代;将初始等待时间增加到 20 秒 |
| 记录更新失败 | 字段名称不匹配 | 确保 updateRecordAsync 中的字段名称与表完全匹配 |
| 脚本中公开的 API 密钥 | 硬编码 API 密钥 | 将 input.config() 与秘密输入变量一起使用 |
常问问题
Airtable 中的脚本执行时间限制是多少?
自动化脚本:30 秒。脚本扩展:30 秒(但可以通过 Pro 计划进行扩展)。对于长轮询,增加初始等待并减少迭代。
我也可以将其用于图像验证码吗?
是的。将method更改为base64并提交图像数据。您可以将 Base64 编码的验证码图像存储在 Airtable 附件字段中,并将其提取到脚本中。
如何安全地处理 API 密钥?
在自动化中,使用在脚本设置面板中配置的输入变量。在脚本扩展中,您可以在运行时使用 input.textAsync() 提示输入密钥。
我可以重新解决失败的验证码吗?
是的。将状态设置回“待处理”,自动化将重新触发。添加重试计数器字段以限制重试。
相关文章
- 如何使用Api解决Recaptcha V2回调
- Recaptcha V2 Turnstile同一站点处理
- Recaptcha V2回调机制
下一步
从 Airtable 数据库自动解决验证码问题 -获取您的 CaptchaAI API 密钥并设置自动化。
相关指南:
- Google Apps 脚本 + CaptchaAI
- Zapier + CaptchaAI:无代码验证码解决
- 制作 (Integromat) + CaptchaAI