Tutorials

Nhật ký kiểm tra giải quyết CAPTCHA: Theo dõi giải quyết các yêu cầu tuân thủ

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:

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

Postagens relacionadas

DevOps & Scaling Xây dựng giải quyết CAPTCHA theo sự kiện bằng AWS SNS và CaptchaAI
Hướng dẫn Dev Ops xây dựng giải pháp giải quyết tình huống CAPTCHA bằng AWS SNS và Captcha AI, với các quyết định về kiến ​​trúc, các cân nhắc vận hành và mô hì...

Hướng dẫn Dev Ops xây dựng giải pháp giải quyết tình huống CAPTCHA bằng AWS SNS và Captcha AI, với các quyết đ...

Apr 25, 2026
DevOps & Scaling Công nhân giải quyết CAPTCHA tự động mở rộng quy mô
Hướng dẫn Dev Ops về Công nhân giải quyết quy trình tự động mở rộng CAPTCHA, với các quyết định về kiến ​​trúc, các cân nhắc vận hành và mô hình tự động hóa cho...

Hướng dẫn Dev Ops về Công nhân giải quyết quy trình tự động mở rộng CAPTCHA, với các quyết định về kiến ​​trúc...

Apr 24, 2026
Tutorials Xây dựng hàng đợi giải CAPTCHA bằng Python với CaptchaAI
Hướng dẫn từng bước để Xây dựng hàng đợi giải mã CAPTCHA bằng Python với Captcha AI, với các ví dụ có thể sử dụng lại trực tiếp và quy trình làm việc Captcha AI...

Hướng dẫn từng bước để Xây dựng hàng đợi giải mã CAPTCHA bằng Python với Captcha AI, với các ví dụ có thể sử d...

May 01, 2026