Điểm thấp gần như luôn đến từ bảy nguyên nhân: sai action, token dùng quá muộn, lấy nhầm sitekey, phiên gửi request quá dày, hạ tầng mạng bị chấm rủi ro cao, thiếu cookie Google, và môi trường trình duyệt gửi tín hiệu nghèo nàn. reCAPTCHA v3 không hiện thử thách để bạn thấy lỗi — nó chấm điểm từ 0,0 (bot) đến 1,0 (người thật), rồi backend của trang quyết định chặn hay cho qua.
Vì vậy team automation thường phát hiện muộn: log không có exception, request trả HTTP 200, chỉ là form bị từ chối. Bài này đi theo thứ tự chẩn đoán thực tế.
reCAPTCHA v3 chấm điểm dựa trên tín hiệu nào
Điểm là tổng hợp của nhiều nhóm tín hiệu:
| Nhóm tín hiệu | Google kiểm tra điều gì |
|---|---|
| Chuyển động chuột | Quỹ đạo con trỏ, tốc độ, các lần dừng |
| Hành vi cuộn trang | Người thật cuộn không đều; script đều tăm tắp |
| Nhịp gõ phím | Khoảng thời gian giữa các phím |
| Đặc trưng trình duyệt | Canvas, WebGL, font, danh sách plugin |
| Cookie và phiên | Cookie Google, lịch sử duyệt web |
| Uy tín địa chỉ IP | Dải IP máy chủ hay dải nhà mạng, lịch sử lạm dụng |
| Thời gian ở trên trang | Bao lâu trước khi hành động kích hoạt |
Bạn không "đặt" được điểm, chỉ giảm được số tín hiệu bất thường môi trường mình phát ra.
Ba lỗi cấu hình cần loại trừ trước tiên
Ba nguyên nhân dưới đây sửa trong vài phút, chiếm phần lớn ticket hỗ trợ.
1. Sai hoặc thiếu tham số action
Mỗi lệnh grecaptcha.execute() đều kèm một chuỗi action (login, submit, checkout…) được nhúng vào token. Gửi cho CaptchaAI một action khác với thứ trang mong đợi thì backend so sánh lệch và từ chối token, dù điểm không hề thấp.
Cách xử lý:
- Mở DevTools, tìm
grecaptcha.execute()trong source trang. - Copy nguyên văn chuỗi
action, giữ đúng hoa thường. - Truyền vào request API.
2. Token được dùng quá muộn
Token reCAPTCHA v3 hết hạn sau 2 phút. Nhiều pipeline lấy token ngay lúc tải trang, rồi mới điền form, chờ API nội bộ, xử lý ảnh — đến lúc submit thì token đã chết.
Cách xử lý: xin token ở bước sát nhất trước khi gửi form; nếu có bước chờ dài, lấy lại token sau bước đó.
3. Lấy nhầm sitekey của v2
Trang chạy đồng thời reCAPTCHA v2 (form liên hệ) và v3 (chống spam toàn site) rất phổ biến. Script quét HTML lấy khóa đầu tiên dễ dính khóa v2; token sai loại, triệu chứng hệt "điểm thấp".
Cách xử lý:
- Khóa v3 chỉ xuất hiện trong lời gọi
grecaptcha.execute(). - Khóa v2 nằm trong thuộc tính
data-sitekeycủa widget. - Trang có cả hai thì lấy khóa theo form bạn đang gửi.
Bốn nguyên nhân nằm ở môi trường chạy
Nhóm này tốn công hơn vì phải sửa ở tầng hạ tầng.
4. Nhịp request từ cùng một phiên quá dày
Gọi grecaptcha.execute() liên tiếp trong cùng một phiên kéo điểm xuống ở mỗi lần sau — nguyên nhân số một khiến điểm "tụt dần" trong job chạy đêm.
Cách xử lý: giãn ít nhất 15–30 giây giữa các lần lấy token, và tách phiên theo luồng công việc.
5. Hạ tầng mạng bị chấm rủi ro cao
Google chấm uy tín theo dải IP. Dải IP máy chủ (datacenter) và VPN dùng chung thường bị xếp rủi ro cao hơn dải nhà mạng dân dụng — khác biệt rất dễ thấy giữa job chạy trên VPS và test thủ công từ máy văn phòng.
Cách xử lý:
- Đa dạng nguồn phát request thay vì dồn toàn bộ qua một dải IP.
- Tránh các danh sách IP miễn phí công khai.
6. Thiếu cookie Google và lịch sử phiên
Trình duyệt người dùng thật mang sẵn cookie tài khoản Google (NID, SID, HSID) và lịch sử duyệt web. Profile sạch tinh, vừa khởi tạo đã bắn thẳng vào form, là tín hiệu bất thường.
Cách xử lý: dùng profile có sẵn cookie phiên hợp lệ cho môi trường kiểm thử, cho phiên ghé qua vài trang thông thường trước.
7. Môi trường headless gửi tín hiệu nghèo nàn
Chrome headless mặc định gửi bộ tín hiệu khác hẳn trình duyệt có giao diện: không chuyển động chuột, không cuộn trang, danh sách plugin trống.
Cách xử lý:
- Đặt khung nhìn và user agent thực tế trong cấu hình QA chuẩn.
- Cho script cuộn trang, dừng vài nhịp trước khi kích hoạt hành động.
- Hoặc chạy trình duyệt có giao diện.
Ví dụ: job theo dõi giá chạy đêm rớt 40% lượt gửi form
Một team scraping ở TP.HCM theo dõi giá niêm yết công khai trên các sàn thương mại điện tử. Tester chạy thủ công từ máy văn phòng thì ổn; job đêm trên VPS rớt khoảng 40% lượt gửi form.
Họ chẩn đoán đúng thứ tự trên: action khớp, nhưng tuổi token thì không — pipeline chen một bước resize ảnh vào giữa, đẩy độ trễ lên khoảng 90 giây. Dời việc lấy token xuống sau bước đó, rồi giãn nhịp gửi từ 3 giây lên 20 giây, là đủ xử lý phần lớn vấn đề mà không đụng tới hạ tầng mạng.
Nếu dữ liệu thu thập chứa thông tin cá nhân, Nghị định 13/2023/NĐ-CP là lý do chính đáng để ghi log tối thiểu và chỉ giữ trường thực sự cần — không phải tư vấn pháp lý, nhưng nên có trong checklist thiết kế pipeline.
Checklist chẩn đoán nhanh
| Kiểm tra | Hành động |
|---|---|
| Tham số action có khớp? | Đối chiếu với grecaptcha.execute() trong source trang |
| Token còn mới? | Dùng trong vòng 2 phút kể từ khi tạo |
| Sitekey đúng phiên bản? | Xác nhận đã lấy khóa v3, không phải khóa v2 |
| Nhịp gửi request? | Giãn 15–30 giây giữa các lần giải |
| Nguồn IP? | Đa dạng nguồn phát request |
| Cookie phiên? | Profile có cookie hợp lệ cho môi trường kiểm thử |
| Môi trường trình duyệt? | Khung nhìn, user agent thực tế, có tương tác trước submit |
Lấy token reCAPTCHA v3 bằng API CaptchaAI
CaptchaAI giải reCAPTCHA v3 trong môi trường trình duyệt thật, trả token thường được Google chấm quanh 0,3 — qua được phần lớn trang, nhưng không qua được trang đặt ngưỡng cao hơn. Không dịch vụ nào ép được điểm, vì điểm do mô hình rủi ro của Google quyết định.
Gửi task kèm googlekey, pageurl và action, rồi polling res.php:
import requests
import time
response = requests.get("https://ocr.captchaai.com/in.php", params={
"key": "YOUR_API_KEY",
"method": "userrecaptcha",
"version": "v3",
"googlekey": "SITE_KEY",
"action": "login",
"pageurl": "https://staging.example.com/qa-login",
"json": 1
})
task_id = response.json()["request"]
for _ in range(30):
time.sleep(5)
result = requests.get("https://ocr.captchaai.com/res.php", params={
"key": "YOUR_API_KEY", "action": "get", "id": task_id, "json": 1
}).json()
if result.get("status") == 1:
token = result["request"]
print(f"Token received: {token[:50]}...")
break
Bản Node.js đóng gói cùng luồng đó thành hàm để gắn vào pipeline có sẵn:
const axios = require('axios');
async function solveV3(sitekey, pageurl, action) {
const { data } = await axios.get('https://ocr.captchaai.com/in.php', {
params: {
key: 'YOUR_API_KEY', method: 'userrecaptcha', version: 'v3',
googlekey: sitekey, action, pageurl, json: 1
}
});
const taskId = data.request;
for (let i = 0; i < 30; i++) {
await new Promise(r => setTimeout(r, 5000));
const res = await axios.get('https://ocr.captchaai.com/res.php', {
params: { key: 'YOUR_API_KEY', action: 'get', id: taskId, json: 1 }
});
if (res.data.status === 1) return res.data.request;
}
throw new Error('Timeout');
}
Gói nhỏ nhất là BASIC ($15/tháng, 5 thread) — CaptchaAI tính tiền theo thread (luồng giải đồng thời), không theo lượt giải, nên chi phí tháng không nhảy theo khối lượng.
Câu hỏi thường gặp
Ngưỡng điểm bao nhiêu thì được coi là an toàn?
Do từng trang tự đặt. Hay gặp: 0,3 cho trang ít nhạy cảm, 0,5 là mặc định phổ biến, 0,7 cho hành động quan trọng như thanh toán.
Điểm 0,1 và điểm 0,3 khác nhau thế nào về cách xử lý?
0,1 thường báo hiệu lỗi cấu hình — sai action, sai sitekey, hoặc phiên gửi request quá dày. 0,3 là trần thực tế của môi trường automation, nên hướng xử lý là làm việc với ngưỡng chứ không cố nâng điểm.
CaptchaAI có nâng điểm lên 0,9 được không?
Không. CaptchaAI trả token kèm điểm do Google chấm, thường quanh 0,3. Dịch vụ nào hứa một mức điểm cố định là mô tả sai cách reCAPTCHA v3 hoạt động.
Khi nào nên bỏ v3 và chuyển sang xử lý v2 dự phòng?
Khi trang có bật fallback: nhiều site hiện thử thách reCAPTCHA v2 ngay khi điểm v3 dưới ngưỡng, và kết quả nhị phân đạt/không đạt của v2 dễ dự đoán hơn.
reCAPTCHA v3 và Cloudflare Turnstile có chấm điểm giống nhau không?
Không. Turnstile trả kết quả xác thực chứ không phải thang điểm 0,0–1,0, nên không có khái niệm "điểm thấp" để chẩn đoán; GeeTest v3 dựa trên thao tác kéo thả. Cách xử lý trong bài này chỉ áp dụng cho reCAPTCHA v3.