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

Sử dụng Fiddler để kiểm tra lưu lượng API CaptchaAI

CaptchaAI trả về lỗi nhưng log ứng dụng của bạn chỉ ghi vỏn vẹn một dòng chung chung? Cách nhanh nhất để biết chuyện gì thực sự xảy ra là bắt trực tiếp gói tin HTTP giữa code của bạn và API CaptchaAI — không đoán, không cần thêm log, không cần sửa code. Fiddler làm đúng việc đó: ghi lại từng request và response, cho bạn xem chính xác payload, header và thời gian phản hồi.

Khi nào nên dùng Fiddler để debug API CaptchaAI

Năm kịch bản dưới đây là lý do phổ biến nhất khiến dev cần soi thẳng vào traffic thay vì đoán qua log:

  • API trả lỗi nhưng log ứng dụng lại quá sơ sài — Fiddler cho thấy toàn bộ request body, header và response.
  • Request có vẻ bị "treo", không thấy phản hồi — Fiddler cho biết request có tới được server hay đang timeout.
  • Token báo không hợp lệ sau khi inject vào form — Fiddler cho thấy nội dung token chính xác và lỗi encoding nếu có.
  • Nghi ngờ lỗi do định tuyến qua proxy — Fiddler xác nhận request có thực sự đi qua đúng proxy đã cấu hình không.
  • Gặp lỗi rate limit — Fiddler ghi lại thời điểm gửi từng request và mẫu response 429.

Khắc phục sự cố Fiddler thường gặp

Trước khi đi sâu vào cách dùng Fiddler, xử lý luôn các lỗi setup hay gặp nhất — phần lớn dev mới cài Fiddler đều vấp phải ít nhất một trong số này:

  1. Fiddler không thấy traffic nào — nguyên nhân thường gặp là code chưa route qua proxy của Fiddler; đặt proxy về 127.0.0.1:8866 (Everywhere) hoặc 8888 (Classic).
  2. Lỗi chứng chỉ SSL — chưa tin cậy root certificate của Fiddler; cài lại chứng chỉ Fiddler và thêm vào trusted root.
  3. Response body hiển thị lộn xộn, không đọc được — response đang bị nén; bật nút "Decode" trên toolbar (hoặc Rules → Remove All Encodings).
  4. Breakpoint không kích hoạt — filter hoặc rule không khớp; kiểm tra lại URL pattern có khớp chính xác ocr.captchaai.com không.
  5. Có traffic nhưng body trống — Content-Length không khớp hoặc response đang stream; click vào session và đợi response tải xong hoàn toàn.

Bật giải mã HTTPS cho Fiddler

Bước 1: Cài chứng chỉ và bật giải mã HTTPS

Fiddler hoạt động như một proxy cục bộ, chặn traffic HTTPS đi qua máy bạn. Muốn xem được payload thật của API CaptchaAI, bạn phải bật giải mã HTTPS trước:

Fiddler Everywhere:

  1. Mở Settings → HTTPS
  2. Bật "Capture HTTPS traffic"
  3. Cài chứng chỉ gốc (root certificate) của Fiddler khi được nhắc
  4. Tin cậy chứng chỉ đó trong kho chứng chỉ của hệ điều hành

Fiddler Classic (Windows):

  1. Tools → Options → HTTPS
  2. Tích "Decrypt HTTPS traffic"
  3. Bấm "Actions" → "Trust Root Certificate"

Bước 2: Trỏ code của bạn qua proxy của Fiddler

Fiddler lắng nghe ở 127.0.0.1:8866 (Fiddler Everywhere) hoặc 127.0.0.1:8888 (Fiddler Classic).

Python (requests):

import requests

proxies = {
    "http": "http://127.0.0.1:8866",
    "https": "http://127.0.0.1:8866",
}

# Submit CAPTCHA task through Fiddler
response = requests.post(
    "https://ocr.captchaai.com/in.php",
    data={
        "key": "YOUR_API_KEY",
        "method": "userrecaptcha",
        "googlekey": "SITE_KEY",
        "pageurl": "https://example.com",
        "json": 1,
    },
    proxies=proxies,
    verify=False,  # Required for Fiddler's self-signed cert
)
print(response.json())

JavaScript (Node.js với axios):

const axios = require("axios");
const HttpsProxyAgent = require("https-proxy-agent");

const agent = new HttpsProxyAgent("http://127.0.0.1:8866");

async function submitTask() {
  const response = await axios.post(
    "https://ocr.captchaai.com/in.php",
    new URLSearchParams({
      key: "YOUR_API_KEY",
      method: "userrecaptcha",
      googlekey: "SITE_KEY",
      pageurl: "https://example.com",
      json: 1,
    }),
    {
      httpsAgent: agent,
      proxy: false, // Disable axios default proxy handling
    }
  );
  console.log(response.data);
}

submitTask();

