AWS Lambda, CAPTCHA çözümünü sunucuları yönetmeden gerçekleştirir. Yalnızca çözerken ödeme yapın, otomatik olarak ölçeklendirin ve API Gateway, SQS veya Step Functions ile entegre olun.
Lambda İşleyicisi
# 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")
Secrets Manager ile API Anahtarını Güvenli Hale Getirin
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"]
Sırrı saklayın:
aws secretsmanager create-secret \
--name captchaai/api-key \
--secret-string '{"api_key":"YOUR_API_KEY"}'
SAM Şablonu (Kod Olarak Altyapı)
# 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"
Dağıt
# 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"
}
}'
SQS ile Tetiklenen Toplu İşleme
CAPTCHA görevlerini SQS kuyruğundan işleyin:
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'da Dikkat Edilmesi Gerekenler
| Faktör | Değer |
|---|---|
| Maksimum zaman aşımı | 15 dakika (çoğu CAPTCHA için 2 dakikaya ayarlanmıştır) |
| Bellek | 256 MB yeterli (yoğun işlem yok) |
| Eşzamanlılık | Varsayılan 1000 eşzamanlı (gerekirse artış isteyin) |
| Soğuk başlatma | Python için ~500ms (çözüm süresine karşı ihmal edilebilir) |
| Maliyet | ~Çözüm başına 0,0001$ (yalnızca hesaplama) |
| Bağımlılıklar | Lambda katmanlarından tanılamak için urllib (yerleşik) kullanın |
Sorun giderme
| Sorun | Sebep | Düzeltme |
|---|---|---|
| İşlev zaman aşımına uğradı | Lambda zaman aşımı < çözüm süresi | Zaman aşımını 120 saniyeden fazla olarak ayarlayın |
| İzin gizli olarak reddedildi | Eksik IAM politikası | SecretsManager okuma politikasını ekleyin |
| Soğuk başlatma gecikmeyi artırır | Seyrek çağrılar | Sağlanan eşzamanlılığı kullan |
| İstekler için içe aktarma hatası | Lambda'da paketlenmemiştir | urllib.request (yerleşik) kullanın veya katman ekleyin |
SSS
Lambda, CAPTCHA çözümü için uygun maliyetli midir?
Evet. Çağrı başına ~0,0001 ABD doları (256 MB, 60 saniye) ile Lambda, CaptchaAI API ücretinin üzerine ihmal edilebilir bir maliyet ekler. Boşta kalma süresi boyunca sunucu maliyetlerinden kaçınırsınız.
Lambda'nın 15 dakikalık molası ne olacak?
Çoğu CAPTCHA 10-60 saniyede çözülür. Lambda zaman aşımınızı 120 saniyeye ayarlayın. reCAPTCHA Enterprise gibi karmaşık türler için 180 saniyeyi kullanın.
İstek kitaplığı için Lambda katmanlarını kullanabilir miyim?
Evet, ancak urllib.request (yerleşik), CaptchaAI'nin basit HTTP API'si için iyi çalışıyor. Bu, katman yönetimini tamamen ortadan kaldırır.
İlgili Kılavuzlar
Sunucusuz geçiş yapın —CaptchaAI anahtarınızı alınBugün.