两者都显示用户必须根据文本提示选择的图像。但 BLS CAPTCHA 是专门用于 BLS 国际签证系统的 自定义实现,而 reCAPTCHA 是 Google 在全球部署的解决方案。解决方法、集成要求和 CaptchaAI API 方法存在显着差异。
并排比较
| 特征 | BLS CAPTCHA | reCAPTCHA 网格 |
|---|---|---|
| 提供商 | BLS 国际(定制) | 谷歌 |
| 格式 | 分离不同的图像 (3-9) | 单幅图像分割成网格(3×3 或 4×4) |
| 动态瓷砖 | 否 — 固定图像集 | 是的 - 选择后新图块会淡入 |
| 行为分析 | 最小 | 广泛(鼠标、计时、IP) |
| 评分系统 | 没有任何 | 对每个请求进行风险分析 |
| API方法 | method=bls |
method=userrecaptcha |
| 所需参数 | instructions、image_base64_1..9 |
googlekey、pageurl |
| 响应格式 | 图像索引(例如,1,3,5) |
令牌字符串 |
| 基于令牌的解决方案 | 否 — 必须直接求解图像 | 是 - token 方法在内部处理网格 |
| 需要浏览器 | 是(必须从 DOM 中提取图像) | 可选(令牌方法无需浏览器即可使用) |
| 使用地点 | 仅限 BLS 签证预约网站 | 全球数百万个网站 |
| 典型求解时间 | 5-15秒 | 10-30秒 |
用 CaptchaAI 解决 BLS CAPTCHA
BLS 需要从页面中提取每个图像,将它们编码为 base64,并与指令文本一起发送。
Python:
import requests
import base64
import time
from selenium import webdriver
from selenium.webdriver.common.by import By
driver = webdriver.Chrome()
driver.get("https://example-bls-site.com/appointment")
# Step 1: Extract instruction text
instruction = driver.find_element(By.CSS_SELECTOR, ".captcha-instruction").text
# Example: "Select all images with a motorcycle"
# Step 2: Extract and encode each image
images = driver.find_elements(By.CSS_SELECTOR, ".captcha-image img")
image_data = {}
for i, img in enumerate(images, 1):
# Get image source and convert to base64
src = img.get_attribute("src")
if src.startswith("data:image"):
b64 = src.split(",")[1]
else:
img_bytes = requests.get(src).content
b64 = base64.b64encode(img_bytes).decode()
image_data[f"image_base64_{i}"] = b64
# Step 3: Submit to CaptchaAI
payload = {
"key": "YOUR_API_KEY",
"method": "bls",
"instructions": instruction,
**image_data
}
resp = requests.post("https://ocr.captchaai.com/in.php", data=payload)
task_id = resp.text.split("|")[1]
# Step 4: Poll for result
for _ in range(30):
time.sleep(5)
result = requests.get("https://ocr.captchaai.com/res.php", params={
"key": "YOUR_API_KEY", "action": "get", "id": task_id
})
if result.text.startswith("OK|"):
indices = result.text.split("|")[1] # e.g., "1,3,5"
break
# Step 5: Click the correct images
for idx in indices.split(","):
images[int(idx) - 1].click()
time.sleep(0.3) # Small delay between clicks
Node.js:
const axios = require("axios");
const puppeteer = require("puppeteer");
(async () => {
const browser = await puppeteer.launch({ headless: "new" });
const page = await browser.newPage();
await page.goto("https://example-bls-site.com/appointment");
// Extract instruction text
const instruction = await page.$eval(
".captcha-instruction",
(el) => el.textContent,
);
// Extract images as base64
const imageElements = await page.$$(".captcha-image img");
const imageData = {};
for (let i = 0; i < imageElements.length; i++) {
const src = await imageElements[i].evaluate((el) => el.src);
let b64;
if (src.startsWith("data:image")) {
b64 = src.split(",")[1];
} else {
const resp = await axios.get(src, { responseType: "arraybuffer" });
b64 = Buffer.from(resp.data).toString("base64");
}
imageData[`image_base64_${i + 1}`] = b64;
}
// Submit to CaptchaAI
const formData = new URLSearchParams({
key: "YOUR_API_KEY",
method: "bls",
instructions: instruction,
...imageData,
});
const submitResp = await axios.post(
"https://ocr.captchaai.com/in.php",
formData.toString(),
);
const taskId = submitResp.data.split("|")[1];
// Poll for result
let indices;
for (let i = 0; i < 30; i++) {
await new Promise((r) => setTimeout(r, 5000));
const result = await axios.get("https://ocr.captchaai.com/res.php", {
params: { key: "YOUR_API_KEY", action: "get", id: taskId },
});
if (result.data.startsWith("OK|")) {
indices = result.data.split("|")[1];
break;
}
}
// Click correct images
for (const idx of indices.split(",")) {
await imageElements[parseInt(idx) - 1].click();
await new Promise((r) => setTimeout(r, 300));
}
await browser.close();
})();
使用 CaptchaAI 解决 reCAPTCHA 网格问题
reCAPTCHA 使用基于令牌的方法 - 无需提取图像。
Python:
import requests
import time
# Step 1: Extract sitekey from page
# <div class="g-recaptcha" data-sitekey="6Le-wvkS..."></div>
sitekey = "6Le-wvkSAAAAAPBMRTvw..."
page_url = "https://example.com/form"
# Step 2: Submit to CaptchaAI
resp = requests.get("https://ocr.captchaai.com/in.php", params={
"key": "YOUR_API_KEY",
"method": "userrecaptcha",
"googlekey": sitekey,
"pageurl": page_url
})
task_id = resp.text.split("|")[1]
# Step 3: Poll for token
for _ in range(60):
time.sleep(5)
result = requests.get("https://ocr.captchaai.com/res.php", params={
"key": "YOUR_API_KEY", "action": "get", "id": task_id
})
if result.text.startswith("OK|"):
token = result.text.split("|")[1]
break
# Step 4: Inject token (no clicking needed)
# Option A: Hidden field injection
driver.execute_script(
f'document.getElementById("g-recaptcha-response").value = "{token}";'
)
# Option B: Pure HTTP submission
requests.post(page_url, data={"g-recaptcha-response": token, "other_field": "value"})
Node.js:
const axios = require("axios");
async function solveRecaptchaGrid(sitekey, pageUrl) {
// Submit
const submitResp = await axios.get("https://ocr.captchaai.com/in.php", {
params: {
key: "YOUR_API_KEY",
method: "userrecaptcha",
googlekey: sitekey,
pageurl: pageUrl,
},
});
const taskId = submitResp.data.split("|")[1];
// Poll for token
for (let i = 0; i < 60; i++) {
await new Promise((r) => setTimeout(r, 5000));
const result = await axios.get("https://ocr.captchaai.com/res.php", {
params: { key: "YOUR_API_KEY", action: "get", id: taskId },
});
if (result.data.startsWith("OK|")) {
return result.data.split("|")[1];
}
}
throw new Error("Solve timed out");
}
集成复杂度比较
| 方面 | 劳工统计局 | reCAPTCHA 网格 |
|---|---|---|
| 图像提取 | 必须手动从 DOM 中提取每个图像 | 不需要——令牌方法在内部处理 |
| 指令处理 | 必须从页面中提取文本指令 | 不需要 |
| Base64编码 | 每张图片都需要 | 不需要 |
| 解决方案应用 | 按返回的索引单击单个图像 | 将token 提交隐藏字段或 HTTP POST |
| 浏览器自动化 | 必需——没有无头替代品 | 可选 — 可以使用纯 HTTP 请求 |
| 错误恢复 | 失败时重新提取图像 | 失败时重新请求令牌 |
| 并发求解 | 有限——与浏览器会话相关的图像 | 简单——令牌请求是无状态的 |
| 代码行数(典型) | 40-60行 | 15-25行 |
何时使用哪种求解器
| 设想 | 推荐方法 |
|---|---|
| BLS签证预约 | 使用 method=bls 进行图像提取 |
| 任何带有 reCAPTCHA 的网站 | 将 method=userrecaptcha 与 sitekey 一起使用 |
| 嵌入 reCAPTCHA 的 BLS 网站 | 检查哪一个守卫行动 — BLS 站点有时同时使用两者 |
| 未知图像验证码 | 首先检查是否是BLS品牌;如果没有,请尝试 reCAPTCHA 或 OCR 方法 |
故障排除
| 问题 | 劳工统计局修复 | 验证码修复 |
|---|---|---|
| 返回错误答案 | 检查说明文本是否与页面显示的内容相符 | 验证 sitekey 和 pageurl 是否正确 |
| 图片未加载 | 获取图像 URL 时添加 User-Agent 和 cookie |
不适用 — 没有可获取的图像 |
| 令牌被拒绝 | 单击页面上正确顺序的索引 | 注入 g-recaptcha-response 并执行回调 |
| 解决速度太慢 | 减少图像数量——仅发送可见图像 | 在目标站点附近使用代理 |
常问问题
哪个更难解决?
BLS 需要更多的集成工作(图像提取、指令解析和基于索引的点击),但图像通常更清晰、更简单。 reCAPTCHA 更容易集成(令牌方法),但 Google 面临的挑战对于动态图块可能会更加复杂。
我可以使用 BLS 的 reCAPTCHA 令牌方法吗?
不。BLS 不是 reCAPTCHA 实现。您必须将 method=bls 与单独的 Base64 编码图像和说明文本一起使用。
两者都使用谷歌的技术吗?
否。BLS CAPTCHA 是专为 BLS International 签证服务构建的定制专有实施。 reCAPTCHA 是 Google 的产品,在全球数百万个网站中使用。
大规模解决哪个更具成本效益?
reCAPTCHA 令牌解决方案对于大批量操作通常更具成本效益,因为集成更简单(无图像提取开销)并且您可以运行并发无状态请求。 BLS 求解每个求解都需要一个浏览器会话。
我可以在同一页面上解决这两种类型吗?
是的。一些 BLS 站点使用自定义 CAPTCHA 进行初始验证,并使用 reCAPTCHA 进行表单提交。分别检测每种类型并为每种类型使用适当的 CaptchaAI 方法。
相关指南
- 如何一步步解决BLS CAPTCHA— 完整的 BLS 集成演练
- 如何使用API解决reCAPTCHA v2— 完整的 reCAPTCHA v2 教程
- reCAPTCHA 网格挑战解释— 网格挑战如何运作
- BLS 验证码错误和故障排除— BLS 特定错误修复