Hướng Dẫn API

Giải CAPTCHA toán học bằng tham số CaptchaAI calc

Dán chuỗi OCR đọc được ("3+7") vào ô trả lời CAPTCHA toán học sẽ luôn sai — form đích chờ con số 10. Đặt calc=1, CaptchaAI tự tính và trả về con số bạn dán thẳng vào input, không cần viết thêm dòng eval nào.

Lưu ý: calc chỉ ảnh hưởng tới nội dung trả về của res.php — không thay đổi cách bạn gửi ảnh lên in.php. Toàn bộ luồng base64 → task ID → polling giữ nguyên như CAPTCHA hình ảnh thông thường.


Vì sao nên để CaptchaAI tự tính thay vì tự eval

Một nhóm QA outsourcing ở TP.HCM test form đăng ký staging có CAPTCHA "7 × 4 = ?". Tự parse ký hiệu ×, ÷ rồi eval tay dễ vỡ khi gặp dấu ngoặc hoặc số âm. Đặt calc=1numeric=1, CaptchaAI trả thẳng đáp số.

Rủi ro khi tự parse chuỗi OCR

Viết regex tách toán tử rồi gọi eval() trên chuỗi chưa kiểm tra là lỗ hổng thực thi mã tùy ý — cần whitelist ký tự trước khi eval, và vẫn có thể vỡ khi gặp ×/÷ không phải ASCII hoặc số thập phân dạng 1,5.

Lợi ích khi để CaptchaAI xử lý

calc=1 chuyển việc tính toán sang phía CaptchaAI: pipeline QA chỉ cần đọc trường request trong JSON trả về và dán thẳng vào ô input, không cần duy trì logic parser riêng cho từng định dạng phép tính.


Hai giá trị của tham số calc

Giá trị calc CaptchaAI trả về gì
0 (mặc định) Chuỗi văn bản gốc, chưa tính (ví dụ: "3+7")
1 Đáp số đã tính xong (ví dụ: "10")

Chọn giá trị nào tùy vào nơi bạn muốn xử lý phép tính:

  • Dùng calc=1 khi form chỉ chấp nhận con số — trường hợp phổ biến nhất trong CAPTCHA đăng ký/staging.
  • Dùng calc=0 khi cần giữ lại biểu thức gốc để log lại hoặc tự parse theo quy tắc riêng của bạn.

Gửi request và polling kết quả với Python

Gửi base64 tới in.php với calc=1, polling res.php — luồng gửi → ID task → polling → token.

import requests
import base64
import time
import os

API_KEY = os.environ["CAPTCHAAI_API_KEY"]

def solve_math_captcha(image_b64):
    """Solve a math CAPTCHA — returns the computed result."""
    resp = requests.post("https://ocr.captchaai.com/in.php", data={
        "key": API_KEY,
        "method": "base64",
        "body": image_b64,
        "calc": 1,          # Compute the math
        "numeric": 1,       # Result will be a number
        "json": 1,
    }, timeout=30)

    result = resp.json()
    if result.get("status") != 1:
        raise RuntimeError(result.get("request"))

    task_id = result["request"]

    time.sleep(8)
    for _ in range(24):
        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("Solve timeout")

# Example: Image shows "3 + 7 = ?"
# With calc=0: Returns "3+7"
# With calc=1: Returns "10"

Với ảnh "3 + 7 = ?": calc=0 trả "3+7", calc=1 trả thẳng "10".


Những định dạng phép tính calc xử lý tốt

Format              Example        Result
─────────────────────────────────────────
Addition            3 + 7 = ?      10
Subtraction         15 - 8 = ?     7
Multiplication      4 × 6 = ?      24
Division            20 ÷ 5 = ?     4
Mixed               3 + 4 × 2 = ?  11
Text-based          "three plus five"  8

Dạng viết bằng chữ ("three plus five") chính xác thấp hơn — nên bổ sung textinstructions.

Vài điểm cần nhớ khi đọc bảng trên:

  • calc xử lý tốt bốn phép tính cơ bản và biểu thức trộn (Mixed) theo đúng thứ tự ưu tiên toán tử.
  • Dạng viết bằng chữ là ngoại lệ — tỷ lệ đọc đúng thấp hơn hẳn dạng ký hiệu số.

Thêm textinstructions cho định dạng phức tạp

Mô tả định dạng qua textinstructions khi phép tính lồng ký hiệu lạ hoặc viết bằng chữ:

def solve_text_math_captcha(image_b64, instructions):
    """Solve a math CAPTCHA with custom instructions."""
    resp = requests.post("https://ocr.captchaai.com/in.php", data={
        "key": API_KEY,
        "method": "base64",
        "body": image_b64,
        "calc": 1,
        "textinstructions": instructions,
        "json": 1,
    }, timeout=30)
    return resp.json()

# Example instructions:
# "Solve the math expression and enter the number"
# "What is the result of the equation shown?"
# "Enter the sum of the two numbers"

Ba mẫu instructions trong comment là điểm khởi đầu — chỉnh theo đúng CAPTCHA thực tế.

  • Mô tả càng cụ thể (nêu rõ "tổng", "hiệu", "tích") càng giảm nhầm lẫn khi ảnh mờ hoặc font lạ.
  • Giữ instructions ngắn gọn — một câu là đủ, CaptchaAI không cần đoạn văn dài để hiểu ngữ cảnh.

Chuẩn hóa kết quả và xử lý ngoại lệ

Kết quả có thể là số âm, số thập phân, hoặc hiếm khi vẫn chưa tính:

# edge_cases.py

