Tài Liệu Tham Khảo

Di chuyển từ EndCaptcha sang CaptchaAI: Hướng dẫn ánh xạ API

Chuyển từ EndCaptcha sang CaptchaAI về bản chất là đổi cách gọi API: bỏ giao thức SOAP/XML với cặp username/password, chuyển sang REST với hai endpoint in.php (gửi task) và res.php (lấy kết quả), xác thực bằng một API key duy nhất. Logic bốn bước quen thuộc — gửi task, nhận ID, polling, dùng kết quả — vẫn giữ nguyên; bạn chỉ đổi URL, tham số và cách đọc phản hồi. Với các team QA và scraping ở Việt Nam, phần lớn công việc nằm ở lớp hàm gọi API; thay đúng lớp đó là xong.

Khác biệt kiến trúc API: SOAP/XML so với REST

EndCaptcha dùng SOAP/XML; CaptchaAI dùng REST tối giản với hai endpoint và phản hồi JSON.

Khía cạnh EndCaptcha CaptchaAI
Giao thức SOAP/XML hoặc HTTP POST HTTP POST/GET (REST)
Gửi task /Captcha/Upload hoặc WSDL https://ocr.captchaai.com/in.php
Lấy kết quả /Captcha/GetText hoặc WSDL https://ocr.captchaai.com/res.php
Xác thực Username + Password API key
Phản hồi XML/tùy chỉnh JSON (json=1) hoặc text thuần

Ánh xạ tham số EndCaptcha sang CaptchaAI

Dễ vấp nhất: username/password gộp thành một key.

Tham số EndCaptcha Tham số CaptchaAI Ghi chú
username key CaptchaAI chỉ dùng một API key
password Không cần; API key đã gồm xác thực
captchaData (base64) body (base64) Cùng dữ liệu ảnh base64
captchaType method Định danh loại khác nhau
siteKey googlekey Cho các loại reCAPTCHA
pageUrl pageurl Cùng khái niệm, khác cách viết hoa
captchaId id ID task để polling

Ánh xạ loại CAPTCHA sang method

EndCaptcha đánh số loại CAPTCHA; CaptchaAI dùng chuỗi method có nghĩa:

Loại CAPTCHA method CaptchaAI Tham số CaptchaAI
CAPTCHA ảnh (OCR) method=base64 body={base64_image}
reCAPTCHA v2 method=userrecaptcha googlekey, pageurl
Cloudflare Turnstile method=turnstile sitekey, pageurl

Lưu ý: CaptchaAI hiện không hỗ trợ hCaptcha và FunCaptcha (Arkose Labs) — luồng cũ gọi hai loại này cần xử lý riêng. CaptchaAI hỗ trợ reCAPTCHA v3, Cloudflare Challenge, GeeTest v3, CAPTCHA ảnh/lưới.

Chuyển đổi code: bản cũ và bản mới

Python — bản EndCaptcha cũ

Hàm gốc gửi ảnh base64 lên /Captcha/Upload rồi polling /Captcha/GetText:

import requests

USERNAME = "your_endcaptcha_user"
PASSWORD = "your_endcaptcha_pass"

def solve_image_endcaptcha(image_base64):
    # EndCaptcha image solve
    resp = requests.post("https://api.endcaptcha.com/Captcha/Upload", data={
        "username": USERNAME,
        "password": PASSWORD,
        "captchaData": image_base64,
        "captchaType": "1"
    })
    result = resp.json()
    captcha_id = result.get("captchaId")

    import time
    for _ in range(30):
        time.sleep(5)
        poll = requests.post("https://api.endcaptcha.com/Captcha/GetText", data={
            "username": USERNAME,
            "password": PASSWORD,
            "captchaId": captcha_id
        })
        poll_result = poll.json()
        if poll_result.get("text"):
            return {"solution": poll_result["text"]}
        if poll_result.get("error"):
            return {"error": poll_result["error"]}

    return {"error": "TIMEOUT"}

Python — bản CaptchaAI mới

Cùng luồng với CaptchaAI: gửi lên in.php, kiểm tra status, polling res.php.

import os
import time
import requests

API_KEY = os.environ["CAPTCHAAI_API_KEY"]

def solve_image_captchaai(image_base64):
    resp = requests.post("https://ocr.captchaai.com/in.php", data={
        "key": API_KEY,
        "method": "base64",
        "body": image_base64,
        "json": 1
    })
    data = resp.json()
    if data.get("status") != 1:
        return {"error": data.get("request")}

    captcha_id = data["request"]

    for _ in range(30):
        time.sleep(5)
        result = requests.get("https://ocr.captchaai.com/res.php", params={
            "key": API_KEY,
            "action": "get",
            "id": captcha_id,
            "json": 1
        }).json()
        if result.get("status") == 1:
            return {"solution": result["request"]}
        if result.get("request") != "CAPCHA_NOT_READY":
            return {"error": result.get("request")}

    return {"error": "TIMEOUT"}

Python — giải reCAPTCHA v2 với CaptchaAI

Với reCAPTCHA v2, đổi method thành userrecaptcha, truyền googlekeypageurl; nới polling lên 60 lần vì CAPTCHA token lâu hơn:

def solve_recaptcha_v2(sitekey, pageurl):
    resp = requests.post("https://ocr.captchaai.com/in.php", data={
        "key": API_KEY,
        "method": "userrecaptcha",
        "googlekey": sitekey,
        "pageurl": pageurl,
        "json": 1
    })
    data = resp.json()
    if data.get("status") != 1:
        return {"error": data.get("request")}

    captcha_id = data["request"]

    for _ in range(60):
        time.sleep(5)
        result = requests.get("https://ocr.captchaai.com/res.php", params={
            "key": API_KEY, "action": "get",
            "id": captcha_id, "json": 1
        }).json()
        if result.get("status") == 1:
            return {"solution": result["request"]}
        if result.get("request") != "CAPCHA_NOT_READY":
            return {"error": result.get("request")}

    return {"error": "TIMEOUT"}

