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编码正确 |
| 选择了错误的图像 | 图像顺序不正确 | 确保图像按正确的显示顺序编号 |
| 解决方案被拒绝 | 提取后图像发生变化 | 提取图像并立即提交 |
完整的可运行示例
需要一个包含环境设置、轮询、重试和错误处理的完整工作项目吗?
常问问题
BLS CAPTCHA 显示了多少张图片?
通常 3-9 个图像。该数字因页面和会话而异。
图像应该采用什么格式?
Base64 编码的 PNG 或 JPEG。发送前删除 data:image/...;base64, 前缀。
BLS CAPTCHA 解决需要多长时间?
通常为 15–30 秒。图像识别挑战比基于文本的验证码需要更长的时间。
我可以在没有 Selenium 的情况下解决 BLS CAPTCHA 问题吗?
是的,如果您可以通过 HTTP 请求提取图像和说明。 CaptchaAI API只需要base64图像和指令文本。