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 là 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 dùng cho bên thứ ba hoặc luồng không được phép.
CAPTCHA widget trên staging có đúng sitekey, đúng action và trả token hợp lệ không? Cách nhanh nhất để trả lời là parse HTML bằng BeautifulSoup rồi gửi tham số đó cho CaptchaAI — không cần bật trình duyệt, không cần chạy hết một suite Selenium. Bài này đi qua ba bước: tìm widget, giải bằng CaptchaAI, xác thực token ở backend QA.
Một đội QA tại công ty gia công phần mềm ở TP.HCM dùng luồng này để kiểm tra trang đăng ký có Cloudflare Turnstile trước mỗi release, thay vì để tester bấm thủ công qua UI. Vì chạy bằng requests thay vì trình duyệt thật, test này chạy được trong CI mà không cần headless browser.
Bước 1: xác định widget trong HTML staging
Dùng selector ổn định trên HTML đã lưu từ staging — .g-recaptcha, [data-sitekey] — thay vì đoán vị trí trên giao diện. Selector này không đổi qua các lần release, nhờ vậy test không vỡ khi frontend chỉnh CSS.
Bước 2: gửi tham số cho CaptchaAI để giải
Gửi hai tham số sau tới in.php, sau đó polling res.php cho đến khi có token:
googlekey/sitekey: giá trị lấy được ở bước 1pageurl: URL trang staging đang test, không phải URL production
Bước 3: xác thực token ở backend QA
Gửi token vừa nhận đến endpoint QA nội bộ để xác nhận toàn bộ luồng hoạt động đúng.
Các lỗi thường gặp khi test CAPTCHA widget
| Vấn đề | Nguyên nhân thường gặp | Cách xử lý |
|---|---|---|
| Test không tìm thấy widget | Selector đổi hoặc widget load muộn | Kiểm tra lại selector, dùng wait_for_selector khi cần |
CaptchaAI trả ERROR_NO_SLOT_AVAILABLE |
Hàng đợi tạm thời đầy | Thử lại theo backoff trong pipeline nội bộ |
| Backend QA từ chối token | Sai action, sitekey hoặc secret | Đối chiếu cấu hình backend với staging |
Ghi log để chẩn đoán nhanh hơn
Trường cần ghi mỗi lần chạy
- Tổng thời gian lấy token
- Mã trạng thái HTTP
- ID task
- Độ sâu hàng đợi
Gắn correlation id xuyên suốt pipeline
Tách log theo môi trường (development, staging, pre-production) và gắn một correlation id xuyên suốt các bước, ví dụ qua OpenTelemetry. Một id duy nhất đủ để replay lại kịch bản khi có sự cố, thay vì lục log rải rác.
Checklist trước khi đưa vào CI
- 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.
- API key CaptchaAI nằm trong CI secret hoặc vault, không nằm trong mã nguồn.
- Mỗi lần chạy ghi lại thời gian gọi và mã trạng thái phản hồi.
- Có chính sách thử lại idempotent kèm giới hạn cho lỗi tạm thời.
- Test chạy lại được trên CI mà không cần can thiệp thủ công.
Code mẫu: gọi CaptchaAI trong test QA
Đoạn Python dưới đây là luồng tối thiểu để test một CAPTCHA widget trên staging thông 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()
Câu hỏi thường gặp
Test này có ảnh hưởng đến traffic production không?
Không. Ví dụ giả định môi trường được uỷ quyền như staging.example.com hoặc domain QA do bạn sở hữu, cấu hình CAPTCHA giống production.
Có nên hardcode API key vào code không?
Không nên. Nạp key qua secret manager của CI hoặc vault. Key từng bị commit vào repo phải xoay vòng (rotate) ngay.
CaptchaAI hỗ trợ những loại CAPTCHA nào để test?
CaptchaAI giải reCAPTCHA v2/v3, Cloudflare Turnstile, Cloudflare Challenge, GeeTest v3 và CAPTCHA dạng ảnh/text. hCaptcha và FunCaptcha chưa được hỗ trợ.
Nên xử lý lỗi tạm thời như thế nào?
Thử lại idempotent với exponential backoff (1s, 2s, 4s) và một giới hạn số lần thử. Lỗi mạng, mã 5xx và ERROR_NO_SLOT_AVAILABLE phù hợp để retry; lỗi xác thực (sai key, sai sitekey) nên sửa cấu hình thay vì thử lại.
Hướng dẫn liên quan an toàn
- CaptchaAI quickstart
- Kiểm thử QA CAPTCHA được uỷ quyền
- Test endpoint CAPTCHA trên form của bạn
- Trình duyệt fail nhưng API vẫn chạy: cách gỡ lỗi
- 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.