Bắt Đầu

Polling và callback: hai cách nhận kết quả từ CaptchaAI

Câu trả lời ngắn: nếu bạn xử lý dưới 100 CAPTCHA mỗi giờ hoặc chạy script/CLI cục bộ, dùng polling — không cần hạ tầng gì thêm. Nếu đã có server chạy sẵn và khối lượng lớn hơn, chuyển sang callback (webhook) để giảm request lãng phí và nhận token gần như ngay lập tức. CaptchaAI hỗ trợ cả hai cách trên mọi loại CAPTCHA đã hỗ trợ — reCAPTCHA v2/v3, Cloudflare Turnstile, GeeTest v3, CAPTCHA ảnh/OCR... — nên lựa chọn ở đây thuần túy là bài toán hạ tầng, không phải độ chính xác.

Các đội QA thuê ngoài ở TP.HCM và Hà Nội thường chạy hàng loạt kịch bản Selenium/Playwright cho khách nước ngoài. Ở khối lượng đó, chuyển sang callback giảm rõ rệt lưu lượng request thăm dò và cho dashboard nội bộ kết quả gần thời gian thực.

Chọn polling hay callback

Bảng dưới đây tóm tắt khác biệt chính; phần chi tiết và code mẫu nằm ở các mục tiếp theo.

Yếu tố Polling Callback
Hạ tầng cần thiết Không cần Server web có URL công khai
Độ phức tạp triển khai Đơn giản Trung bình
Độ trễ sau khi giải xong 0–5 giây Gần như tức thì
Số request cho mỗi lần giải ~3–12 (các lần polling) 1 (chỉ gửi task)
Phù hợp nhất Script, dự án nhỏ App có server, khối lượng lớn
Hoạt động sau firewall ❌ (cần URL công khai)
Hoạt động trên serverless ⚠️ (cần endpoint webhook)

Dùng polling khi:

  • Chạy script cục bộ hoặc công cụ CLI
  • Đang làm prototype hoặc test
  • Ở sau firewall, không có server công khai
  • Xử lý dưới 100 CAPTCHA mỗi giờ
  • Dùng serverless function (Lambda, Cloud Functions)

Dùng callback khi:

  • Xử lý từ 100 CAPTCHA/giờ trở lên
  • Đã có web app chạy sẵn server
  • Xây hệ thống real-time, độ trễ là vấn đề quan trọng
  • Muốn giảm số lệnh gọi API
  • Xây microservice giải CAPTCHA riêng

Polling (mặc định)

Gọi endpoint res.php mỗi 5 giây cho đến khi CaptchaAI trả về token. Đây là hành vi mặc định khi bạn không truyền tham số pingback.

import requests
import time

API_KEY = "YOUR_API_KEY"

# Submit
resp = requests.get("https://ocr.captchaai.com/in.php", params={
    "key": API_KEY,
    "method": "userrecaptcha",
    "googlekey": "SITE_KEY",
    "pageurl": "https://example.com"
})
task_id = resp.text.split("|")[1]

# Poll
while True:
    time.sleep(5)
    result = requests.get("https://ocr.captchaai.com/res.php", params={
        "key": API_KEY,
        "action": "get",
        "id": task_id
    })
    if result.text == "CAPCHA_NOT_READY":
        continue
    if result.text.startswith("OK|"):
        token = result.text.split("|")[1]
        break

Ưu và nhược điểm của polling

Được: chỉ vài dòng code, không cần hạ tầng server, chạy ở mọi môi trường kể cả serverless và CLI, không lo firewall. Mất: tốn request trong lúc chờ (cứ 5 giây một lần), có độ trễ vì bạn chỉ biết kết quả sau khi hỏi lại chứ không phải ngay khi giải xong, và tổng số lệnh gọi API cao hơn callback.

Callback (webhook)

Truyền URL pingback khi gửi task. CaptchaAI sẽ tự gọi lại URL đó ngay khi giải xong, thay vì để bạn phải hỏi liên tục:

# Submit with callback URL
resp = requests.get("https://ocr.captchaai.com/in.php", params={
    "key": API_KEY,
    "method": "userrecaptcha",
    "googlekey": "SITE_KEY",
    "pageurl": "https://example.com",
    "pingback": "https://your-server.com/captcha-callback"
})
task_id = resp.text.split("|")[1]
# No polling needed — result arrives at your callback URL

CaptchaAI gửi một request GET tới URL callback của bạn, kèm id task và code token:

