المرجع

CaptchaAI في الإنتاج: دليل إدارة التكوين

تعمل مفاتيح API والمهلات ذات الترميز الثابت مع النماذج الأولية. يحتاج الإنتاج إلى تكوين خاص بالبيئة وإدارة الأسرار والقدرة على تغيير الإعدادات دون إعادة النشر.

التسلسل الهرمي للتكوين

Priority (highest → lowest):

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

مرجع التكوين الكامل

المعلمة البيئة المتغيرة الافتراضي الوصف
مفتاح واجهة برمجة التطبيقات CAPTCHAAI_API_KEY مطلوب. مفتاح CaptchaAI API الخاص بك
إرسال عنوان URL CAPTCHAAI_SUBMIT_URL https://ocr.captchaai.com/in.php مهمة إرسال نقطة النهاية
عنوان URL للاستطلاع CAPTCHAAI_POLL_URL https://ocr.captchaai.com/res.php نقطة نهاية الاقتراع النتيجة
الفاصل الزمني للاستقصاء CAPTCHAAI_POLL_INTERVAL 5 الثواني بين محاولات الاقتراع
الحد الأقصى لمحاولات الاستطلاع CAPTCHAAI_MAX_POLLS 60 الحد الأقصى لمحاولات الاستقصاء قبل انتهاء المهلة
التزامن CAPTCHAAI_CONCURRENCY 10 الحد الأقصى لمهام CAPTCHA المتوازية
المهلة CAPTCHAAI_TIMEOUT 300 المهلة الإجمالية بالثواني
وكيل CAPTCHAAI_PROXY عنوان URL الوكيل لحل اختبار CAPTCHA
عنوان URL لرد الاتصال CAPTCHAAI_CALLBACK_URL عنوان URL للخطاف على الويب للنتائج غير المتزامنة
إعادة المحاولة CAPTCHAAI_RETRIES 3 إعادة المحاولة في حالات الفشل العابرة
مستوى السجل CAPTCHAAI_LOG_LEVEL info تسجيل الإسهاب

محمل التكوين

بايثون

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`);

ملفات التكوين لكل بيئة

# 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

إدارة الأسرار

لا تقم مطلقًا بتخزين مفاتيح API في ملفات التكوين أو التحكم بالمصادر.

الطريقة أفضل ل مثال
متغيرات البيئة الحاويات، CI/CD export CAPTCHAAI_API_KEY=abc123
مدير أسرار AWS البنية التحتية لشركة AWS جلب عند بدء التشغيل؛ التدوير التلقائي
قبو HashiCorp سحابة متعددة، داخل الشركة أسرار ديناميكية مع TTL
Docker Secrets دوكر سرب / يؤلف مثبتة على /run/secrets/
ملف .env (مطوّر البرامج فقط) التنمية المحلية مكتبة dotenv؛ .gitignore ذلك

مثال على إنشاء عامل ميناء

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

أعلام مميزة

تبديل القدرات دون إعادة النشر:

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)

استكشاف الأخطاء وإصلاحها

المشكلة السبب الإجراء
النتيجة لا تطابق الحالة الفعلية نوع CAPTCHA أو المعلمات لم تُطابَق مع الهدف الصحيح قارن الهدف وطريقة الحل والمعلمات المطلوبة مرة أخرى
الاختبار ينجح لكن بيئة الإنتاج تفشل الجلسة أو الرؤوس أو سياق الوكيل يختلف عن الاختبار أعد استخدام الشروط التي نجحت في الاختبار داخل سير العمل الفعلي كلما أمكن
المشكلة ما تزال غير واضحة السجلات لا تتضمن سياقًا كافيًا لتشخيص موثوق سجّل نوع الحل وزمن الاستجابة ورمز الخطأ والأثر اللاحق معًا

الخطوات التالية

أدلة ذات صلة

التعليقات غير مفعّلة لهذا المقال.