ERROR_WRONG_GOOGLEKEY hiện lên dù bạn đã đọc lại code ba lần và không thấy chỗ nào sai? Vấn đề gần như luôn nằm ở byte thực sự rời khỏi máy bạn, không phải ở logic bạn đang nhìn trên editor. Charles Proxy chen vào giữa code và CaptchaAI, cho bạn thấy đúng những gì được gửi trong request, những gì trả về, và thời gian từng bước — thay vì đoán qua log console.
Bốn điểm cần soi theo đúng thứ tự:
- Request gửi task tới
/in.phpcó đủ tham số không - Response trả về
TASK_IDhay lỗi - Các request polling tới
/res.phpcó đúng nhịp sleep không - Token cuối cùng có khớp với field mà trang đích yêu cầu không
Thiết lập Charles Proxy để bắt traffic CaptchaAI
1. Cài Charles Proxy
Tải Charles từ charlesproxy.com. Có bản cho Windows, macOS và Linux.
2. Bật SSL Proxying cho ocr.captchaai.com
CaptchaAI chạy trên HTTPS, nên muốn đọc được nội dung request bạn phải bật giải mã SSL trước:
- Proxy → SSL Proxying Settings → Add
- Host:
ocr.captchaai.com, Port:443 - Help → SSL Proxying → Install Charles Root Certificate
- Cài chứng chỉ Charles vào kho chứng chỉ của hệ điều hành
3. Trỏ code của bạn qua Charles
Mặc định Charles lắng nghe tại localhost:8888.
Python:
import requests
proxies = {
"http": "http://localhost:8888",
"https": "http://localhost:8888",
}
# Disable SSL verification for Charles (development only)
resp = requests.post(
"https://ocr.captchaai.com/in.php",
data={"key": "YOUR_API_KEY", "method": "userrecaptcha", "json": "1"},
proxies=proxies,
verify=False,
)
Node.js:
const axios = require('axios');
const HttpsProxyAgent = require('https-proxy-agent');
const agent = new HttpsProxyAgent('http://localhost:8888');
const resp = await axios.post('https://ocr.captchaai.com/in.php', null, {
params: { key: 'YOUR_API_KEY', method: 'userrecaptcha', json: 1 },
httpsAgent: agent,
});
Gỡ ba lỗi CAPTCHA API hay gặp nhất qua Charles
Ví dụ thực tế: một team automation ở TP.HCM theo dõi giá sản phẩm trên Shopee và Tiki bằng script Python gọi CaptchaAI để giải reCAPTCHA v2 trên trang tìm kiếm. Sau một lần refactor, tỷ lệ lỗi ERROR_WRONG_GOOGLEKEY tăng vọt dù code vẫn "trông đúng" khi đọc trên editor. Bật Charles Proxy lên, cả team thấy ngay trường googlekey trống trong request POST /in.php — hàm trích xuất sitekey bị đổi tên biến lúc refactor nhưng không ai chạy lại test. Sửa xong, chạy lại script là hết lỗi.
Lỗi ERROR_WRONG_GOOGLEKEY
Trong Charles, mở body của request gửi task. Tìm trường googlekey:
# What Charles shows:
key=YOUR_API_KEY&method=userrecaptcha&googlekey=&pageurl=https://example.com&json=1
^^^^^^^^ empty!
Cách sửa: việc trích xuất sitekey ở phía code bạn đã fail trước khi request được gửi đi. Kiểm tra lại hàm lấy sitekey.
Token bị trang đích từ chối
So sánh token CaptchaAI trả về với token bạn thật sự gửi vào form:
- Trong Charles, tìm response
/res.phpcóstatus: 1 - Copy nguyên vẹn token trong trường
request - Tìm request tiếp theo gửi tới trang đích
- Xác nhận token nằm trong form body đúng field
g-recaptcha-response
Request bị timeout
Dùng view Sequence của Charles để nhìn timing:
POST /in.php → 234ms ✓
GET /res.php → 189ms (CAPCHA_NOT_READY)
GET /res.php → 201ms (CAPCHA_NOT_READY)
GET /res.php → 195ms (CAPCHA_NOT_READY)
... 23 more ...
GET /res.php → 188ms (CAPCHA_NOT_READY) ← never resolves
Nếu polling không bao giờ trả kết quả: kiểm tra lại sitekey và page URL có đúng không.
Tính năng Charles giúp debug CAPTCHA nhanh hơn
Repeat: gửi lại request không cần chạy lại script
Click phải vào request bất kỳ → Repeat để gửi lại. Hữu ích khi muốn test riêng request polling mà không phải chạy lại toàn bộ script.
Breakpoints: sửa request trước khi gửi đi
Đặt breakpoint trên /in.php để xem và sửa request trước khi nó thật sự rời khỏi máy:
- Proxy → Breakpoint Settings → Add
- Host:
ocr.captchaai.com, Path:/in.php - Tick Request
- Code của bạn giờ sẽ dừng lại trước khi gửi — bạn chỉnh tham số ngay tại đó
Map Local: giả response mà không tốn credit
Thay response API bằng file JSON cục bộ để test:
- Tools → Map Local → Add
- Map
https://ocr.captchaai.com/res.phpsang file JSON cục bộ - Tạo
mock_response.json:
{"status": 1, "request": "mock_token_for_testing"}
Cách này giúp bạn test code chèn token vào form mà không tốn credit API thật.
Throttle: mô phỏng mạng chậm
- Proxy → Throttle Settings → bật
- Chọn preset 3G hoặc tốc độ EDGE
- Kiểm tra code có xử lý đúng response chậm và timeout không
Những gì cần soi trong Charles
Request gửi task (POST /in.php)
Trong Charles, click vào request tới /in.php. Kiểm tra:
| Tab | Cần xác minh |
|---|---|
| Request → Headers | Content-Type đúng định dạng |
| Request → Body | Đủ tất cả tham số bắt buộc |
| Response → Body | {"status":1,"request":"TASK_ID"} khi thành công |
| Timing | Thời gian request (nên dưới 1 giây) |
Các lỗi hay gặp khi soi trong Charles:
- Thiếu tham số
method→ERROR_BAD_PARAMETERS - Content-Type sai → Tham số không được parse đúng
googlekeyrỗng →ERROR_WRONG_GOOGLEKEY- Body dạng JSON sai định dạng → Phải dùng form data, không phải JSON body
Request polling (GET /res.php)
Kiểm tra các request polling:
- Tham số:
key,action=get,id=TASK_ID - Response:
CAPCHA_NOT_READY(còn phải polling tiếp) hoặc{"status":1,"request":"TOKEN"} - Timing: mỗi lần polling cách nhau đúng bằng khoảng sleep bạn đặt trong code
Khắc phục sự cố nhanh
Lỗi SSL trong code
Chứng chỉ Charles chưa được tin cậy. Cài chứng chỉ root của Charles; dùng verify=False khi dev.
Charles báo "no requests" dù script đang chạy
Code chưa trỏ qua proxy. Set proxy trong config của requests/axios.
Response HTTPS bị vỡ, không đọc được nội dung
SSL Proxying chưa bật cho ocr.captchaai.com. Thêm host này vào SSL Proxying Settings.
Charles làm cả script chạy chậm hẳn
Breakpoint đang bật ở đâu đó. Tắt breakpoint khi không cần dùng.
Charles, mitmproxy, Fiddler hay Proxyman: chọn công cụ nào
| Công cụ | Nền tảng | HTTPS | Chi phí |
|---|---|---|---|
| Charles | Win/Mac/Linux | Cần cài chứng chỉ | Trả phí (có bản dùng thử) |
| mitmproxy | Win/Mac/Linux | Cần cài chứng chỉ | Miễn phí |
| Fiddler | Windows | Giải mã HTTPS sẵn có | Miễn phí |
| Proxyman | macOS | Bật HTTPS chỉ với một click | Freemium |
Cài mitmproxy trong một phút
# Install
pip install mitmproxy
# Run
mitmproxy --listen-port 8080
# Configure Python
proxies = {"https": "http://localhost:8080"}
Câu hỏi thường gặp
Charles Proxy có tốn phí không?
Có, nhưng có bản dùng thử miễn phí. Nếu cần công cụ miễn phí hoàn toàn, dùng mitmproxy hoặc Fiddler (Windows) thay thế — cả hai đều bắt được traffic HTTPS tới CaptchaAI như Charles.
Nên chọn Charles, mitmproxy hay Fiddler?
Charles có giao diện trực quan nhất cùng Map Local và Breakpoints mạnh, hợp khi debug thủ công từng request. mitmproxy hợp hơn nếu bạn muốn script hóa việc bắt traffic trong CI. Fiddler là lựa chọn miễn phí tốt nếu bạn chỉ chạy trên Windows.
Vì sao Charles không hiển thị request nào dù code đã chạy?
Gần như luôn do code chưa thật sự trỏ qua proxy. Kiểm tra lại biến proxies trong requests (Python) hoặc httpsAgent trong axios (Node.js) — thiếu cấu hình này thì Charles không bắt được gì cả.
Debug qua Charles có ảnh hưởng tới việc giải CAPTCHA không?
Không. CaptchaAI không phân biệt request đi qua proxy debug hay không — request của bạn vẫn được xử lý bình thường, bạn chỉ đang xem thêm nội dung của nó.
Có nên để Charles chạy khi deploy lên production không?
Không nên. Charles là công cụ cho môi trường dev, không phải hạ tầng production. Ở production, dùng structured logging (xem hướng dẫn liên quan bên dưới) để quan sát request/response mà không cần cắm proxy thủ công.
Bắt đầu debug tích hợp CaptchaAI của bạn
Lấy API key tại captchaai.com và soi request đầu tiên bằng Charles trong vài phút.
Hướng dẫn liên quan
- Ghi log có cấu trúc cho hệ thống CAPTCHA
- Tra cứu mã lỗi CaptchaAI
- Bộ Postman collection để test API CaptchaAI