Khắc Phục Sự Cố

Tỷ lệ giải CAPTCHA giảm đột ngột: cách chẩn đoán nguyên nhân

Tỷ lệ giải CAPTCHA giảm đột ngột luôn quy về một trong bốn nhóm nguyên nhân: lỗi trả về từ API, token bị trang đích từ chối, proxy xuống cấp, hoặc trang mục tiêu vừa thay đổi cấu trúc. Bài viết này đưa ra quy trình chẩn đoán theo từng bước để bạn xác định đúng nguyên nhân — thay vì đoán mò hoặc mở ticket hỗ trợ khi vấn đề nằm ngay trong pipeline của chính bạn.

Ví dụ thực tế: một đội thu thập dữ liệu giá tại TP.HCM theo dõi Shopee và Tiki mỗi đêm phát hiện tỷ lệ giải giảm từ 95% xuống còn 60% ngay sau một bản deploy. Thay vì báo hỗ trợ ngay, họ chạy lần lượt sáu bước dưới đây để khoanh vùng nguyên nhân trong vòng chưa đầy một giờ.

Tra cứu nhanh: triệu chứng và hành động đầu tiên

Nếu bạn cần xử lý ngay, đối chiếu triệu chứng đang gặp với danh sách dưới đây trước khi đọc chi tiết từng bước:

  1. Toàn bộ request lỗi, đều là ERROR_WRONG_USER_KEY — khả năng cao nhất là API key sai; kiểm tra lại API key.
  2. Tỷ lệ giảm dần theo từng ngày — khả năng cao nhất là proxy xuống cấp; đổi sang nguồn proxy khác.
  3. Đột ngột tụt xuống 0% — khả năng cao nhất là sitekey hoặc trang đã đổi; trích xuất lại thông số CAPTCHA.
  4. Giải xong nhưng token bị trang từ chối — khả năng cao nhất là token hết hạn hoặc domain không khớp; kiểm tra thời gian xử lý và pageurl.
  5. Chạy tốt trên staging, lỗi trên production — khả năng cao nhất là giới hạn riêng theo domain; so sánh thông số giữa hai môi trường.

Không tìm thấy triệu chứng khớp, hoặc muốn hiểu rõ nguyên nhân gốc? Làm theo quy trình đầy đủ bên dưới.

Sơ đồ chẩn đoán nhanh: bốn nguyên nhân khiến tỷ lệ giải CAPTCHA giảm

Solve rate dropped
├── Is the API returning errors? → Check error codes
│   ├── ERROR_WRONG_USER_KEY → API key issue
│   ├── ERROR_ZERO_BALANCE → Balance depleted
│   ├── ERROR_NO_SLOT_AVAILABLE → Rate limiting
│   └── ERROR_CAPTCHA_UNSOLVABLE → CAPTCHA changed
├── Are tokens returned but rejected by the target site?
│   ├── Token expired before submission → Speed up injection
│   ├── Sitekey changed → Re-extract from page
│   └── Domain mismatch → Check pageurl parameter
├── Are proxies failing?
│   ├── Proxy banned by target → Rotate proxies
│   └── Proxy timeout → Check proxy health
└── Did the target site change?
    ├── New CAPTCHA type → Update method parameter
    ├── JavaScript changes → Re-analyze page
    └── Rate limiting by site → Reduce frequency

Bước 1: Đọc mã lỗi trả về từ API CaptchaAI

Chạy tập lệnh chẩn đoán nhanh sau — nó gọi getbalance để loại trừ nguyên nhân số dư, rồi chạy 5 lần giải thử để gom thống kê lỗi:

# diagnose_solve_rate.py
import os
import requests
from collections import Counter

API_KEY = os.environ.get("CAPTCHAAI_KEY", "YOUR_API_KEY")

def check_balance():
    """Verify API key and balance."""
    resp = requests.get("https://ocr.captchaai.com/res.php", params={
        "key": API_KEY, "action": "getbalance", "json": "1",
    })
    result = resp.json()
    print(f"Balance: {result}")
    return result

