CaptchaAI cung cấp hai cách để nhận kết quả CAPTCHA đã giải: bỏ phiếu (bạn hỏi liên tục) và gọi lại (chúng tôi sẽ thông báo cho bạn). Cả hai đều hoạt động với tất cả các loại CAPTCHA. Đây là khi nào nên sử dụng từng cái.
Bỏ phiếu (Mặc định)
Thăm dò điểm cuối res.php cứ sau 5 giây cho đến khi có kết quả:
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 điểm bỏ phiếu
- Đơn giản để thực hiện
- Không cần cơ sở hạ tầng máy chủ
- Hoạt động trong mọi môi trường (script, serverless, CLI)
- Không có mối lo ngại về tường lửa hoặc mạng
Nhược điểm bỏ phiếu
- Lãng phí các yêu cầu trong khi chờ đợi (cứ 5 giây một lần)
- Thêm độ trễ - bạn kiểm tra sau khi quá trình giải quyết hoàn tất chứ không phải ngay lập tức
- Khối lượng lệnh gọi API cao hơn
Gọi lại (Webhook)
Cung cấp URL pingback khi gửi. CaptchaAI đăng kết quả lên URL của bạn khi giải xong:
# 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 yêu cầu GET tới URL gọi lại của bạn:
GET https://your-server.com/captcha-callback?id=TASK_ID&code=TOKEN
Máy chủ gọi lại (Python Flask)
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ủ gọi lại (Node.js 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 điểm gọi lại
- Thông báo ngay lập tức khi giải quyết xong
- Không có yêu cầu bỏ phiếu lãng phí
- Hiệu quả hơn khi sử dụng với số lượng lớn
- Tốt hơn cho kiến trúc không đồng bộ
Nhược điểm gọi lại
- Yêu cầu một máy chủ có thể truy cập công khai
- Cần xử lý độ tin cậy của webhook (thử lại, hết thời gian chờ)
- Cơ sở hạ tầng phức tạp hơn
- Yêu cầu thiết lập Tường lửa/networking
So sánh
| Yếu tố | Bỏ phiếu | Gọi lại |
|---|---|---|
| Cơ sở hạ tầng cần thiết | không có | Máy chủ web có URL công khai |
| Độ phức tạp thực hiện | Đơn giản | Trung bình |
| Độ trễ sau khi giải quyết | 0-5 giây | Gần ngay lập tức |
| Lệnh gọi API cho mỗi lần giải | ~3-12 (yêu cầu bỏ phiếu) | 1 (chỉ gửi) |
| Tốt nhất cho | Kịch bản, dự án nhỏ | Ứng dụng máy chủ, khối lượng lớn |
| Hoạt động đằng sau tường lửa | ✅ | ❌ (cần URL công khai) |
| Hoạt động ở chế độ không có máy chủ | ✅ | ⚠️ (yêu cầu điểm cuối webhook) |
Khi nào nên sử dụng mỗi
Sử dụng bỏ phiếu khi:
- Chạy tập lệnh cục bộ hoặc công cụ CLI
- Xây dựng nguyên mẫu hoặc thử nghiệm
- Đằng sau tường lửa không có máy chủ công cộng
- Xử lý ít hơn 100 CAPTCHA mỗi giờ
- Sử dụng các chức năng không có máy chủ (Lambda, Cloud Function)
Sử dụng lệnh gọi lại khi:
- Xử lý hơn 100 CAPTCHA mỗi giờ
- Chạy một ứng dụng web với máy chủ đã có sẵn
- Xây dựng hệ thống thời gian thực trong đó độ trễ là vấn đề quan trọng
- Bạn muốn giảm thiểu khối lượng cuộc gọi API
- Xây dựng microservice giải CAPTCHA
Phương pháp lai
Sử dụng lệnh gọi lại với dự phòng bỏ phiếu:
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
URL gọi lại có cần HTTPS không?
HTTPS được khuyên dùng để bảo mật nhưng HTTP cũng hoạt động. Nếu lệnh gọi lại của bạn xử lý dữ liệu nhạy cảm (mã thông báo), hãy sử dụng HTTPS.
Điều gì sẽ xảy ra nếu máy chủ gọi lại của tôi ngừng hoạt động khi có kết quả?
CaptchaAI có thể thử gọi lại. Là một mạng lưới an toàn, bạn luôn có thể quay lại việc thăm dò điểm cuối kết quả.
Tôi có thể sử dụng cùng một URL gọi lại cho nhiều tác vụ không?
Vâng. Mỗi lệnh gọi lại bao gồm tham số id để bạn có thể khớp kết quả với nhiệm vụ của chúng.
Hướng dẫn liên quan
- Định dạng phản hồi API
- Thiết lập và xác thực khóa API
- CaptchaAI Bắt đầu nhanh