GET https://your-server.com/captcha-callback?id=TASK_ID&code=TOKEN

Máy chủ callback (Python Flask)

Ví dụ endpoint nhận callback và lưu kết quả tạm thời trong bộ nhớ:

from flask import Flask, request

app = Flask(__name__)
results = {}

@app.route("/captcha-callback")
def callback():
    task_id = request.args.get("id")
    token = request.args.get("code")
    results[task_id] = token
    return "OK", 200

@app.route("/get-result/<task_id>")
def get_result(task_id):
    token = results.get(task_id)
    if token:
        return {"status": "solved", "token": token}
    return {"status": "pending"}, 202

if __name__ == "__main__":
    app.run(port=8080)

Máy chủ callback (Node.js Express)

Cùng logic, viết bằng Express:

const express = require("express");
const app = express();

const results = new Map();

app.get("/captcha-callback", (req, res) => {
  const { id, code } = req.query;
  results.set(id, code);
  res.send("OK");
});

app.get("/get-result/:taskId", (req, res) => {
  const token = results.get(req.params.taskId);
  if (token) {
    res.json({ status: "solved", token });
  } else {
    res.status(202).json({ status: "pending" });
  }
});

app.listen(8080);

Ưu và nhược điểm của callback

Được: báo kết quả ngay khi giải xong, không tốn request thăm dò, hiệu quả hơn ở khối lượng lớn, hợp với kiến trúc bất đồng bộ (async). Mất: cần server truy cập công khai, phải tự xử lý độ tin cậy của webhook (thử lại, timeout), và hạ tầng/networking phức tạp hơn polling.

Kết hợp polling và callback

Muốn tận dụng tốc độ của callback nhưng vẫn có phương án dự phòng khi webhook lỗi? Kết hợp cả hai: thử callback trước, hết thời gian chờ thì rơi về polling.

import requests
import time

API_KEY = "YOUR_API_KEY"
CALLBACK_URL = "https://your-server.com/captcha-callback"

def solve_with_fallback(site_key, page_url):
    # Try callback first
    resp = requests.get("https://ocr.captchaai.com/in.php", params={
        "key": API_KEY,
        "method": "userrecaptcha",
        "googlekey": site_key,
        "pageurl": page_url,
        "pingback": CALLBACK_URL
    })
    task_id = resp.text.split("|")[1]

    # Wait for callback result (check your callback store)
    for _ in range(12):  # 60 seconds
        time.sleep(5)
        result = check_callback_store(task_id)
        if result:
            return result

    # Fallback to polling
    result = requests.get("https://ocr.captchaai.com/res.php", params={
        "key": API_KEY, "action": "get", "id": task_id
    })
    if result.text.startswith("OK|"):
        return result.text.split("|")[1]

    raise TimeoutError()

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

Nên chọn polling hay callback?

Nếu bạn xử lý dưới 100 CAPTCHA mỗi giờ, chạy script/CLI hoặc chưa có server công khai, polling là lựa chọn nhanh nhất để bắt đầu. Khi khối lượng tăng hoặc bạn đã vận hành sẵn một server, chuyển sang callback sẽ tiết kiệm request và giảm độ trễ.

Callback URL có bắt buộc dùng HTTPS không?

Không bắt buộc — HTTP vẫn hoạt động — nhưng nên dùng HTTPS, đặc biệt nếu callback của bạn xử lý token hoặc dữ liệu nhạy cảm.

Server callback bị downtime đúng lúc kết quả về thì sao?

CaptchaAI có thể thử gọi lại callback. Dù vậy, luôn nên có phương án dự phòng bằng cách polling endpoint kết quả, giống ví dụ kết hợp ở trên.

Chạy trên AWS Lambda hoặc serverless thì nên dùng cách nào?

Polling phù hợp hơn, vì serverless thường không có endpoint public thường trực để nhận callback. Nếu bắt buộc dùng callback, bạn cần triển khai riêng một endpoint webhook (ví dụ API Gateway + Lambda) để nhận request.

Callback áp dụng cho những loại CAPTCHA nào?

Cho mọi loại CaptchaAI hỗ trợ — reCAPTCHA v2/v3, Cloudflare Turnstile, GeeTest v3, CAPTCHA ảnh/OCR — vì cơ chế callback nằm ở tầng gửi task qua pingback, không phụ thuộc loại CAPTCHA.

Hướng dẫn liên quan

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