Hướng Dẫn Thực Hành

Gỡ lỗi lệnh gọi API CAPTCHA bằng Charles Proxy

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ự:

  1. Request gửi task tới /in.php có đủ tham số không
  2. Response trả về TASK_ID hay lỗi
  3. Các request polling tới /res.php có đúng nhịp sleep không
  4. 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:

  1. ProxySSL Proxying SettingsAdd
  2. Host: ocr.captchaai.com, Port: 443
  3. HelpSSL ProxyingInstall Charles Root Certificate
  4. 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:

  1. Trong Charles, tìm response /res.phpstatus: 1
  2. Copy nguyên vẹn token trong trường request
  3. Tìm request tiếp theo gửi tới trang đích
  4. 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:

  1. ProxyBreakpoint SettingsAdd
  2. Host: ocr.captchaai.com, Path: /in.php
  3. Tick Request
  4. 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:

  1. ToolsMap LocalAdd
  2. Map https://ocr.captchaai.com/res.php sang file JSON cục bộ
  3. 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

  1. ProxyThrottle Settings → bật
  2. Chọn preset 3G hoặc tốc độ EDGE
  3. 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ố methodERROR_BAD_PARAMETERS
  • Content-Type sai → Tham số không được parse đúng
  • googlekey rỗngERROR_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

Os comentários estão desativados para este artigo.