DevOps & Skalierung

AWS Lambda + CaptchaAI: Serverlose CAPTCHA-Lösung

AWS Lambda übernimmt die CAPTCHA-Lösung, ohne Server zu verwalten. Zahlen Sie nur beim Lösen, skalieren Sie automatisch und integrieren Sie es mit API Gateway, SQS oder Step Functions.


Lambda-Handler

# lambda_function.py
import json
import os
import time
import urllib.request
import urllib.parse


def lambda_handler(event, context):
    """AWS Lambda handler for CaptchaAI solving."""
    api_key = os.environ["CAPTCHAAI_KEY"]

    # Parse input
    body = json.loads(event.get("body", "{}")) if isinstance(event.get("body"), str) else event

    method = body.get("method", "userrecaptcha")
    params = body.get("params", {})

    try:
        token = solve_captcha(api_key, method, params)
        return {
            "statusCode": 200,
            "body": json.dumps({"token": token}),
        }
    except Exception as e:
        return {
            "statusCode": 500,
            "body": json.dumps({"error": str(e)}),
        }


def solve_captcha(api_key, method, params, timeout=90):
    """Solve CAPTCHA using CaptchaAI API."""
    # Submit task
    submit_data = urllib.parse.urlencode({
        "key": api_key,
        "method": method,
        "json": 1,
        **params,
    }).encode()

    req = urllib.request.Request(
        "https://ocr.captchaai.com/in.php",
        data=submit_data,
    )
    with urllib.request.urlopen(req, timeout=30) as resp:
        result = json.loads(resp.read())

    if result.get("status") != 1:
        raise RuntimeError(f"Submit error: {result.get('request')}")

    task_id = result["request"]

    # Poll for result
    start = time.time()
    while time.time() - start < timeout:
        time.sleep(5)
        poll_url = (
            f"https://ocr.captchaai.com/res.php"
            f"?key={api_key}&action=get&id={task_id}&json=1"
        )
        with urllib.request.urlopen(poll_url, timeout=15) as resp:
            data = json.loads(resp.read())

        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")

Sicherer API-Schlüssel mit Secrets Manager

import json
import boto3


def get_api_key():
    """Retrieve CaptchaAI key from AWS Secrets Manager."""
    client = boto3.client("secretsmanager")
    response = client.get_secret_value(SecretId="captchaai/api-key")
    secret = json.loads(response["SecretString"])
    return secret["api_key"]

Secret anlegen:

aws secretsmanager create-secret \
  --name captchaai/api-key \
  --secret-string '{"api_key":"YOUR_API_KEY"}'

SAM-Vorlage (Infrastruktur als Code)

# template.yaml
AWSTemplateFormatVersion: "2010-09-09"
Transform: AWS::Serverless-2016-10-31

Globals:
  Function:
    Timeout: 120
    MemorySize: 256
    Runtime: python3.11

Resources:
  CaptchaSolverFunction:
    Type: AWS::Serverless::Function
    Properties:
      Handler: lambda_function.lambda_handler
      Environment:
        Variables:
          CAPTCHAAI_KEY: !Sub "{{resolve:secretsmanager:captchaai/api-key:SecretString:api_key}}"
      Events:
        SolveApi:
          Type: Api
          Properties:
            Path: /solve
            Method: post
      Policies:

        - AWSSecretsManagerGetSecretValuePolicy:
            SecretArn: !Sub "arn:aws:secretsmanager:${AWS::Region}:${AWS::AccountId}:secret:captchaai/api-key-*"

Outputs:
  SolveApiUrl:
    Value: !Sub "https://${ServerlessRestApi}.execute-api.${AWS::Region}.amazonaws.com/Prod/solve"

Bereitstellen

# Build and deploy
sam build
sam deploy --guided

# Test
curl -X POST https://YOUR_API_ID.execute-api.us-east-1.amazonaws.com/Prod/solve \
  -H "Content-Type: application/json" \
  -d '{
    "method": "userrecaptcha",
    "params": {
      "googlekey": "SITE_KEY",
      "pageurl": "https://example.com"
    }
  }'

Durch SQS ausgelöste Stapelverarbeitung

Verarbeiten Sie CAPTCHA-Aufgaben aus einer SQS-Warteschlange:

import json
import os
import time
import urllib.request
import urllib.parse


def sqs_handler(event, context):
    """Process CAPTCHA tasks from SQS queue."""
    api_key = os.environ["CAPTCHAAI_KEY"]
    results = []

    for record in event["Records"]:
        task = json.loads(record["body"])
        try:
            token = solve_captcha(
                api_key,
                task["method"],
                task["params"],
            )
            results.append({
                "task_id": task.get("id"),
                "status": "success",
                "token": token[:50],
            })
        except Exception as e:
            results.append({
                "task_id": task.get("id"),
                "status": "error",
                "error": str(e),
            })

    return {"results": results}

Lambda-Überlegungen

Faktor Wert
Max. Timeout 15 Minuten (für die meisten CAPTCHAs auf 2 Minuten eingestellt)
Speicher 256 MB ausreichend (keine schwere Verarbeitung)
Parallelität Standardmäßig 1000 gleichzeitig (bei Bedarf Erhöhung anfordern)
Kaltstart ~500 ms für Python (vernachlässigbar im Vergleich zur Lösungszeit)
Kosten ~0,0001 $ pro Lösung (nur Berechnung)
Abhängigkeiten Verwenden Sie urllib (integriert), um Lambda-Ebenen zu vermeiden

Fehlerbehebung

Problem Ursache Lösung
Funktion läuft ab Lambda-Timeout < Lösungszeit Stellen Sie den Timeout auf 120s+ ein
Erlaubnis wegen Geheimhaltung verweigert Fehlende IAM-Richtlinie Fügen Sie die SecretsManager-Leserichtlinie hinzu
Kaltstart erhöht die Latenz Seltene Aufrufe Verwenden Sie bereitgestellte Parallelität
Importfehler für Anfragen Nicht in Lambda gebündelt Verwenden Sie urllib.request (integriert) oder fügen Sie eine Ebene hinzu

FAQ

Ist Lambda für die CAPTCHA-Lösung kostengünstig?

Ja. Mit ca. 0,0001 US-Dollar pro Aufruf (256 MB, 60 Sek.) verursacht Lambda zusätzlich zur CaptchaAI-API-Gebühr nur vernachlässigbare Kosten. Sie vermeiden Serverkosten während der Leerlaufzeit.

Was ist mit der 15-minütigen Auszeit von Lambda?

Die meisten CAPTCHAs lösen sich in 10–60 Sekunden auf. Stellen Sie Ihr Lambda-Timeout auf 120 Sekunden ein. Für komplexe Typen wie reCAPTCHA Enterprise verwenden Sie 180 Sekunden.

Kann ich Lambda-Ebenen für die Anforderungsbibliothek verwenden?

Ja, aber urllib.request (integriert) funktioniert gut für die einfache HTTP-API von CaptchaAI. Dadurch wird die Ebenenverwaltung vollständig vermieden.


Verwandte Leitfäden

  • Google Cloud-Funktionen + CaptchaAI
  • Azure Functions + CaptchaAI

Serverlos werden – Holen Sie sich Ihren CaptchaAI-Schlüssel und starten Sie heute.

Kommentare sind für diesen Artikel deaktiviert.