تتعامل AWS Lambda مع حل اختبار CAPTCHA دون إدارة الخوادم. ادفع فقط عند الحل، وقم بالتوسع تلقائيًا، والتكامل مع بوابة API، أو SQS، أو وظائف الخطوة.
معالج لامدا
# 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")
تأمين مفتاح API مع مدير الأسرار
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"]
تخزين السر:
aws secretsmanager create-secret \
--name captchaai/api-key \
--secret-string '{"api_key":"YOUR_API_KEY"}'
قالب SAM (البنية التحتية كرمز)
# 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"
نشر
# 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
معالجة مهام CAPTCHA من قائمة انتظار SQS:
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}
اعتبارات لامدا
| عامل | القيمة |
|---|---|
| الحد الأقصى للمهلة | 15 دقيقة (تم ضبطها على دقيقتين لمعظم اختبارات CAPTCHA) |
| الذاكرة | 256 ميجابايت كافية (بدون معالجة ثقيلة) |
| التزامن | الافتراضي 1000 متزامن (اطلب الزيادة إذا لزم الأمر) |
| بداية باردة | ~500 مللي ثانية لPython (وقت لا يُذكر مقابل وقت الحل) |
| التكلفة | ~0.0001 USD لكل حل (حساب فقط) |
| التبعيات | استخدم urllib (مدمج) لتجنب طبقات Lambda |
استكشاف الأخطاء وإصلاحها
| المشكلة | السبب | الإجراء |
|---|---|---|
| انتهت مهلة الوظيفة | مهلة لامدا < حل الوقت | اضبط المهلة على 120 ثانية+ |
| تم رفض الإذن على السرية | سياسة إدارة الهوية وإمكانية الوصول (IAM) مفقودة | أضف سياسة قراءة SecretsManager |
| البداية الباردة تضيف الكمون | دعوات نادرة | استخدم التزامن المقدم |
| خطأ في الاستيراد للطلبات | غير المجمعة في لامدا | استخدم urllib.request (مدمج) أو أضف طبقة |
الأسئلة الشائعة
هل Lambda فعالة من حيث التكلفة لحل اختبار CAPTCHA؟
نعم. بسعر 0.0001 دولار تقريبًا لكل استدعاء (256 ميجابايت، 60 ثانية)، تضيف Lambda تكلفة ضئيلة بالإضافة إلى رسوم CaptchaAI API. يمكنك تجنب تكاليف الخادم أثناء وقت الخمول.
ماذا عن مهلة Lambda البالغة 15 دقيقة؟
يتم حل معظم اختبارات CAPTCHA خلال 10 إلى 60 ثانية. اضبط مهلة Lambda على 120 ثانية. بالنسبة للأنواع المعقدة مثل reCAPTCHA Enterprise، استخدم 180 ثانية.
هل يمكنني استخدام طبقات Lambda لمكتبة الطلبات؟
نعم، ولكن urllib.request (المدمج) يعمل بشكل جيد مع واجهة برمجة تطبيقات HTTP البسيطة الخاصة بـ CaptchaAI. وهذا يتجنب إدارة الطبقة بالكامل.
أدلة ذات صلة
الذهاب بدون خادم — احصل على مفتاح CaptchaAI الخاص بك اليوم.
النقاشات (0)
شارك في النقاش
سجّل الدخول لمشاركة رأيك.
تسجيل الدخوللا توجد تعليقات بعد.