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 nó |
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ấu hình thiết lập Captchaai Proxy5
- Nhóm Captchaai Quản lý khóa Api nhiều người dùng
- Hướng dẫn cấu hình proxy Captchaai
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:
- Bảo mật khóa API và danh sách trắng IP
- Giải quyết trong vùng chứa Docker
- Kiến trúc đa vùng