API 教程

如何逐步解决 BLS 验证码

BLS CAPTCHA 是 BLS 国际签证预约系统上使用的基于图像的自定义质询。它显示多个图像,并要求用户根据文本指令选择特定图像 - 类似于 reCAPTCHA 网格,但具有不同的图像和自定义指令。

本指南涵盖提取图像、将其提交到 CaptchaAI 以及使用该解决方案填写 BLS 表格。


要求

物品 价值
CaptchaAI API 密钥 验证码网站
BLS CAPTCHA 图像 从页面进行 Base64 编码
说明文字 说明要选择哪些图像的文本
语言 Python 3.7+ 或 Node.js 14+

第 1 步:从页面中提取图像和说明

BLS CAPTCHA 通常显示 3–9 个图像,并带有文本指令,例如“选择所有带有汽车的图像”。

使用硒

from selenium import webdriver
from selenium.webdriver.common.by import By
import base64
import requests as req

driver = webdriver.Chrome()
driver.get("https://blsitalypakistan.com/appointment")

# Get instruction text
instruction = driver.find_element(By.CSS_SELECTOR, ".captcha-instruction").text
print(f"Instruction: {instruction}")

# Get all captcha images as base64
images = {}
captcha_imgs = driver.find_elements(By.CSS_SELECTOR, ".captcha-image img")
for i, img in enumerate(captcha_imgs, 1):
    src = img.get_attribute("src")
    if src.startswith("data:image"):
        # Already base64
        images[f"image_base64_{i}"] = src.split(",")[1]
    else:
        # Download and encode
        img_data = req.get(src).content
        images[f"image_base64_{i}"] = base64.b64encode(img_data).decode()

使用Puppeteer

const puppeteer = require('puppeteer');

const browser = await puppeteer.launch({ headless: 'new' });
const page = await browser.newPage();
await page.goto('https://blsitalypakistan.com/appointment');

// Get instruction
const instruction = await page.$eval('.captcha-instruction', el => el.textContent);

// Get images as base64
const images = await page.$$eval('.captcha-image img', imgs =>
  imgs.map((img, i) => ({
    key: `image_base64_${i + 1}`,
    value: img.src.startsWith('data:') ? img.src.split(',')[1] : null
  }))
);

第二步:提交至CaptchaAI

将指令文本和所有图像发送到 BLS 求解器。

Python

import requests
import time

API_KEY = "YOUR_API_KEY"

payload = {
    "key": API_KEY,
    "method": "bls",
    "instructions": instruction,
    "json": 1
}

# Add each image (up to 9)
for key, value in images.items():
    payload[key] = value

response = requests.post("https://ocr.captchaai.com/in.php", data=payload)
data = response.json()

if data.get("status") != 1:
    raise Exception(f"Submit error: {data.get('request')}")

task_id = data["request"]
print(f"Task submitted: {task_id}")

Node.js

const axios = require('axios');
const FormData = require('form-data');

async function submitBLS(instruction, images) {
  const params = {
    key: 'YOUR_API_KEY',
    method: 'bls',
    instructions: instruction,
    json: 1,
    ...Object.fromEntries(images.map(img => [img.key, img.value]))
  };

  const { data } = await axios.post('https://ocr.captchaai.com/in.php', null, { params });
  if (data.status !== 1) throw new Error(data.request);
  return data.request;
}

第 3 步:民意调查解决方案

该解决方案返回正确图像的索引。

Python

def get_bls_solution(task_id):
    for _ in range(30):
        time.sleep(5)
        result = requests.get("https://ocr.captchaai.com/res.php", params={
            "key": API_KEY,
            "action": "get",
            "id": task_id,
            "json": 1
        }).json()

        if result.get("status") == 1:
            return result["request"]  # e.g., "1,3,5" (image indices)
        if result.get("request") != "CAPCHA_NOT_READY":
            raise Exception(f"Error: {result.get('request')}")

    raise Exception("Timeout")

solution = get_bls_solution(task_id)
print(f"Select images: {solution}")  # e.g., "1,3,5"

第 4 步:单击正确的图像

使用返回的索引来单击页面上相应的图像:

# Parse the solution indices
selected = [int(i) for i in solution.split(",")]

# Click each correct image
captcha_imgs = driver.find_elements(By.CSS_SELECTOR, ".captcha-image img")
for idx in selected:
    captcha_imgs[idx - 1].click()  # Convert 1-based to 0-based
    time.sleep(0.3)  # Small delay between clicks

# Submit the form
driver.find_element(By.CSS_SELECTOR, ".captcha-submit").click()

完整的 Python 示例

import requests
import time
import base64
from selenium import webdriver
from selenium.webdriver.common.by import By

API_KEY = "YOUR_API_KEY"
driver = webdriver.Chrome()
driver.get("https://blsitalypakistan.com/appointment")

# 1. Extract instruction and images
instruction = driver.find_element(By.CSS_SELECTOR, ".captcha-instruction").text
captcha_imgs = driver.find_elements(By.CSS_SELECTOR, ".captcha-image img")

payload = {"key": API_KEY, "method": "bls", "instructions": instruction, "json": 1}
for i, img in enumerate(captcha_imgs, 1):
    src = img.get_attribute("src")
    if src.startswith("data:image"):
        payload[f"image_base64_{i}"] = src.split(",")[1]

# 2. Submit to CaptchaAI
resp = requests.post("https://ocr.captchaai.com/in.php", data=payload).json()
task_id = resp["request"]

# 3. Poll for solution
for _ in range(30):
    time.sleep(5)
    result = requests.get("https://ocr.captchaai.com/res.php", params={
        "key": API_KEY, "action": "get", "id": task_id, "json": 1
    }).json()
    if result.get("status") == 1:
        selected = [int(i) for i in result["request"].split(",")]
        break

# 4. Click correct images and submit
for idx in selected:
    captcha_imgs[idx - 1].click()
    time.sleep(0.3)
driver.find_element(By.CSS_SELECTOR, ".captcha-submit").click()

print("CAPTCHA solved!")
driver.quit()

故障排除

错误 原因 处理方式
ERROR_BAD_PARAMETERS 缺少说明或图像 包括文字说明和至少一张图像
ERROR_CAPTCHA_UNSOLVABLE 图像太模糊或无法识别 捕捉更高质量的图像;确保base64编码正确
选择了错误的图像 图像顺序不正确 确保图像按正确的显示顺序编号
解决方案被拒绝 提取后图像发生变化 提取图像并立即提交

完整的可运行示例

需要一个包含环境设置、轮询、重试和错误处理的完整工作项目吗?

请参阅 GitHub 上的完整可运行示例 →


常问问题

BLS CAPTCHA 显示了多少张图片?

通常 3-9 个图像。该数字因页面和会话而异。

图像应该采用什么格式?

Base64 编码的 PNG 或 JPEG。发送前删除 data:image/...;base64, 前缀。

BLS CAPTCHA 解决需要多长时间?

通常为 15–30 秒。图像识别挑战比基于文本的验证码需要更长的时间。

我可以在没有 Selenium 的情况下解决 BLS CAPTCHA 问题吗?

是的,如果您可以通过 HTTP 请求提取图像和说明。 CaptchaAI API只需要base64图像和指令文本。


相关指南

该文章已禁用评论。