BLS CAPTCHAs zeigen Bildraster an, in denen Benutzer Bilder auswählen oder neu anordnen müssen. In diesem Leitfaden werden Rasterlayouts, Antwortformate und die korrekte Übermittlung von Lösungen behandelt.
BLS-Grid-Challenge-Typen
Bildbestellung
Der Benutzer muss Bilder in einer bestimmten Reihenfolge anordnen (z. B. aufsteigende Zahlen, alphabetische Reihenfolge).
Bildauswahl
Der Benutzer muss auf bestimmte Bilder klicken, die einer Beschreibung entsprechen (z. B. „Alle Bilder mit Text auswählen“).
Musterübereinstimmung
Der Benutzer muss identifizieren, welche Bilder mit einem präsentierten Muster oder Muster übereinstimmen.
Rasterlayout-Zuordnung
# grid_mapping.py
# BLS grids typically use 3x3 or 4x4 layouts
# Each cell maps to an index:
# 3x3 grid:
# [0] [1] [2]
# [3] [4] [5]
# [6] [7] [8]
# 4x4 grid:
# [0] [1] [2] [3]
# [4] [5] [6] [7]
# [8] [9] [10] [11]
# [12] [13] [14] [15]
def grid_position(index, cols=3):
"""Convert flat index to row, column."""
return index // cols, index % cols
def index_from_position(row, col, cols=3):
"""Convert row, column to flat index."""
return row * cols + col
# Example: For a 3x3 grid, position (1, 2) = index 5
print(grid_position(5, cols=3)) # (1, 2)
print(index_from_position(1, 2)) # 5
Lösen von BLS Grid CAPTCHAs
# solve_bls_grid.py
import requests
import time
import os
import json
def solve_bls_grid(sitekey, pageurl, instructions=None):
"""Solve a BLS grid CAPTCHA and get response indices."""
api_key = os.environ["CAPTCHAAI_API_KEY"]
payload = {
"key": api_key,
"method": "bls",
"sitekey": sitekey,
"pageurl": pageurl,
"json": 1,
}
if instructions:
payload["instructions"] = instructions
resp = requests.post(
"https://ocr.captchaai.com/in.php",
data=payload,
timeout=30,
)
result = resp.json()
if result.get("status") != 1:
raise RuntimeError(f"Submit failed: {result.get('request')}")
task_id = result["request"]
time.sleep(10)
for _ in range(30):
resp = requests.get("https://ocr.captchaai.com/res.php", params={
"key": api_key,
"action": "get",
"id": task_id,
"json": 1,
}, timeout=15)
data = resp.json()
if data.get("status") == 1:
return data["request"]
if data["request"] != "CAPCHA_NOT_READY":
raise RuntimeError(data["request"])
time.sleep(5)
raise TimeoutError("BLS grid solve timeout")
Grid-Antworten analysieren
# parse_response.py
import json
def parse_grid_response(solution):
"""Parse CaptchaAI BLS response into actionable grid data."""
# Solution may be JSON or comma-separated indices
if isinstance(solution, str):
try:
parsed = json.loads(solution)
return parsed
except json.JSONDecodeError:
pass
# Try comma-separated indices
if "," in solution:
return [int(x.strip()) for x in solution.split(",")]
# Single value
return [solution]
return solution
def format_for_submission(indices, grid_size=9):
"""Format indices for form submission."""
# Some sites expect a bitmask
bitmask = ["0"] * grid_size
for idx in indices:
if isinstance(idx, int) and 0 <= idx < grid_size:
bitmask[idx] = "1"
return {
"indices": indices,
"bitmask": "".join(bitmask),
"count": len(indices),
}
Injizieren von Grid-Lösungen mit Selenium
# inject_grid.py
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
import time
def click_grid_cells(driver, indices):
"""Click specific grid cells based on solution indices."""
wait = WebDriverWait(driver, 10)
# Find all grid cells
cells = wait.until(
EC.presence_of_all_elements_located(
(By.CSS_SELECTOR, ".captcha-grid .cell, .bls-grid img, .grid-item")
)
)
for idx in indices:
if isinstance(idx, int) and idx < len(cells):
cells[idx].click()
time.sleep(0.3) # Brief delay between clicks
def set_order_sequence(driver, ordered_indices):
"""Click grid cells in the correct order for ordering challenges."""
wait = WebDriverWait(driver, 10)
cells = wait.until(
EC.presence_of_all_elements_located(
(By.CSS_SELECTOR, ".captcha-grid .cell, .bls-grid img")
)
)
for idx in ordered_indices:
if isinstance(idx, int) and idx < len(cells):
cells[idx].click()
time.sleep(0.5) # Ordering needs pauses between clicks
def inject_hidden_response(driver, solution_value):
"""Set the solution in a hidden input field."""
driver.execute_script("""
var inputs = document.querySelectorAll(
'input[name*="captcha"], input[name*="response"], #captcha-answer'
);
for (var i = 0; i < inputs.length; i++) {
inputs[i].value = arguments[0];
}
""", str(solution_value))
Kompletter BLS-Grid-Flow
# full_flow.py
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
def handle_bls_grid(driver, pageurl):
"""Complete BLS grid CAPTCHA handling."""
wait = WebDriverWait(driver, 15)
# Wait for CAPTCHA to load
captcha = wait.until(
EC.presence_of_element_located(
(By.CSS_SELECTOR, "[data-sitekey], .bls-captcha")
)
)
sitekey = captcha.get_attribute("data-sitekey")
# Get instructions
instructions = None
try:
inst = driver.find_element(By.CSS_SELECTOR, ".captcha-instructions")
instructions = inst.text.strip()
except Exception:
pass
# Solve via CaptchaAI
solution = solve_bls_grid(sitekey, pageurl, instructions)
parsed = parse_grid_response(solution)
# Determine response method
grid_cells = driver.find_elements(
By.CSS_SELECTOR, ".captcha-grid .cell, .bls-grid img"
)
if grid_cells:
# Click-based response
if isinstance(parsed, list) and all(isinstance(x, int) for x in parsed):
click_grid_cells(driver, parsed)
else:
inject_hidden_response(driver, solution)
else:
# Hidden input response
inject_hidden_response(driver, solution)
# Submit
submit = driver.find_element(
By.CSS_SELECTOR, "button[type='submit'], .submit-btn, #verify"
)
submit.click()
return True
Fehlerbehebung
| Problem | Ursache | Lösung |
|---|---|---|
| Klickt auf falsche Zellen | Nichtübereinstimmung der Rasterzellenauswahl | Überprüfen Sie den HTML-Code des Rasters und aktualisieren Sie die CSS-Selektoren |
| Bestellung abgelehnt | Zu schnelles Klicken | Fügen Sie zwischen den Klicks Verzögerungen von 300–500 ms hinzu |
| Nicht übereinstimmendes Lösungsformat | Site erwartet Bitmaske, hat Indizes | Verwenden Sie zum Konvertieren format_for_submission() |
| Netz nicht vollständig ausgelastet | Bilder werden langsam geladen | Warten Sie, bis alle Rasterbilder geladen sind, bevor Sie das Problem lösen |
FAQ
Woher kennt CaptchaAI das Rasterlayout?
CaptchaAI empfängt die CAPTCHA-Herausforderung von den BLS-Servern und löst sie aus der Ferne. Sie geben den Sitekey und die PageURL an; Die API übernimmt die Rasteranalyse.
Was passiert, wenn sich das Raster ändert, nachdem ich es eingereicht habe?
Einige BLS-Formulare zeigen eine zweite Herausforderung, nachdem die erste bestanden wurde. Behandeln Sie dies, indem Sie nach der Übermittlung nach einem neuen CAPTCHA-Element suchen.
Kann ich eine BLS-Grid-Lösung wiederverwenden?
Nein. Jede Lösung ist an eine bestimmte Challenge-Sitzung gebunden. Immer frisch lösen.
Verwandte Leitfäden
- BLS CAPTCHA Parameter Deep Dive
- BLS CAPTCHA Fehler und Fehlerbehebung
Bewältigen Sie die Herausforderungen des BLS-Rasters – Beginnen Sie mit CaptchaAI.
Diskussionen (0)
Beteiligen Sie sich an der Unterhaltung
Melden Sie sich an, um Ihre Meinung zu teilen.
AnmeldenNoch keine Kommentare.