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. Các mẫu chẩn đoán ở đây dành cho tích hợp CAPTCHA của chính bạn, không áp dụng cho bên thứ ba.
TTL đúng cho token CAPTCHA trong Redis là khoảng hợp lệ trừ 30–40 giây, và mọi worker QA đọc chung một khoá. Suite mở mười phiên song song trên cùng form staging vì thế chỉ tốn một lần gọi CaptchaAI; chín phiên còn lại dùng token trong cache.
Vì sao Redis hợp với vòng đời token
Token reCAPTCHA sống khoảng 90–120 giây, token Cloudflare Turnstile khoảng 300 giây. Redis có EXPIRE và TTL ngay ở tầng khoá nên không cần job dọn rác; và vì là bộ nhớ dùng chung, một worker giải là cả cụm runner CI dùng lại được.
Đặt tên khoá Redis
| Mẫu khoá | Công dụng | TTL |
|---|---|---|
captcha:{type}:{sitekey}:{qa_case} |
Token đã giải cho một case QA | Theo loại |
captcha:lock:{sitekey}:{qa_case} |
Chống hai worker giải trùng một case | 120 giây |
Chọn TTL theo loại CAPTCHA
Lấy khoảng hợp lệ chính thức trừ biên an toàn 30–40 giây; phần trừ đi là thời gian ứng dụng còn kịp dùng token.
| Loại CAPTCHA | Khoảng hợp lệ | TTL nên đặt |
|---|---|---|
| reCAPTCHA v2 / v3 | ~120 giây | 80 giây |
| Cloudflare Turnstile | ~300 giây | 250 giây |
Ghép Redis vào luồng gọi CaptchaAI
- Đọc Redis trước; token còn
TTLtrên 10 giây thì dùng luôn. - Cache rỗng thì đặt
SET ... NX EX 120để giành quyền giải; worker không giành được sẽ chờ và đọc lại cache thay vì gửiin.phpsong song. - Giải xong ghi token kèm
EXPIREtheo bảng trên, xoá khoá lock trongfinally.
Ví dụ gọi QA
Luồng tối thiểu để kiểm thử một CAPTCHA widget trên staging của bạn qua CaptchaAI:
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()
Một tình huống quen thuộc ở Việt Nam
Đội QA thuê ngoài ở TP.HCM hay Hà Nội thường chạy hồi quy ban đêm trên staging của khách hàng. Một luồng checkout mở 30 phiên cùng dừng ở widget reCAPTCHA v2: không cache là 30 lần gọi API cho một thử thách, còn với TTL 80 giây thì phần lớn phiên dùng lại token. Khi log QA chạm dữ liệu thật sao chép sang staging, Nghị định 13/2023/NĐ-CP là lý do thực tế để log tối giản, có thời hạn.
Khắc phục sự cố
| Vấn đề | Nguyên nhân thường gặp | Cách xử lý |
|---|---|---|
| Backend QA từ chối token trong cache | TTL quá sát khoảng hợp lệ | Tăng biên an toàn hoặc dùng token ngay |
| Khoá lock không được giải phóng | Worker chết giữa chừng | Luôn đặt EX để TTL tự dọn lock |
CaptchaAI trả ERROR_NO_SLOT_AVAILABLE |
Hàng đợi đầy tạm thời | Thử lại với backoff |
Danh mục kiểm tra
- Phạm vi kiểm thử giới hạn trong hệ thống bạn sở hữu hoặc được uỷ quyền, khoá CaptchaAI để trong CI secret.
- Mọi khoá cache đều có TTL; soát bằng
redis-cli --bigkeys. - Mỗi lần chạy ghi lại thời gian lấy token, mã trạng thái và correlation id.
Câu hỏi thường gặp
Token hết hạn trong Redis có gia hạn được không?
Không. Khoảng hợp lệ do phía CAPTCHA quyết định; EXPIRE chỉ chi phối bản sao cache.
Dùng Redis hay biến trong bộ nhớ tiến trình?
Biến trong bộ nhớ đủ khi test chạy một tiến trình. Nhiều container hoặc runner CI thì mỗi tiến trình một cache riêng, mất khả năng chống giải trùng.
Gói CaptchaAI nào đủ cho suite QA?
CaptchaAI tính giá theo thread (luồng giải đồng thời), không theo lượt giải. BASIC ($15/tháng, 5 thread) đủ cho suite nhỏ; nhiều job song song thì dùng STANDARD ($30/tháng, 15 thread).
CaptchaAI có giải hCaptcha để tôi test không?
Không — hCaptcha và FunCaptcha chưa được hỗ trợ, GeeTest v4 mới sắp ra mắt. Loại dùng được gồm reCAPTCHA v2/v3, Cloudflare Turnstile, Cloudflare Challenge, GeeTest v3, image/OCR, grid-image, BLS.
Hướng dẫn liên quan an toàn
- Bắt đầu nhanh với CaptchaAI
- Kiểm thử QA CAPTCHA được uỷ quyền
- Kiểm thử endpoint CAPTCHA cho biểu mẫu
- Test trình duyệt đỏ, API vẫn chạy: cách gỡ
- Giải reCAPTCHA v2 qua API
- Giải Cloudflare Turnstile qua API
- Giải GeeTest v3 qua API
Xác thực tích hợp CAPTCHA của bạn trong môi trường nội bộ với CaptchaAI.