DevOps والتوسع

Docker + CaptchaAI: حل اختبار CAPTCHA في حاوية

يضمن تشغيل حلول 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 اليوم.

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