So Sánh

Cách đo thời gian phản hồi của CAPTCHA solver trong năm 2025

Phạm vi an toàn: Hướng dẫn này chỉ áp dụng cho môi trường QA, staging hoặc pre-production thuộc sở hữu hoặc được uỷ quyền của bạn. Nội dung bao gồm các mẫu chẩn đoán, kiểm thử và quan sát cho tích hợp CAPTCHA của chính bạn — không áp dụng cho bên thứ ba hoặc luồng không được phép.

Con số "X giây trung bình" trên trang marketing của bất kỳ solver nào không nói lên gì về pipeline của bạn — nó được đo ở data center khác, loại CAPTCHA khác, tải khác. Câu trả lời đáng tin là tự đo: gửi 200+ task từ hạ tầng của bạn, ghi trung vị, P90, P99, rồi mới quyết định gói và nhà cung cấp. Bài này đưa ra phương pháp đó, kèm script Python chạy được ngay.

Vì sao số benchmark công khai không phản ánh pipeline của bạn

Ba yếu tố sau quyết định thời gian bạn quan sát trong production, và không yếu tố nào nằm trong tầm kiểm soát của bất kỳ solver nào:

  • Độ trễ mạng từ data center của bạn đến API endpoint.
  • Loại CAPTCHA cụ thể đang chạy (reCAPTCHA v2 và image OCR có thời gian giải khác hẳn nhau).
  • Tỷ lệ retry của chính pipeline bạn.

Benchmark công khai của bất kỳ solver nào — kể cả CaptchaAI — chỉ mang tính tham khảo; kết quả trong môi trường của bạn có thể lệch đáng kể theo cả hai chiều.

Phương pháp đo: 3 bước

  1. Chạy 200+ tác vụ cho mỗi loại CAPTCHA từ pipeline nội bộ của bạn.
  2. Với mỗi tác vụ, ghi lại ba mốc thời gian: dấu thời gian gửi request tới in.php, dấu thời gian poll thành công đầu tiên từ res.php, và tổng wallclock từ lúc gửi đến lúc có token.
  3. Từ tập dữ liệu đó, tính trung vị, P90 và P99 — không dùng trung bình cộng, vì vài task chậm bất thường sẽ kéo lệch số liệu.

Bảng đo mẫu — điền số liệu từ pipeline của bạn

Loại CAPTCHA Mẫu Trung vị P90 P99
reCAPTCHA v2 200 điền điền điền
reCAPTCHA v3 200 điền điền điền
Cloudflare Turnstile 200 điền điền điền
GeeTest v3 200 điền điền điền
Image / OCR 200 điền điền điền

Các giá trị chỉ mang tính tham khảo cho môi trường của bạn và có thể thay đổi theo loại CAPTCHA, khu vực, tải và tích hợp; chỉ phục vụ tham khảo nội bộ.

Ví dụ thực tế: benchmark cho pipeline theo dõi giá thương mại điện tử

Một đội QA tại công ty outsourcing ở TP.HCM chạy pipeline theo dõi giá trên các sàn thương mại điện tử, dùng domain và tài khoản test do họ sở hữu ở staging. Trước khi chốt gói CaptchaAI, họ chạy phương pháp đo ở trên với gói BASIC ($15/tháng, 5 thread): 200 task reCAPTCHA v2 mỗi ngày trong một tuần, ghi trung vị và P99 theo khung giờ. Khi trung vị ổn định nhưng throughput không đủ cho crawl buổi tối, họ có số liệu thật để nâng lên ADVANCE ($90/tháng, 50 thread) thay vì đoán theo cảm tính.

So sánh táo với táo giữa các nhà cung cấp

Khi so sánh nhà cung cấp, hãy đảm bảo mỗi bên xử lý cùng loại CAPTCHA, cùng khung giờ và khu vực mạng.

So sánh táo với táo: reCAPTCHA v2 với reCAPTCHA v2; không phải image OCR với Turnstile — hai loại có độ phức tạp và thời gian giải khác nhau hoàn toàn.

Tính capacity bền vững từ dữ liệu đo được

Sau khi có phân phối của riêng bạn, tính capacity bền vững theo công thức: tasks/phút = 60 / trung_vị_giây * worker. Cộng thêm 30% buffer cho đột biến tải — ví dụ trung vị 12 giây với 5 thread (BASIC) cho khoảng 25 task/phút lý thuyết trước khi trừ buffer.

Script benchmark bằng Python

import os, time, statistics, requests
API_KEY = os.environ['CAPTCHAAI_API_KEY']
SAMPLES = 200

def submit_recaptcha_v2(sitekey, pageurl):
    r = requests.post('https://ocr.captchaai.com/in.php', data={
        'key': API_KEY, 'method': 'userrecaptcha',
        'googlekey': sitekey, 'pageurl': pageurl, 'json': 1,
    }).json()
    return r['request']

