يضمن تشغيل حلول CAPTCHA في حاويات Docker توفير بيئات متسقة وسهولة التوسع وعمليات النشر النظيفة. يغطي هذا الدليل كل شيء بدءًا من ملف Dockerfile الأساسي وحتى إعدادات Docker Compose متعددة العمال.
ملف دوكر الأساسي
FROM python:3.11-slim
WORKDIR /app
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
COPY solver.py .
# API key passed at runtime, not baked into image
ENV CAPTCHAAI_KEY=""
CMD ["python", "solver.py"]
المتطلبات.txt:
requests>=2.31.0
البرنامج النصي للحل
# solver.py
import os
import sys
import requests
import time
def solve_recaptcha(api_key, site_key, page_url):
"""Solve reCAPTCHA v2 using CaptchaAI."""
resp = requests.post("https://ocr.captchaai.com/in.php", data={
"key": api_key,
"method": "userrecaptcha",
"googlekey": site_key,
"pageurl": page_url,
"json": 1,
}, timeout=30)
result = resp.json()
if result.get("status") != 1:
raise RuntimeError(f"Submit error: {result.get('request')}")
task_id = result["request"]
# Poll for result
for _ in range(24): # 120s max
time.sleep(5)
resp = requests.get("https://ocr.captchaai.com/res.php", params={
"key": api_key,
"action": "get",
"id": task_id,
"json": 1,
}, timeout=15)
data = resp.json()
if data["request"] != "CAPCHA_NOT_READY":
if data.get("status") == 1:
return data["request"]
raise RuntimeError(f"Solve error: {data['request']}")
raise TimeoutError("Solve timeout")
if __name__ == "__main__":
api_key = os.environ.get("CAPTCHAAI_KEY")
if not api_key:
print("Error: CAPTCHAAI_KEY environment variable required")
sys.exit(1)
site_key = os.environ.get("SITE_KEY", "6Le-wvkSAAAAAPBMRTvw0Q4Muexq9bi0DJwx_mJ-")
page_url = os.environ.get("PAGE_URL", "https://example.com")
token = solve_recaptcha(api_key, site_key, page_url)
print(f"Token: {token[:50]}...")
بناء وتشغيل
# Build
docker build -t captchaai-solver .
# Run with API key from environment
docker run --rm \
-e CAPTCHAAI_KEY="YOUR_API_KEY" \
-e SITE_KEY="TARGET_SITE_KEY" \
-e PAGE_URL="https://example.com" \
captchaai-solver
بناء متعدد المراحل (الإنتاج)
صورة أصغر مع أفضل الممارسات الأمنية:
# Build stage
FROM python:3.11-slim AS builder
WORKDIR /app
COPY requirements.txt .
RUN pip install --no-cache-dir --target=/app/deps -r requirements.txt
# Runtime stage
FROM python:3.11-slim
# Run as non-root
RUN useradd --create-home solver
USER solver
WORKDIR /home/solver/app
COPY --from=builder /app/deps /home/solver/app/deps
COPY solver.py .
ENV PYTHONPATH=/home/solver/app/deps
ENV PYTHONUNBUFFERED=1
CMD ["python", "solver.py"]
Docker Compose: إعداد متعدد العمال
توسيع نطاق حل اختبار CAPTCHA عبر حاويات متعددة:
# docker-compose.yml
version: "3.8"
services:
solver-worker:
build: .
environment:
- CAPTCHAAI_KEY=${CAPTCHAAI_KEY}
restart: unless-stopped
deploy:
replicas: 4
resources:
limits:
memory: 256M
cpus: "0.25"
redis:
image: redis:7-alpine
ports:
- "6379:6379"
queue-worker:
build:
context: .
dockerfile: Dockerfile.worker
environment:
- CAPTCHAAI_KEY=${CAPTCHAAI_KEY}
- REDIS_URL=redis://redis:6379
depends_on:
- redis
deploy:
replicas: 4
العامل القائم على قائمة الانتظار
# queue_worker.py
import os
import json
import time
import redis
import requests
def process_task(api_key, task_data):
"""Process a single CAPTCHA task from the queue."""
resp = requests.post("https://ocr.captchaai.com/in.php", data={
"key": api_key,
"method": task_data["method"],
"json": 1,
**task_data["params"],
}, timeout=30)
result = resp.json()
if result.get("status") != 1:
return {"error": result.get("request")}
task_id = result["request"]
for _ in range(24):
time.sleep(5)
resp = requests.get("https://ocr.captchaai.com/res.php", params={
"key": api_key, "action": "get",
"id": task_id, "json": 1,
}, timeout=15)
data = resp.json()
if data["request"] != "CAPCHA_NOT_READY":
if data.get("status") == 1:
return {"token": data["request"]}
return {"error": data["request"]}
return {"error": "timeout"}
def main():
api_key = os.environ["CAPTCHAAI_KEY"]
redis_url = os.environ.get("REDIS_URL", "redis://localhost:6379")
r = redis.from_url(redis_url)
print("Worker started, waiting for tasks...")
while True:
_, raw = r.blpop("captcha:tasks")
task = json.loads(raw)
task_id = task.get("id", "unknown")
print(f"Processing task {task_id}...")
result = process_task(api_key, task)
r.hset("captcha:results", task_id, json.dumps(result))
print(f"Task {task_id} done: {'ok' if 'token' in result else 'error'}")
if __name__ == "__main__":
main()
إدارة متغيرات البيئة
# .env file (never commit to Git)
CAPTCHAAI_KEY=your_api_key_here
# .gitignore
echo ".env" >> .gitignore
# Run with .env file
docker compose --env-file .env up -d
# Scale workers
docker compose up -d --scale queue-worker=8
استكشاف الأخطاء وإصلاحها
| المشكلة | السبب | الإجراء |
|---|---|---|
| تخرج الحاوية على الفور | CAPTCHAAI_KEY مفقود | تمرير -e CAPTCHAAI_KEY=... |
| فشل قرار DNS | لا يوجد وصول إلى الشبكة | تحقق من إعدادات شبكة Docker |
| استخدام الذاكرة العالية | هناك عدد كبير جدًا من الطلبات المتزامنة | الحد من ذاكرة الحاوية والتزامن |
| مفتاح API مكشوف في الصورة | أدخل ملف Dockerfile | استخدام متغيرات البيئة أو الأسرار |
الأسئلة الشائعة
هل يجب أن أخبز مفتاح API في صورة Docker؟
أبدا. قم دائمًا بتمرير مفتاح API كمتغير بيئة في وقت التشغيل أو استخدم أسرار Docker. يعد وضع المفاتيح في الصور بمثابة خطر أمني.
كم عدد الحاويات التي يجب أن أقوم بتشغيلها؟
ابدأ بـ 4 عمال وقم بالتوسيع بناءً على احتياجات الإنتاجية. يمكن لكل عامل التعامل مع 5-10 حلول متزامنة، لذلك يدعم 4 عمال 20-40 مهمة متزامنة.
هل يمكنني استخدام أسرار Docker بدلاً من ذلك؟
نعم. يدعم كل من Docker Swarm وKubernetes الأسرار. قم بتثبيتها كملفات وقراءتها من /run/secrets/captchaai_key.
أدلة ذات صلة
حاويات الحل الخاص بك — احصل على CaptchaAI اليوم.