Comparisons

BLS CAPTCHA 与 reCAPTCHA Grid — 比较

两者都显示用户必须根据文本提示选择的图像。但 BLS CAPTCHA 是专门用于 BLS 国际签证系统的 自定义实现,而 reCAPTCHA 是 Google 在全球部署的解决方案。解决方法、集成要求和 CaptchaAI API 方法存在显着差异。


并排比较

特征 BLS CAPTCHA reCAPTCHA 网格
提供商 BLS 国际(定制) 谷歌
格式 分离不同的图像 (3-9) 单幅图像分割成网格(3×3 或 4×4)
动态瓷砖 否 — 固定图像集 是的 - 选择后新图块会淡入
行为分析 最小 广泛(鼠标、计时、IP)
评分系统 没有任何 对每个请求进行风险分析
API方法 method=bls method=userrecaptcha
所需参数 instructionsimage_base64_1..9 googlekeypageurl
响应格式 图像索引(例如,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 方法。


相关指南

该文章已禁用评论。

相关文章

Tutorials BLS CAPTCHA:理解指令代码并解决
BLS CAPTCHA 分步教程:理解指令代码并解决,具有可直接重用的示例和清晰的 Captcha AI 工作流程。

BLS CAPTCHA 分步教程:理解指令代码并解决,具有可直接重用的示例和清晰的 Captcha AI 工作流程。

Apr 26, 2026
Troubleshooting BLS 验证码错误和故障排除
BLS 验证错误和故障排除的实用指南,包括常见原因、诊断步骤以及适用于 Captcha AI 的具体修复方法。

BLS 验证错误和故障排除的实用指南,包括常见原因、诊断步骤以及适用于 Captcha AI 的具体修复方法。

Apr 24, 2026
Use Cases 政府门户网站中的 BLS 验证码:处理策略
政府门户网站中的 BLS 验证码实用指南:处理策略,包含现实场景、工作流程建议以及使用 Captcha AI 的可操作步骤。

政府门户网站中的 BLS 验证码实用指南:处理策略,包含现实场景、工作流程建议以及使用 Captcha AI 的可操作步骤。

Apr 25, 2026