def wait(task_id):
    t0 = time.time()
    while True:
        time.sleep(5)
        rr = requests.get('https://ocr.captchaai.com/res.php', params={
            'key': API_KEY, 'action': 'get', 'id': task_id, 'json': 1,
        }).json()
        if rr['status'] == 1:
            return time.time() - t0

times = [wait(submit_recaptcha_v2(SITE, PAGE)) for _ in range(SAMPLES)]
print('trung vị', statistics.median(times))
print('p90', statistics.quantiles(times, n=10)[8])
print('p99', statistics.quantiles(times, n=100)[98])

Các lỗi thường gặp khi đo

Vấn đề Nguyên nhân thường gặp Cách xử lý
Test không tìm thấy widget Thay đổi selector hoặc thời điểm load Kiểm tra selector và wait_for_selector trên staging
CaptchaAI trả ERROR_NO_SLOT_AVAILABLE Hàng đợi đầy tạm thời Thử lại với backoff trong pipeline nội bộ
Backend QA từ chối token Sai action/sitekey/secret Đối chiếu cấu hình backend với staging

Ghi log và khả năng quan sát khi chạy benchmark

Ghi nhật ký có cấu trúc cho mỗi lần chạy: tổng thời gian lấy token, mã trạng thái HTTP, ID tác vụ và độ sâu hàng đợi. Tách các môi trường (development, staging, pre-production) thành kênh riêng và liên kết các bước qua một correlation id (ví dụ OpenTelemetry) để phát lại được cả kịch bản khi chẩn đoán sự cố.

Checklist trước khi chạy benchmark

  • Phạm vi kiểm thử chỉ giới hạn trong ứng dụng của bạn hoặc tài nguyên đã được uỷ quyền.
  • Khoá CaptchaAI nằm trong CI secret hoặc vault, không nằm trong mã nguồn.
  • Mỗi lần chạy có thời gian gọi và mã trạng thái phản hồi được ghi lại.
  • Có chính sách thử lại idempotent với giới hạn cho lỗi tạm thời.
  • Bài kiểm thử có thể tái lập trên CI mà không cần can thiệp thủ công.

Ví dụ tối thiểu: gọi CaptchaAI trong test QA

Luồng tối thiểu để kiểm thử một CAPTCHA widget trên staging qua CaptchaAI, dùng lại được cho benchmark ở trên:

import os
import requests

API_KEY = os.environ['CAPTCHAAI_KEY']
QA_PAGE_URL = os.environ['QA_PAGE_URL']  # ví dụ https://staging.example.com/qa-login
QA_SITE_KEY = os.environ['QA_SITE_KEY']


def submit_qa_recaptcha() -> str:
    payload = {
        'clientKey': API_KEY,
        'task': {
            'type': 'NoCaptchaTaskProxyless',
            'websiteURL': QA_PAGE_URL,
            'websiteKey': QA_SITE_KEY,
        },
    }
    response = requests.post(
        'https://api.captchaai.com/createTask',
        json=payload,
        timeout=30,
    )
    response.raise_for_status()
    return response.json()['taskId']


def fetch_qa_result(task_id: str) -> dict:
    payload = {'clientKey': API_KEY, 'taskId': task_id}
    response = requests.post(
        'https://api.captchaai.com/getTaskResult',
        json=payload,
        timeout=30,
    )
    response.raise_for_status()
    return response.json()

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

Có solver nào nhanh nhất một cách phổ quát không?

Không. Kết quả thay đổi theo khu vực, loại CAPTCHA, tải và tích hợp — nên hãy tự đo trên hạ tầng của bạn.

Nên chạy lại benchmark sau bao lâu?

Chạy lại mỗi khi core engine của solver cập nhật, hoặc tối thiểu mỗi quý, và lưu kết quả các lần đo trước để so sánh xu hướng.

Quy trình benchmark này có chạm vào lưu lượng production không?

Không. Mọi ví dụ giả định môi trường được uỷ quyền như staging.example.com hoặc domain QA bạn sở hữu.

Có thể đặt API key trực tiếp trong mã không?

Không. Nạp khoá qua secret manager của CI, biến môi trường hoặc vault. Khoá đã commit vào kho mã phải xoay vòng ngay.

Bạn khuyến nghị gì cho lỗi tạm thời khi đo?

Thử lại idempotent kèm backoff (1s, 2s, 4s) và giới hạn trên. Lỗi mạng, mã 5xx, ERROR_NO_SLOT_AVAILABLE nên thử lại; lỗi xác thực kéo dài thì không.

Tài liệu liên quan

Tự đo thời gian phản hồi trên pipeline của bạn với CaptchaAI trước khi chọn gói.

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