def validate_math_result(answer):
    """Validate and clean math CAPTCHA result."""
    if not answer:
        return None

    # Remove spaces
    answer = answer.strip()

    # Handle negative results
    if answer.startswith("-"):
        try:
            return str(int(answer))
        except ValueError:
            return answer

    # Handle decimal results
    try:
        num = float(answer)
        if num == int(num):
            return str(int(num))
        return str(num)
    except ValueError:
        return answer

def solve_math_with_fallback(image_b64):
    """Try calc=1, fall back to manual parsing if needed."""
    # Try with calc
    result = solve_math_captcha(image_b64)

    # Validate result is actually a number
    try:
        float(result)
        return result
    except (ValueError, TypeError):
        pass

    # Fallback: solve without calc and compute locally
    resp = requests.post("https://ocr.captchaai.com/in.php", data={
        "key": API_KEY,
        "method": "base64",
        "body": image_b64,
        "calc": 0,      # Get the expression text
        "json": 1,
    }, timeout=30)

    # ... poll for result ...
    expression = "3+7"  # Example OCR result

    # Safely evaluate
    return str(safe_eval(expression))

def safe_eval(expression):
    """Safely evaluate a simple math expression."""
    # Only allow digits and basic operators
    import re
    cleaned = expression.replace("×", "*").replace("÷", "/").replace("=", "").replace("?", "")
    cleaned = cleaned.strip()

    if not re.match(r'^[\d\s+\-*/().]+$', cleaned):
        raise ValueError(f"Unsafe expression: {expression}")

    return eval(cleaned)  # Safe because we validated the pattern

safe_eval() chỉ nhận chữ số và toán tử cơ bản qua regex, an toàn hơn gọi eval() trực tiếp lên chuỗi OCR chưa kiểm tra.

Ba trường hợp validate_math_result() xử lý:

  • Số âm — giữ nguyên dấu - thay vì làm tròn về 0.
  • Số thập phân do làm tròn floating point — ép về số nguyên khi phần lẻ bằng 0.
  • Kết quả rỗng hoặc chưa parse được — trả None thay vì ném lỗi giữa pipeline.

Tích hợp vào form thật với Selenium

Chụp ảnh CAPTCHA, gửi cho solve_math_captcha(), điền đáp số rồi submit:

# full_flow.py
from selenium import webdriver
from selenium.webdriver.common.by import By
import base64
import os

def solve_math_captcha_on_page(driver, captcha_selector, input_selector, submit_selector):
    """Complete flow: capture math CAPTCHA, solve, enter answer."""

    # Capture CAPTCHA image
    captcha_el = driver.find_element(By.CSS_SELECTOR, captcha_selector)
    image_b64 = captcha_el.screenshot_as_base64

    # Solve with calc=1
    answer = solve_math_captcha(image_b64)
    print(f"Math answer: {answer}")

    # Enter the computed result
    input_el = driver.find_element(By.CSS_SELECTOR, input_selector)
    input_el.clear()
    input_el.send_keys(answer)

    # Submit
    driver.find_element(By.CSS_SELECTOR, submit_selector).click()

# Usage
driver = webdriver.Chrome()
driver.get("https://example.com/form")

solve_math_captcha_on_page(
    driver,
    captcha_selector="#captcha-image",
    input_selector="#captcha-answer",
    submit_selector="#submit-btn",
)

Áp dụng tương tự với Playwright hay Puppeteer trên staging — chỉ đổi API chụp phần tử và điền input.


Checklist trước khi đưa vào pipeline QA

Trước khi chạy calc=1 trên toàn bộ pipeline scraping/QA, xác nhận từng mục sau:

  • Đã đặt numeric=1 cùng calc=1 để ép kết quả trả về ở dạng số.
  • Có nhánh fallback về calc=0 + safe_eval() khi kết quả không phải số hợp lệ.
  • Đã test với ít nhất một mẫu số âm và một mẫu số thập phân trước khi chạy hàng loạt.
  • Log lại task_id và kết quả thô để đối chiếu khi tỷ lệ lỗi tăng bất thường.

Các lỗi thường gặp và cách xử lý

Vấn đề Nguyên nhân Cách xử lý
Trả về biểu thức thay vì đáp số Thiếu calc=1 Thêm calc=1
Đáp số sai OCR đọc nhầm toán tử (× thành +) Thêm textinstructions
Số nguyên trả về dạng thập phân Làm tròn floating point str(int(float(result)))
ERROR_CAPTCHA_UNSOLVABLE Ảnh quá méo/nhiễu Tiền xử lý ảnh trước khi gửi

Nếu một lỗi lặp lại trên cùng một dạng ảnh, thêm textinstructions mô tả đúng định dạng đó thường khắc phục nhanh hơn là tiền xử lý ảnh.


Câu hỏi thường gặp

Không truyền calc thì API trả về gì?

Chuỗi OCR gốc, ví dụ "3+7". Đặt calc=1 để nhận đáp số.

calc=1 có tính được phép toán có dấu ngoặc hoặc lũy thừa không?

Không đáng tin cậy — dùng calc=0 rồi parse cục bộ bằng safe_eval() ở trên.

Kết quả âm có được trả đúng không?

Có, ví dụ "5 - 8 = ?" trả về "-3".

Vì sao đáp số đôi khi là số thập phân dù đề bài toàn số nguyên?

Làm tròn floating point. Ép kiểu str(int(float(result))) là đủ.

Giải nhiều CAPTCHA toán học cùng lúc có tính thêm phí không?

Không. CaptchaAI tính phí theo thread — BASIC ($15/tháng, 5 thread) giải không giới hạn trong 5 thread song song.


Hướng dẫn liên quan


Đặt calc=1 và để CaptchaAI tự tính đáp số — bắt đầu dùng CaptchaAI.

Os comentários estão desativados para este artigo.