Tài Liệu Tham Khảo

CaptchaAI trong sản xuất: Hướng dẫn quản lý cấu hình

Các khóa API được mã hóa cứng và thời gian chờ hoạt động cho các nguyên mẫu. Sản xuất cần cấu hình dành riêng cho môi trường, quản lý bí mật và khả năng thay đổi cài đặt mà không cần triển khai lại.

Cấu hình phân cấp

Priority (highest → lowest):

1. Environment variables     ← deployment-specific overrides
2. Config file (YAML/JSON)   ← version-controlled defaults
3. Application defaults      ← fallback values in code

Tham khảo cấu hình hoàn chỉnh

tham số Biến Env Mặc định Mô tả
Khóa API CAPTCHAAI_API_KEY Bắt buộc. Khóa API CaptchaAI của bạn
Gửi URL CAPTCHAAI_SUBMIT_URL https://ocr.captchaai.com/in.php Điểm cuối gửi nhiệm vụ
URL thăm dò ý kiến CAPTCHAAI_POLL_URL https://ocr.captchaai.com/res.php Điểm cuối thăm dò kết quả
Khoảng thời gian thăm dò ý kiến CAPTCHAAI_POLL_INTERVAL 5 Số giây giữa các lần bỏ phiếu
Số lần thăm dò tối đa CAPTCHAAI_MAX_POLLS 60 Số lần bỏ phiếu tối đa trước khi hết thời gian
Đồng thời CAPTCHAAI_CONCURRENCY 10 Nhiệm vụ CAPTCHA song song tối đa
Hết giờ CAPTCHAAI_TIMEOUT 300 Tổng thời gian chờ tính bằng giây
ủy quyền CAPTCHAAI_PROXY URL proxy để giải CAPTCHA
URL gọi lại CAPTCHAAI_CALLBACK_URL URL webhook cho kết quả không đồng bộ
Thử lại lần thử CAPTCHAAI_RETRIES 3 Thử lại các lỗi tạm thời
Cấp độ nhật ký CAPTCHAAI_LOG_LEVEL info Ghi nhật ký chi tiết

Trình tải cấu hình

Python

import os
import yaml
from dataclasses import dataclass, field
from pathlib import Path

@dataclass
class CaptchaAIConfig:
    api_key: str = ""
    submit_url: str = "https://ocr.captchaai.com/in.php"
    poll_url: str = "https://ocr.captchaai.com/res.php"
    poll_interval: int = 5
    max_polls: int = 60
    concurrency: int = 10
    timeout: int = 300
    proxy: str = ""
    callback_url: str = ""
    retries: int = 3
    log_level: str = "info"

    @classmethod
    def load(cls, config_path=None):
        """Load config: env vars override file, which overrides defaults."""
        config = cls()

        # Layer 2: Config file
        if config_path and Path(config_path).exists():
            with open(config_path) as f:
                file_config = yaml.safe_load(f) or {}
            for key, value in file_config.items():
                if hasattr(config, key):
                    setattr(config, key, value)

        # Layer 1: Environment variables (highest priority)
        env_map = {
            "CAPTCHAAI_API_KEY": "api_key",
            "CAPTCHAAI_SUBMIT_URL": "submit_url",
            "CAPTCHAAI_POLL_URL": "poll_url",
            "CAPTCHAAI_POLL_INTERVAL": "poll_interval",
            "CAPTCHAAI_MAX_POLLS": "max_polls",
            "CAPTCHAAI_CONCURRENCY": "concurrency",
            "CAPTCHAAI_TIMEOUT": "timeout",
            "CAPTCHAAI_PROXY": "proxy",
            "CAPTCHAAI_CALLBACK_URL": "callback_url",
            "CAPTCHAAI_RETRIES": "retries",
            "CAPTCHAAI_LOG_LEVEL": "log_level",
        }

        for env_key, attr_name in env_map.items():
            value = os.environ.get(env_key)
            if value is not None:
                # Cast to correct type
                current = getattr(config, attr_name)
                if isinstance(current, int):
                    value = int(value)
                setattr(config, attr_name, value)

        config.validate()
        return config

    def validate(self):
        if not self.api_key:
            raise ValueError("CAPTCHAAI_API_KEY is required")
        if self.poll_interval < 1:
            raise ValueError("poll_interval must be >= 1")
        if self.concurrency < 1:
            raise ValueError("concurrency must be >= 1")

# Usage
config = CaptchaAIConfig.load("config/captchaai.yaml")
print(f"Concurrency: {config.concurrency}, Timeout: {config.timeout}s")

JavaScript

const fs = require("fs");
const yaml = require("js-yaml");
const path = require("path");

class CaptchaAIConfig {
  static defaults = {
    apiKey: "",
    submitUrl: "https://ocr.captchaai.com/in.php",
    pollUrl: "https://ocr.captchaai.com/res.php",
    pollInterval: 5,
    maxPolls: 60,
    concurrency: 10,
    timeout: 300,
    proxy: "",
    callbackUrl: "",
    retries: 3,
    logLevel: "info",
  };

  static envMap = {
    CAPTCHAAI_API_KEY: "apiKey",
    CAPTCHAAI_SUBMIT_URL: "submitUrl",
    CAPTCHAAI_POLL_URL: "pollUrl",
    CAPTCHAAI_POLL_INTERVAL: { key: "pollInterval", type: "int" },
    CAPTCHAAI_MAX_POLLS: { key: "maxPolls", type: "int" },
    CAPTCHAAI_CONCURRENCY: { key: "concurrency", type: "int" },
    CAPTCHAAI_TIMEOUT: { key: "timeout", type: "int" },
    CAPTCHAAI_PROXY: "proxy",
    CAPTCHAAI_CALLBACK_URL: "callbackUrl",
    CAPTCHAAI_RETRIES: { key: "retries", type: "int" },
    CAPTCHAAI_LOG_LEVEL: "logLevel",
  };