Lưu ý: verify=False (Python) tắt xác minh SSL cho chứng chỉ chặn traffic của Fiddler. Chỉ dùng khi debug — bỏ dòng này trước khi lên production.

Tự dựng request test bằng Composer

Composer của Fiddler cho phép ghép request tới CaptchaAI từ đầu, không cần viết code — hữu ích để xác nhận proxy và giải mã HTTPS đã hoạt động đúng trước khi đụng vào code thật:

Gửi task:

POST https://ocr.captchaai.com/in.php
Content-Type: application/x-www-form-urlencoded

key=YOUR_API_KEY&method=userrecaptcha&googlekey=SITE_KEY&pageurl=https://example.com&json=1

Polling kết quả:

GET https://ocr.captchaai.com/res.php?key=YOUR_API_KEY&action=get&id=TASK_ID&json=1

Cách này nhanh hơn hẳn viết code khi bạn chỉ cần xác minh API còn hoạt động bình thường.

Lọc traffic để chỉ thấy request của CaptchaAI

Thêm filter để danh sách session không bị ngợp bởi traffic của các service khác trong cùng phiên làm việc.

Trên Fiddler Everywhere

  1. Vào tab Filters
  2. Thêm rule: Hostcontainsocr.captchaai.com
  3. Áp dụng filter

Trên Fiddler Classic

  1. Vào tab Filters
  2. Tích "Use Filters"
  3. Ở mục "Hosts", chọn "Show only the following Hosts"
  4. Nhập: ocr.captchaai.com

Giờ danh sách session chỉ còn lại request tới API CaptchaAI.

Đọc request và response trong Fiddler

Request gửi task (in.php)

Khi bắt được một request gửi task, kiểm tra các mục sau:

  1. Headers — Content-Type phải là application/x-www-form-urlencoded.
  2. Request bodykey, method, googlekey/sitekey, pageurl đã đúng giá trị chưa.
  3. Response body — thành công sẽ trả về {"status":1,"request":"TASK_ID"}.
  4. Response code — 200 = OK, 403 = lỗi API key, 429 = bị rate limit.

Request polling kết quả (res.php)

Khi polling để lấy kết quả, đối chiếu ba điểm sau:

  1. Request bodykey, action=get, id=TASK_ID, json=1.
  2. Response bodyCAPCHA_NOT_READY khi đang xử lý, {"status":1,"request":"TOKEN"} khi xong.
  3. Timing — khoảng cách giữa các lần polling nên từ 5 giây trở lên.

Các dấu hiệu lỗi thường gặp khi soi trong Fiddler

Nhìn vào request/response trong Fiddler, đây là cách đọc từng dấu hiệu:

  • Request body có googlekey trống → trích xuất sitekey thất bại ở tầng thu thập dữ liệu phía bạn.
  • Response {"status":0,"request":"ERROR_WRONG_USER_KEY"} → API key không hợp lệ.
  • Response {"status":0,"request":"ERROR_ZERO_BALANCE"} → tài khoản hết số dư.
  • Response {"status":0,"request":"ERROR_NO_SLOT_AVAILABLE"} → server đang bận, thử lại sau.
  • Không có response (timeout) → network hoặc proxy đang chặn kết nối.
  • Response code 429 → gửi quá nhiều request, giãn tần suất polling ra.

Ví dụ thực tế: lỗi tưởng do API hóa ra do crawler

Một đội QA của công ty outsourcing tại TP.HCM tích hợp CaptchaAI vào script theo dõi giá sản phẩm trên Shopee và Tiki. Script báo lỗi rải rác nhưng log ứng dụng chỉ ghi "solve failed" chung chung. Bật Fiddler, lọc theo ocr.captchaai.com, họ thấy ngay một số request có googlekey trống — module trích xuất sitekey ở tầng crawler bị lỗi trên các trang có cấu trúc DOM khác thường, không liên quan gì tới API CaptchaAI. Không có Fiddler, đội QA có thể mất hàng giờ nghi oan cho API key hoặc số dư tài khoản.

Đọc timeline để chẩn đoán độ trễ

Chế độ Timeline của Fiddler tách nhỏ thời lượng của từng request. Đối chiếu số đo thực tế với các ngưỡng dưới đây để biết đoạn nào đang chậm:

  • DNS lookup — bình thường dưới 50 mili giây; trên 500 mili giây là dấu hiệu vấn đề DNS.
  • TCP connect — bình thường dưới 100 mili giây; trên 1000 mili giây là dấu hiệu vấn đề mạng.
  • TLS handshake — bình thường dưới 200 mili giây; trên 1000 mili giây là dấu hiệu vấn đề chứng chỉ.
  • Response của server (in.php) — bình thường dưới 500 mili giây; trên 2000 mili giây nghĩa là server đang quá tải.
  • Response của server (res.php) — bình thường dưới 200 mili giây; trên 1000 mili giây là bất thường, kiểm tra lại status.