def test_solve(sitekey, pageurl, runs=5):
    """Run test solves and collect error statistics."""
    errors = Counter()
    successes = 0

    for i in range(runs):
        # Submit
        resp = requests.get("https://ocr.captchaai.com/in.php", params={
            "key": API_KEY,
            "method": "userrecaptcha",
            "googlekey": sitekey,
            "pageurl": pageurl,
            "json": "1",
        })
        result = resp.json()

        if result.get("status") != 1:
            errors[result.get("request", "UNKNOWN")] += 1
            print(f"  Run {i+1}: Submit error: {result.get('request')}")
            continue

        task_id = result["request"]
        import time
        time.sleep(15)

        # Poll
        for _ in range(25):
            poll = requests.get("https://ocr.captchaai.com/res.php", params={
                "key": API_KEY, "action": "get",
                "id": task_id, "json": "1",
            })
            poll_result = poll.json()

            if poll_result.get("status") == 1:
                successes += 1
                print(f"  Run {i+1}: Solved")
                break
            if poll_result.get("request") != "CAPCHA_NOT_READY":
                errors[poll_result.get("request", "UNKNOWN")] += 1
                print(f"  Run {i+1}: Error: {poll_result.get('request')}")
                break
            time.sleep(5)
        else:
            errors["TIMEOUT"] += 1
            print(f"  Run {i+1}: Timeout")

    print(f"\nResults: {successes}/{runs} solved")
    if errors:
        print(f"Errors: {dict(errors)}")

# Run diagnostics
print("=== Balance Check ===")
check_balance()

print("\n=== Test Solves ===")
test_solve("YOUR_SITEKEY", "https://your-staging.example.com", runs=5)

Nếu script trả toàn ERROR_WRONG_USER_KEY hoặc ERROR_ZERO_BALANCE, dừng lại — vấn đề nằm ở API key/số dư, không phải ở trang đích hay proxy. Chuyển sang bước tiếp theo chỉ khi các lỗi cơ bản này đã loại trừ.

Bước 2: Kiểm tra sitekey và loại CAPTCHA trên trang đích

Nguyên nhân phổ biến nhất khiến tỷ lệ giải giảm là sitekey hoặc cấu trúc trang đã thay đổi — không phải lỗi từ CaptchaAI.

Việc cần kiểm tra Cách xác minh
Sitekey có bị đổi không Mở trang đích, bật DevTools (F12) và tìm: reCAPTCHA dùng thuộc tính data-sitekey hoặc lệnh gọi grecaptcha.render; Cloudflare Turnstile dùng data-sitekey trong widget; GeeTest dùng tham số gt lúc khởi tạo. Đối chiếu với sitekey đang dùng trong code — chỉ cần lệch một ký tự, request sẽ thất bại toàn bộ.
Trang có đổi sang loại CAPTCHA khác không Nhiều trang chuyển đổi nhà cung cấp theo thời gian: reCAPTCHA v2 → reCAPTCHA v3 (invisible), reCAPTCHA → Cloudflare Turnstile, CAPTCHA hình ảnh → reCAPTCHA Enterprise. Nếu loại đã đổi, cập nhật tham số method cho khớp — gửi userrecaptcha cho một widget Turnstile sẽ luôn lỗi, dù key và số dư đều ổn.

Bước 3: Đánh giá chất lượng proxy

Chất lượng proxy ảnh hưởng trực tiếp đến tỷ lệ giải, đặc biệt với CAPTCHA dạng token — nơi CaptchaAI dùng chính proxy của bạn để giải.

  • Proxy bị trang đích chặn (triệu chứng: token đã giải nhưng bị từ chối) → đổi sang nguồn proxy khác, đa dạng hơn.
  • Proxy trả lỗi (triệu chứng: ERROR_PROXY_NOT_FOUND) → xác minh proxy còn sống và truy cập được.
  • Proxy datacenter bị nhận diện (triệu chứng: tỷ lệ giải thấp hơn hẳn) → chuyển sang nguồn proxy đa dạng hơn.
  • Sai vùng địa lý proxy (triệu chứng: kết quả thất thường) → khớp quốc gia proxy với trang đích.

Trước tiên, hãy test không dùng proxy (nếu loại CAPTCHA hỗ trợ giải proxyless) để xác định proxy có phải là nguyên nhân hay không.

Bước 4: Kiểm tra thời hạn token

Token CAPTCHA chỉ có hiệu lực trong thời gian ngắn:

  • reCAPTCHA v2: ~120 giây
  • reCAPTCHA v3: ~120 giây
  • Cloudflare Turnstile: ~300 giây
  • GeeTest v3: ~60 giây

Nếu pipeline của bạn mất quá nhiều thời gian giữa lúc nhận token và lúc đưa nó vào form, token sẽ hết hạn và trang đích từ chối.

Cách xử lý: đo thời gian giữa getTaskResult và lúc submit form. Nếu vượt 60 giây, tối ưu lại pipeline — ví dụ chuẩn bị sẵn selector của form trước khi chờ token trả về.

Bước 5: Phân tích tần suất lỗi theo mã lỗi

Sắp xếp lỗi theo tần suất xuất hiện để tìm đúng nguyên nhân gốc:

