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
- Chạy 200+ tác vụ cho mỗi loại CAPTCHA từ pipeline nội bộ của bạn.
- 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. - 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
- Bắt đầu nhanh với CaptchaAI
- Kiểm thử QA CAPTCHA được uỷ quyền
- Kiểm thử endpoint CAPTCHA trên biểu mẫu của bạn
- Khi kiểm thử trình duyệt thất bại còn API thành công: gỡ lỗi
- Giải reCAPTCHA v2 qua API
- Giải Cloudflare Turnstile qua API
- Giải GeeTest v3 qua API
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.