Dùng breakpoint để chỉnh request trước khi gửi đi

Breakpoint tạm dừng request trước khi nó rời máy bạn, cho phép chỉnh tham số ngay trong Fiddler mà không cần đụng vào code.

Đặt breakpoint

Fiddler Everywhere:

  1. Rules → Add Rule
  2. Match: URL contains ocr.captchaai.com/in.php
  3. Action: "Pause before sending"

Fiddler Classic:

  1. Rules → Automatic Breakpoints → Before Requests
  2. Hoặc gõ bpu ocr.captchaai.com vào thanh QuickExec

Khi request bị tạm dừng, làm gì tiếp

  1. Kiểm tra request body — xác nhận tham số đã đúng chưa
  2. Sửa tham số — đổi method, googlekey hoặc pageurl để test các giá trị khác nhau
  3. Resume — bấm "Run to Completion" để gửi request đã sửa
  4. Đọc response — xem thay đổi đó có khắc phục được lỗi không

Cách này giúp bạn xác định chính xác tham số nào đang gây lỗi mà không phải sửa và deploy lại code chỉ để thử một giá trị.

Replay lại request bị lỗi

Request lỗi có thể được gửi lại trực tiếp từ Fiddler, không cần chạy lại toàn bộ ứng dụng:

  1. Chuột phải vào session bị lỗi
  2. Chọn ReplayReissue Requests
  3. Request y hệt được gửi lại với header và body giống hệt bản gốc

Muốn sửa trước khi gửi lại:

  1. Chuột phải → Edit in Composer
  2. Sửa tham số cần test
  3. Bấm Execute

Cách này giúp bạn kiểm tra fix nhanh mà không phải restart ứng dụng mỗi lần thử một giả thuyết.

Xuất session .har để gửi CaptchaAI support

Cần chia sẻ dữ liệu debug với support CaptchaAI:

  1. Chọn các session liên quan trong Fiddler
  2. File → Export Sessions → Selected Sessions
  3. Chọn định dạng HTTPArchive (.har)
  4. Xóa API key thật khỏi file trước khi gửi đi
Find and replace your actual API key with "REDACTED" in the .har file

Câu hỏi thường gặp

Dùng Fiddler có làm chậm thời gian giải CAPTCHA không?

Không đáng kể. Fiddler chỉ cộng thêm khoảng 1–5 mili giây do phải đi qua thêm một proxy hop, trong khi thời gian giải CAPTCHA thường là 10–60 giây. Nếu bạn debug những vấn đề nhạy cảm về timing, nhớ rằng timestamp trong Fiddler ghi nhận thời điểm Fiddler nhận được dữ liệu, không phải thời điểm code của bạn gửi đi.

Có cần xóa API key trước khi gửi file .har cho CaptchaAI support không?

Có, bắt buộc. File .har xuất từ Fiddler chứa toàn bộ request body, bao gồm cả API key ở dạng plain text. Trước khi đính kèm cho support hoặc chia sẻ ở bất kỳ đâu, hãy tìm và thay API key thật bằng REDACTED như hướng dẫn ở phần xuất session bên trên.

Vì sao response cứ trả về CAPCHA_NOT_READY mãi mà task không ra kết quả?

Xem lại timestamp của từng lần polling trong Fiddler. Nếu khoảng cách giữa các lần gọi res.php nhỏ hơn 5 giây, CaptchaAI có thể chưa kịp xử lý xong — giãn polling ra tối thiểu 5 giây. Nếu đã giãn đủ mà trạng thái vẫn không đổi sau 60–90 giây, kiểm tra lại sitekey/pageurl trong request in.php, vì task có thể đã bị treo ngay từ phía nguồn.

Fiddler có bắt được traffic khi CAPTCHA chạy trong widget trên trình duyệt không?

Có. Trỏ trình duyệt qua proxy của Fiddler và bạn sẽ thấy toàn bộ vòng đời CAPTCHA phía client — tải widget, lấy challenge, và gửi token — chứ không chỉ hai endpoint in.php/res.php phía API. Cách này hữu ích khi lỗi nằm ở tầng tích hợp frontend chứ không phải ở bản thân API call.

Ngoài Fiddler, còn công cụ nào khác debug API CaptchaAI trên Linux/macOS không?

Có — mitmproxy và Charles Proxy làm được việc tương tự và chạy tốt trên Linux/macOS (Fiddler Classic chỉ chạy trên Windows; Fiddler Everywhere thì đa nền tảng). Nguyên tắc chung giống nhau ở mọi công cụ: trỏ proxy, bật giải mã HTTPS, lọc theo ocr.captchaai.com, rồi đọc request/response body.

Bài viết liên quan

Bước tiếp theo

Log lỗi API càng rõ ràng, debug càng nhanh — bắt đầu với CaptchaAI và bật Fiddler lên khi cần soi request ở mức sâu hơn.

Hướng dẫn liên quan:

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