JavaScript — bản EndCaptcha cũ

Phía Node.js, EndCaptcha gửi username/password qua axios:

const axios = require("axios");

const USERNAME = "your_endcaptcha_user";
const PASSWORD = "your_endcaptcha_pass";

async function solveImageEndCaptcha(imageBase64) {
  const submit = await axios.post("https://api.endcaptcha.com/Captcha/Upload", {
    username: USERNAME,
    password: PASSWORD,
    captchaData: imageBase64,
    captchaType: "1",
  });
  const captchaId = submit.data.captchaId;

  for (let i = 0; i < 30; i++) {
    await new Promise((r) => setTimeout(r, 5000));
    const poll = await axios.post("https://api.endcaptcha.com/Captcha/GetText", {
      username: USERNAME,
      password: PASSWORD,
      captchaId,
    });
    if (poll.data.text) return { solution: poll.data.text };
    if (poll.data.error) return { error: poll.data.error };
  }
  return { error: "TIMEOUT" };
}

JavaScript — bản CaptchaAI mới

Bản CaptchaAI truyền tham số qua params và đọc trường request thay cho text:

const axios = require("axios");
const API_KEY = process.env.CAPTCHAAI_API_KEY;

async function solveImageCaptchaAI(imageBase64) {
  const submit = await axios.post("https://ocr.captchaai.com/in.php", null, {
    params: { key: API_KEY, method: "base64", body: imageBase64, json: 1 },
  });
  if (submit.data.status !== 1) return { error: submit.data.request };

  const captchaId = submit.data.request;

  for (let i = 0; i < 30; i++) {
    await new Promise((r) => setTimeout(r, 5000));
    const poll = await axios.get("https://ocr.captchaai.com/res.php", {
      params: { key: API_KEY, action: "get", id: captchaId, json: 1 },
    });
    if (poll.data.status === 1) return { solution: poll.data.request };
    if (poll.data.request !== "CAPCHA_NOT_READY") return { error: poll.data.request };
  }
  return { error: "TIMEOUT" };
}

Những khác biệt cần lưu ý khi chuyển

Vài điểm sau dễ khiến migration hỏng lặng lẽ:

Hạng mục EndCaptcha CaptchaAI
Xác thực Cặp username + password Một API key duy nhất
Định dạng lỗi JSON tùy chỉnh với trường error Trường request chuẩn kèm mã lỗi
Polling POST tới endpoint riêng GET res.php kèm query param
Kiểm tra số dư Method SOAP riêng res.php?action=getbalance&key=KEY
Báo giải sai Method riêng res.php?action=reportbad&id=ID&key=KEY

Checklist chuyển đổi

Chạy tuần tự khi migration production:

Bước Trạng thái
Tạo tài khoản CaptchaAI
Ánh xạ mọi lệnh gọi EndCaptcha sang tương đương CaptchaAI
Thay auth (username/password → API key)
Đổi endpoint gửi task (/Captcha/Upload/in.php)
Đổi endpoint lấy kết quả (/Captcha/GetText/res.php)
Cập nhật phần phân tích phản hồi
Chạy song song hai nhà cung cấp để đối chiếu
Chuyển lưu lượng production
Xóa thông tin đăng nhập EndCaptcha

Khắc phục sự cố thường gặp

Vấn đề Nguyên nhân Cách xử lý
ERROR_KEY_DOES_NOT_EXIST Dùng username EndCaptcha thay vì API key Dùng API key CaptchaAI từ bảng điều khiển
Phân tích phản hồi lỗi Cấu trúc JSON khác nhau Cập nhật để đọc trường statusrequest
Thiếu tham số method EndCaptcha dùng số captchaType Ánh xạ sang tên method CaptchaAI (base64, userrecaptcha, v.v.)
Timeout trên reCAPTCHA Ngưỡng timeout mặc định khác nhau Đặt polling 60 lần × 5 giây cho CAPTCHA dạng token

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

CaptchaAI tính phí theo lượt giải hay theo thread?

Theo thread. CaptchaAI dùng giá theo thread (luồng giải đồng thời), số lượt giải không giới hạn trong mỗi gói. Gói nhỏ nhất là BASIC ($15/tháng, 5 thread); cần nhiều luồng hơn thì lên STANDARD ($30/tháng, 15 thread).

CaptchaAI có giải hCaptcha giống EndCaptcha không?

Không. CaptchaAI chưa hỗ trợ hCaptcha và FunCaptcha (Arkose Labs); phần code cũ xử lý hCaptcha cần thay bằng giải pháp khác. Các loại như reCAPTCHA v2/v3, Turnstile, GeeTest v3 và CAPTCHA ảnh thì ánh xạ trực tiếp được.

Có nên chạy song song hai nhà cung cấp trước khi chuyển hẳn không?

Nên. Cho CaptchaAI chạy song song trên một phần lưu lượng, đối chiếu tỷ lệ giải thành công và thời gian giải vài ngày rồi mới chuyển hẳn — cách này phát hiện sớm khác biệt về phân tích phản hồi trước khi ảnh hưởng người dùng thật.

Bài viết liên quan

Bước tiếp theo

Đơn giản hóa việc giải CAPTCHA bằng REST API của CaptchaAI — lấy API key và bắt đầu chuyển đổi ngay hôm nay.

Hướng dẫn liên quan:

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