Lỗi Ý nghĩa Hành động
ERROR_CAPTCHA_UNSOLVABLE CAPTCHA quá phức tạp hoặc đã đổi Báo cho CaptchaAI; kiểm tra lại sitekey
ERROR_WRONG_CAPTCHA_ID Polling nhầm ID task Sửa logic theo dõi ID task trong code
ERROR_ZERO_BALANCE Hết số dư Nạp thêm số dư
ERROR_NO_SLOT_AVAILABLE Bị giới hạn tần suất Giảm số luồng đồng thời hoặc thêm delay
CAPCHA_NOT_READY (timeout) Giải mất quá lâu Tăng timeout polling; kiểm tra sitekey còn hợp lệ

Bước 6: Đối chiếu tỷ lệ giải hiện tại với baseline

Nếu trước đó bạn từng đo benchmark, hãy so số liệu hiện tại với baseline đã ghi lại:

Số liệu Baseline Hiện tại Chênh lệch Cần lưu ý?
Tỷ lệ giải 95% ? Giảm >5% = cần điều tra
Thời gian giải trung bình 15 giây ? Tăng >50% = cần điều tra
Tỷ lệ lỗi 2% ? >5% = cần điều tra
Tỷ lệ token được chấp nhận 98% ? Giảm >3% = trang đích đã đổi

Khi nào nên báo cáo cho đội hỗ trợ CaptchaAI

Liên hệ hỗ trợ CaptchaAI khi đã kiểm tra hết các bước trên nhưng tỷ lệ giải vẫn thấp, khi tỷ lệ ERROR_CAPTCHA_UNSOLVABLE vượt 20% trên các sitekey trước đó vẫn chạy tốt, khi số dư hiển thị đúng nhưng vẫn giải lỗi liên tục, hoặc khi sự cố kéo dài hơn 2 giờ mà không có dấu hiệu cải thiện.

Đính kèm trong báo cáo:

  1. Loại CAPTCHA và sitekey
  2. URL trang đích
  3. Phân phối lỗi (lấy từ script chẩn đoán ở Bước 1)
  4. Thời điểm sự cố bắt đầu
  5. Mọi thay đổi bạn đã thực hiện trong code gần đây

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

Tỷ lệ giải CAPTCHA giảm bao nhiêu thì cần điều tra?

Giảm quá 5% so với baseline bạn từng đo là ngưỡng nên bắt đầu điều tra. Biến động 1–3% giữa các ngày là bình thường; tỷ lệ không giải được (ERROR_CAPTCHA_UNSOLVABLE) ở mức 2–5% cũng không phải dấu hiệu bất thường với các CAPTCHA phức tạp.

Tỷ lệ giải có thể khác nhau giữa các trang web không?

Có. Mỗi sitekey có cấu hình rủi ro riêng nên tỷ lệ giải cơ bản không nhất thiết giống nhau giữa hai trang cùng loại CAPTCHA. Khi một trang nâng cấp thử thách (bật tính năng doanh nghiệp, tăng độ khó), tỷ lệ giải có thể giảm tạm thời cho đến khi solver của CaptchaAI thích ứng.

Trang đích chuyển sang loại CAPTCHA CaptchaAI chưa hỗ trợ thì sao?

CaptchaAI hiện chưa hỗ trợ hCaptcha, FunCaptcha (Arkose Labs) và GeeTest v4 (GeeTest v4 đang trong lộ trình, sắp ra mắt). Nếu trang đích đổi sang một trong ba loại này, tỷ lệ giải sẽ tụt về 0% dù pipeline của bạn không hề có lỗi — kiểm tra loại CAPTCHA thực tế trên trang trước khi mất thời gian debug code.

Làm sao phân biệt lỗi do proxy hay do phía CaptchaAI?

Chạy lại test không dùng proxy (với loại CAPTCHA hỗ trợ giải proxyless). Nếu tỷ lệ giải phục hồi, nguyên nhân nằm ở proxy; nếu vẫn thấp, vấn đề nằm ở sitekey, tham số request hoặc phía CaptchaAI — xem lại Bước 3 và Bước 5 ở trên.

Tỷ lệ giải phục hồi nhanh cỡ nào sau khi khắc phục?

Nếu nguyên nhân ở phía CaptchaAI, tỷ lệ thường phục hồi trong vài giờ. Nếu trang đích đã đổi sitekey hoặc loại CAPTCHA, bạn cần cập nhật tham số tích hợp trước — tỷ lệ sẽ không tự phục hồi cho tới khi đó.

Bài viết liên quan

Bước tiếp theo

Giữ cho pipeline giải CAPTCHA của bạn luôn ổn định — lấy API key CaptchaAI.

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

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