  static load(configPath = null) {
    let config = { ...CaptchaAIConfig.defaults };

    // Layer 2: Config file
    if (configPath && fs.existsSync(configPath)) {
      const ext = path.extname(configPath);
      const raw = fs.readFileSync(configPath, "utf8");
      const fileConfig = ext === ".json" ? JSON.parse(raw) : yaml.load(raw);
      config = { ...config, ...fileConfig };
    }

    // Layer 1: Environment variables
    for (const [envKey, mapping] of Object.entries(CaptchaAIConfig.envMap)) {
      const value = process.env[envKey];
      if (value !== undefined) {
        const attrKey = typeof mapping === "string" ? mapping : mapping.key;
        const type = typeof mapping === "string" ? "string" : mapping.type;
        config[attrKey] = type === "int" ? parseInt(value, 10) : value;
      }
    }

    CaptchaAIConfig.validate(config);
    return config;
  }

  static validate(config) {
    if (!config.apiKey) throw new Error("CAPTCHAAI_API_KEY is required");
    if (config.pollInterval < 1) throw new Error("pollInterval must be >= 1");
    if (config.concurrency < 1) throw new Error("concurrency must be >= 1");
  }
}

// Usage
const config = CaptchaAIConfig.load("config/captchaai.yaml");
console.log(`Concurrency: ${config.concurrency}, Timeout: ${config.timeout}s`);

Tệp cấu hình theo môi trường

# config/captchaai.yaml — base
api_key: ""  # Always set via env var
concurrency: 5
poll_interval: 5
retries: 3
log_level: info
# config/captchaai.production.yaml
concurrency: 20
poll_interval: 3
timeout: 180
log_level: warning
# config/captchaai.staging.yaml
concurrency: 3
poll_interval: 5
timeout: 300
log_level: debug

Quản lý bí mật

Không bao giờ lưu trữ khóa API trong tệp cấu hình hoặc kiểm soát nguồn.

phương pháp Tốt nhất cho Ví dụ
Biến môi trường Thùng chứa, CI/CD export CAPTCHAAI_API_KEY=abc123
Trình quản lý bí mật AWS Cơ sở hạ tầng AWS Tìm nạp khi khởi động; tự động xoay
HashiCorp Vault Đa đám mây, tại chỗ Bí mật động với TTL
Bí mật của Docker Docker Swarm / Soạn thảo Được gắn tại /run/secrets/
Tệp .env (chỉ dành cho nhà phát triển) Phát triển địa phương Thư viện dotenv; .gitignore

Ví dụ soạn thảo Docker

services:
  captcha-worker:
    image: captcha-worker:latest
    environment:

      - CAPTCHAAI_API_KEY=${CAPTCHAAI_API_KEY}
      - CAPTCHAAI_CONCURRENCY=15
      - CAPTCHAAI_LOG_LEVEL=warning
    env_file:

      - .env.production

Cờ tính năng

Chuyển đổi các khả năng mà không cần triển khai lại:

class FeatureFlags:
    def __init__(self):
        self.flags = {
            "use_callback": os.environ.get("FF_USE_CALLBACK", "false") == "true",
            "enable_proxy": os.environ.get("FF_ENABLE_PROXY", "true") == "true",
            "max_concurrent": int(os.environ.get("FF_MAX_CONCURRENT", "10")),
        }

    def is_enabled(self, flag):
        return self.flags.get(flag, False)

    def get(self, flag, default=None):
        return self.flags.get(flag, default)

Khắc phục sự cố

Vấn đề Nguyên nhân Cách xử lý
Khóa API không tải Thiếu env var; tên biến sai Kiểm tra echo $CAPTCHAAI_API_KEY; xác minh chính tả
Tập tin cấu hình bị bỏ qua Đường dẫn sai hoặc thiếu thư viện YAML Xác minh tập tin tồn tại; cài đặt pyyaml / js-yaml
Sản phẩm sử dụng cài đặt dev Ghi đè dành riêng cho Env không được áp dụng Kiểm tra mức độ ưu tiên của env var; xác minh NODE_ENV / APP_ENV
Bí mật hiển thị trong nhật ký Kết xuất cấu hình bao gồm khóa API Che dấu các trường nhạy cảm trong đầu ra nhật ký

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

Tôi có nên sử dụng YAML hoặc JSON cho tệp cấu hình không?

YAML cho các tệp do con người chỉnh sửa (hỗ trợ nhận xét). JSON dành cho cấu hình do máy tạo hoặc khi bạn muốn phân tích cú pháp nghiêm ngặt.

Tôi nên xoay khóa API bao lâu một lần?

Xoay ngay lập tức nếu bị xâm phạm. Lên lịch luân chuyển 90 ngày một lần để tuân thủ. Sử dụng trình quản lý bí mật hỗ trợ xoay vòng tự động.

Tôi có thể thay đổi đồng thời mà không cần khởi động lại không?

Có — đọc cài đặt từ các biến môi trường hoặc dịch vụ cấu hình trên từng lô tác vụ, không chỉ khi khởi động. Điều này cho phép bạn điều chỉnh đồng thời bằng cách cập nhật var env và gửi tín hiệu tải lại.

bài viết liên quan

Các bước tiếp theo

Chuẩn bị sẵn sàng cấu hình của bạn —bắt đầu với khóa API CaptchaAIvà xây dựng từ các mẫu cấu hình ở trên.

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

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