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.