Khi tổ chức của bạn giải quyết hàng nghìn CAPTCHA hàng ngày, bạn cần có bản ghi lại mọi yêu cầu. Nhật ký kiểm tra trả lời các câu hỏi như: Ai đã kích hoạt giải pháp này? Nó dành cho trang web nào? Nó có giá bao nhiêu? Nó xảy ra khi nào? Hướng dẫn này chỉ ra cách triển khai ghi nhật ký kiểm tra toàn diện choCaptchaAIhoạt động.
Những gì cần đăng nhập
Mỗi lần giải CAPTCHA phải ghi lại:
| trường | Mục đích | Ví dụ |
|---|---|---|
timestamp |
Khi yêu cầu được đưa ra | 2026-04-04T14:30:00Z |
request_id |
Mã định danh duy nhất cho giải pháp này | uuid4() |
captcha_type |
Phương pháp CAPTCHA được sử dụng | userrecaptcha |
target_site |
URL trang đang được giải quyết | https://staging.example.com/qa-login |
task_id |
ID nhiệm vụ CaptchaAI | 73829451 |
status |
kết quả | solved, failed, timeout |
solve_time_ms |
Thời gian từ khi gửi đến khi có kết quả | 18432 |
error_code |
Lỗi nếu thất bại | ERROR_CAPTCHA_UNSOLVABLE |
initiator |
Ai hoặc cái gì đã kích hoạt việc giải quyết | scraper-job-42 |
cost |
Chi phí ước tính | 0.003 |
Không đăng nhập: Khóa API, mã thông báo CAPTCHA (chúng là tạm thời) hoặc thông tin nhận dạng cá nhân từ các trang web mục tiêu.
Triển khai Python
# audit_solver.py
import os
import uuid
import time
import json
import logging
from datetime import datetime, timezone
import requests
API_KEY = os.environ.get("CAPTCHAAI_KEY", "YOUR_API_KEY")
# Configure audit logger — separate from application logs
audit_logger = logging.getLogger("captcha_audit")
audit_logger.setLevel(logging.INFO)
# File handler with rotation
from logging.handlers import RotatingFileHandler
handler = RotatingFileHandler(
"captcha_audit.jsonl",
maxBytes=50_000_000, # 50 MB per file
backupCount=10,
)
handler.setFormatter(logging.Formatter("%(message)s"))
audit_logger.addHandler(handler)
def log_audit(record):
"""Write a structured audit record."""
audit_logger.info(json.dumps(record, default=str))
def solve_with_audit(sitekey, pageurl, captcha_type="userrecaptcha",
initiator="unknown"):
"""Solve a CAPTCHA with full audit logging."""
request_id = str(uuid.uuid4())
start = time.time()
audit_record = {
"request_id": request_id,
"timestamp": datetime.now(timezone.utc).isoformat(),
"captcha_type": captcha_type,
"target_site": pageurl,
"initiator": initiator,
"status": "submitted",
}
session = requests.Session()
try:
# Submit
resp = session.get("https://ocr.captchaai.com/in.php", params={
"key": API_KEY,
"method": captcha_type,
"googlekey": sitekey,
"pageurl": pageurl,
"json": "1",
})
result = resp.json()
if result.get("status") != 1:
audit_record.update({
"status": "submit_failed",
"error_code": result.get("request"),
"solve_time_ms": int((time.time() - start) * 1000),
})
log_audit(audit_record)
return None
task_id = result["request"]
audit_record["task_id"] = task_id
# Poll
time.sleep(15)
for _ in range(25):
poll = session.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:
solve_time = int((time.time() - start) * 1000)
audit_record.update({
"status": "solved",
"solve_time_ms": solve_time,
"cost_estimate": 0.003, # Adjust per your rate
})
log_audit(audit_record)
return poll_result["request"]
if poll_result.get("request") != "CAPCHA_NOT_READY":
audit_record.update({
"status": "failed",
"error_code": poll_result.get("request"),
"solve_time_ms": int((time.time() - start) * 1000),
})
log_audit(audit_record)
return None
time.sleep(5)
audit_record.update({
"status": "timeout",
"solve_time_ms": int((time.time() - start) * 1000),
})
log_audit(audit_record)
return None
except Exception as e:
audit_record.update({
"status": "error",
"error_code": str(e)[:200],
"solve_time_ms": int((time.time() - start) * 1000),
})
log_audit(audit_record)
raise
# Usage
token = solve_with_audit(
sitekey="6Le-wvkSAAAAAPBMRTvw0Q4Muexq9bi0DJwx_mJ-",
pageurl="https://www.google.com/recaptcha/api2/demo",
initiator="price-scraper-v2",
)
Đầu ra nhật ký kiểm tra (định dạng JSONL)
{"request_id":"a1b2c3d4-...","timestamp":"2026-04-04T14:30:00+00:00","captcha_type":"userrecaptcha","target_site":"https://www.google.com/recaptcha/api2/demo","initiator":"price-scraper-v2","status":"solved","task_id":"73829451","solve_time_ms":18432,"cost_estimate":0.003}
Triển khai JavaScript
// audit_solver.js
const fs = require('fs');
const { v4: uuidv4 } = require('uuid');
const axios = require('axios');
const API_KEY = process.env.CAPTCHAAI_KEY || 'YOUR_API_KEY';
const AUDIT_FILE = 'captcha_audit.jsonl';
function logAudit(record) {
fs.appendFileSync(AUDIT_FILE, JSON.stringify(record) + '\n');
}
async function solveWithAudit(sitekey, pageurl, initiator = 'unknown') {
const requestId = uuidv4();
const start = Date.now();
const record = {
request_id: requestId,
timestamp: new Date().toISOString(),
captcha_type: 'userrecaptcha',
target_site: pageurl,
initiator,
status: 'submitted',
};
try {
const submit = await axios.get('https://ocr.captchaai.com/in.php', {
params: {
key: API_KEY, method: 'userrecaptcha',
googlekey: sitekey, pageurl, json: '1',
},
});
if (submit.data.status !== 1) {
record.status = 'submit_failed';
record.error_code = submit.data.request;
record.solve_time_ms = Date.now() - start;
logAudit(record);
return null;
}
record.task_id = submit.data.request;
await new Promise(r => setTimeout(r, 15000));
for (let i = 0; i < 25; i++) {
const poll = await axios.get('https://ocr.captchaai.com/res.php', {
params: { key: API_KEY, action: 'get', id: submit.data.request, json: '1' },
});
if (poll.data.status === 1) {
record.status = 'solved';
record.solve_time_ms = Date.now() - start;
record.cost_estimate = 0.003;
logAudit(record);
return poll.data.request;
}
if (poll.data.request !== 'CAPCHA_NOT_READY') {
record.status = 'failed';
record.error_code = poll.data.request;
record.solve_time_ms = Date.now() - start;
logAudit(record);
return null;
}
await new Promise(r => setTimeout(r, 5000));
}
record.status = 'timeout';
record.solve_time_ms = Date.now() - start;
logAudit(record);
return null;
} catch (e) {
record.status = 'error';
record.error_code = e.message.slice(0, 200);
record.solve_time_ms = Date.now() - start;
logAudit(record);
throw e;
}
}
Truy vấn nhật ký kiểm tra
Tóm tắt hàng ngày
import json
from collections import Counter
from datetime import date
def daily_summary(log_file, target_date=None):
"""Generate a daily summary from audit logs."""
target = target_date or date.today().isoformat()
statuses = Counter()
total_cost = 0
solve_times = []
with open(log_file) as f:
for line in f:
record = json.loads(line)
if record["timestamp"].startswith(target):
statuses[record["status"]] += 1
total_cost += record.get("cost_estimate", 0)
if record.get("solve_time_ms"):
solve_times.append(record["solve_time_ms"])
print(f"Date: {target}")
print(f"Total requests: {sum(statuses.values())}")
print(f"Statuses: {dict(statuses)}")
print(f"Estimated cost: ${total_cost:.2f}")
if solve_times:
print(f"Median solve time: {sorted(solve_times)[len(solve_times)//2]}ms")
daily_summary("captcha_audit.jsonl")
Lưu giữ và lưu trữ
| khối lượng | Kích thước nhật ký hàng ngày | Lưu trữ hàng tháng | Khuyến nghị |
|---|---|---|---|
| 100 giải/day | ~30 KB | ~1 MB | Tệp cục bộ |
| 1.000 giải/day | ~300 KB | ~10 MB | Tệp cục bộ + xoay |
| 10.000 giải quyết/day | ~3 MB | ~100MB | Gửi đến công cụ tổng hợp nhật ký |
| 100.000 giải quyết/day | ~30 MB | ~1GB | Ghi nhật ký tập trung (ELK, Datadog) |
Khắc phục sự cố
| Vấn đề | Nguyên nhân | Cách xử lý |
|---|---|---|
| Tệp nhật ký ngày càng lớn | Không có cấu hình xoay | Sử dụng RotatingFileHandler hoặc logrotate |
| Thiếu hồ sơ kiểm toán | Ngoại lệ trước khi đăng nhập | Đăng nhập khối finally |
| Viết chậm ở âm lượng lớn | Tệp đồng bộ I/O | Sử dụng ghi hoặc đệm tệp không đồng bộ |
| Dấu thời gian không nhất quán | Trôi đồng hồ hệ thống | Sử dụng NTP; đăng nhập UTC |
Câu hỏi thường gặp
Tôi có nên ghi mã thông báo CAPTCHA vào quá trình kiểm tra không?
Không. Mã thông báo chỉ là tạm thời (hết hạn sau 60–300 giây) và không có giá trị kiểm tra. Việc ghi nhật ký chúng sẽ làm tăng dung lượng lưu trữ mà không mang lại lợi ích gì.
Tôi có thể sử dụng nhật ký kiểm tra để đối chiếu thanh toán không?
Vâng. So sánh tổng số nhật ký kiểm tra của bạn với bảng điều khiển sử dụng của CaptchaAI để xác minh tính chính xác của hóa đơn.
Tôi nên đặt khoảng thời gian lưu giữ nào?
90 ngày là tiêu chuẩn đối với nhật ký kiểm tra hoạt động. Để ghi nhật ký theo hướng tuân thủ, hãy kiểm tra các yêu cầu trong ngành của bạn (SOC 2, GDPR, HIPAA).
bài viết liên quan
- Dynamodb Serverless Captcha Giải quyết theo dõi
Các bước tiếp theo
Thêm trách nhiệm giải trình cho mọi giải pháp CAPTCHA —lấy khóa API CaptchaAI của bạn.
Hướng dẫn liên quan:
- Giám sát bảng điều khiển sử dụng
- Ghi nhật ký có cấu trúc
- Kiểm tra số dư và tự động nạp tiền