L’exécution de solveurs CAPTCHA dans des conteneurs Docker garantit des environnements cohérents, une mise à l’échelle facile et des déploiements propres. Ce guide couvre tout, depuis un Dockerfile de base jusqu'aux configurations Docker Compose multi-travailleurs.
Fichier Docker de base
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"]
exigences.txt :
requests>=2.31.0
Script du solveur
# 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]}...")
Construire et exécuter
# 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
Construction en plusieurs étapes (production)
Image plus petite avec les meilleures pratiques de sécurité :
# 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 : configuration multi-travailleurs
Adaptez la résolution de CAPTCHA à plusieurs conteneurs :
# 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
Travailleur basé sur une file d'attente
# 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()
Gestion des variables d'environnement
# .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
Dépannage
| Problème | Parce que | Corriger |
|---|---|---|
| Le conteneur sort immédiatement | CAPTCHAAI_KEY manquant | Passer -e CAPTCHAAI_KEY=... |
| La résolution DNS échoue | Pas d'accès au réseau | Vérifier les paramètres réseau Docker |
| Utilisation élevée de la mémoire | Trop de demandes simultanées | Limiter la mémoire et la concurrence des conteneurs |
| Clé API exposée dans l'image | Entrez le fichier Dockerfile | Utiliser des variables d'environnement ou des secrets |
FAQ
Dois-je intégrer la clé API dans l’image Docker ?
Jamais. Transmettez toujours la clé API en tant que variable d'environnement au moment de l'exécution ou utilisez les secrets Docker. Intégrer des clés dans des images constitue un risque pour la sécurité.
Combien de conteneurs dois-je exécuter ?
Commencez avec 4 workers et évoluez en fonction des besoins en matière de débit. Chaque travailleur peut gérer 5 à 10 résolutions simultanées, donc 4 travailleurs prennent en charge 20 à 40 tâches simultanées.
Puis-je utiliser les secrets Docker à la place ?
Oui. Docker Swarm et Kubernetes prennent tous deux en charge les secrets. Montez-les sous forme de fichiers et lisez-les à partir de /run/secrets/captchaai_key.
Guides connexes
- Files d'attente de tâches Kubernetes pour la résolution de CAPTCHA
- Travailleurs de résolution de CAPTCHA à mise à l'échelle automatique
Conteneurisez votre solveur –obtenir CaptchaAIaujourd'hui.