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.
Widget CAPTCHA có thể chặn nhầm một hàng đợi hợp lệ đúng vào lúc mở bán — cách duy nhất để biết chắc trước là kiểm thử trên staging. Bài viết đi qua từng bước: dựng hàng đợi, ghế và thanh toán giả lập, dùng CaptchaAI lấy token và xác thực toàn bộ luồng — an toàn, lặp lại được, chạy thẳng trong CI.
Vì sao kiểm thử CAPTCHA quan trọng với nền tảng bán vé
Nhiều nền tảng bán vé sự kiện, thể thao hay concert dùng hàng đợi ảo: vào hàng đợi, chờ tới lượt, rồi mới chọn ghế và thanh toán. Nếu widget CAPTCHA đổi selector, đổi sitekey hay load chậm, lỗi thường chỉ lộ ra đúng lúc mở bán, khi hết thời gian sửa. Các đội QA outsourcing hoặc product ở TP.HCM, Hà Nội thường chạy lại luồng này trên staging trước mỗi đợt mở bán lớn.
Phạm vi và giới hạn của bài kiểm thử
- Chỉ áp dụng cho nền tảng bán vé bạn sở hữu hoặc được uỷ quyền.
- Dùng sự kiện, ghế và vé giả lập cùng token thanh toán mô phỏng.
- Xác thực qua hàng đợi nội bộ và endpoint QA, không phải production.
- Không thao tác trên hàng đợi hay vé thật, không nhắm tới bên thứ ba.
Bước 1: Dựng mô hình hàng đợi giả lập cho QA
Tái hiện kiến trúc hàng đợi thật trên staging: tài khoản QA vào hàng đợi giả lập tại https://staging.example.com/ticketing/queue-test, nhận một slot, và khi slot mở sẽ chuyển hướng sang https://staging.example.com/ticketing/checkout-test. Giữ nguyên thứ tự chuyển trang như hệ thống thật để test phản ánh đúng hành vi CAPTCHA.
Bước 2: Tạo sự kiện, ghế và thanh toán giả lập
Chuẩn bị dữ liệu giả lập cho một sự kiện, danh sách ghế và token thanh toán thử nghiệm:
FAKE_EVENT = {
'id': 'evt_qa_001',
'url': 'https://staging.example.com/ticketing/fake-event',
'seats': [{'row': 'A', 'col': i, 'price_cents': 5000} for i in range(1, 21)],
}
FAKE_PAYMENT = {'token': 'qa_pm_token_demo'}
Các giá trị này chỉ tồn tại trong staging, không ánh xạ tới vé hay giao dịch thật.
Bước 3: Gửi task CAPTCHA tới CaptchaAI từ staging
Khi hàng đợi hoặc checkout hiển thị reCAPTCHA v2, gửi task tới CaptchaAI và polling kết quả:
import os, time, requests
API_KEY = os.environ['CAPTCHAAI_API_KEY']
def solve_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()
tid = r['request']
while True:
time.sleep(5)
rr = requests.get('https://ocr.captchaai.com/res.php', params={
'key': API_KEY, 'action': 'get', 'id': tid, 'json': 1,
}).json()
if rr['status'] == 1:
return rr['request']
Hàm này trả về token ngay khi CaptchaAI giải xong, sẵn sàng gắn vào request submit tiếp theo.
Bước 4: Xác thực token tại backend QA
Gửi token tới endpoint đơn hàng vé QA nội bộ. Backend xác thực token, khoá ghế giả lập tương ứng và trả về order_id mô phỏng — không vé thật nào được xử lý.
Bước 5: Ghi log và quyết định pass/fail
Một lần chạy pass khi backend chấp nhận token, ghế giả lập khoá thành công và độ trễ end-to-end dưới ngưỡng nội bộ đã đặt. Ghi các giá trị này theo qa_case để so sánh giữa các lần chạy.
Khắc phục sự cố khi kiểm thử CAPTCHA hàng đợi vé
| 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 thời điểm load CAPTCHA thay đổi | Kiểm tra lại selector và wait_for_selector trên staging |
CaptchaAI trả ERROR_NO_SLOT_AVAILABLE |
Hàng đợi giải tạm thời đầy | Thử lại với 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 |
Observability: nhật ký và correlation id cho từng lần chạy
Ghi log có cấu trúc cho mỗi lần chạy: thời gian lấy token, mã trạng thái HTTP, ID task và độ sâu hàng đợi. Tách log theo môi trường (development, staging, pre-production) và liên kết các bước qua một correlation id (OpenTelemetry) để phát lại toàn bộ kịch bản từ một id.
Danh mục kiểm tra trước khi đưa vào CI
- Phạm vi 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 xuất hiện 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, giới hạn số lần cho lỗi tạm thời.
- Bài kiểm thử tái lập được trên CI, không cần can thiệp thủ công.
Ví dụ gọi CaptchaAI đầy đủ
Luồng tối thiểu để kiểm thử một widget CAPTCHA trên staging qua CaptchaAI, từ gửi task tới lấy kết quả:
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ùng mẫu này áp dụng được cho reCAPTCHA v3 và Cloudflare Turnstile — chỉ đổi loại task tương ứng.
Câu hỏi thường gặp
Quy trình này có ảnh hưởng tới traffic 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 riêng của bạn — tái tạo cấu hình CAPTCHA của production trong staging, không chạy trực tiếp trên hệ thống thật.
Có nên đặt API key CaptchaAI trực tiếp trong code không?
Không. Nạp key qua secret manager của CI, biến môi trường hoặc vault; key từng bị commit vào repo phải xoay vòng ngay.
Nên xử lý lỗi tạm thời như thế nào?
Thử lại idempotent kèm exponential backoff (1s, 2s, 4s) cộng giới hạn số lần thử. Lỗi mạng, mã 5xx và ERROR_NO_SLOT_AVAILABLE phù hợp để thử lại; lỗi xác thực như sai key hay sai sitekey thì không.
Đọc thêm về kiểm thử CAPTCHA an toàn
- 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 web
- Gỡ lỗi khi trình duyệt thất bại nhưng API CAPTCHA vẫn thành công
- Hướng dẫn giải reCAPTCHA v2 qua API
- Hướng dẫn giải Cloudflare Turnstile qua API
- Hướng dẫn giải GeeTest v3 qua API
Kiểm thử luồng CAPTCHA hàng đợi và checkout vé của bạn trên staging với CaptchaAI.