DevOps & Scaling

معالجة نتائج CAPTCHA بنمط حدثي باستخدام AWS SNS وCaptchaAI

يؤدي الاستقصاء للحصول على نتائج اختبار CAPTCHA إلى ربط سلاسل المعالجة وإنشاء اقتران محكم بين مكشطةك وخط أنابيب الحل. تقوم AWS SNS (خدمة الإشعارات البسيطة) بفصل هذه المخاوف - حيث ترسل CaptchaAI النتائج إلى رد الاتصال الخاص بك، والذي يتم نشره على SNS، ويتفاعل أي عدد من المستهلكين النهائيين بشكل مستقل.

نظرة عامة على الهندسة المعمارية

[Scraper] → Submit CAPTCHA → [CaptchaAI API]
                                    ↓
                            Solve completes
                                    ↓
                            Callback → [API Gateway + Lambda]
                                    ↓
                            Publish → [SNS Topic]
                                    ↓
                    ┌───────────────┼───────────────┐
                    ↓               ↓               ↓
            [SQS Queue]      [Lambda Logger]   [Email Alert]
            (result store)   (audit trail)     (on failure)

يوفر SNS انتشارًا واسعًا: تؤدي نتيجة CAPTCHA واحدة إلى تشغيل العديد من العملاء دون أن يعرف معالج رد الاتصال عنهم.

الخطوة 1: إنشاء موضوع SNS

AWS CLI

aws sns create-topic --name captcha-results --output text
# Returns: arn:aws:sns:us-east-1:123456789:captcha-results

بايثون (boto3)

import boto3

sns = boto3.client("sns", region_name="us-east-1")

response = sns.create_topic(Name="captcha-results")
topic_arn = response["TopicArn"]
print(f"Topic ARN: {topic_arn}")

الخطوة 2: بناء جهاز استقبال رد الاتصال

تتلقى وظيفة Lambda نتائج رد الاتصال CaptchaAI وتنشرها على SNS.

بايثون (معالج لامدا)

import json
import os
import boto3

sns = boto3.client("sns")
TOPIC_ARN = os.environ["SNS_TOPIC_ARN"]


def lambda_handler(event, context):
    """Receive CaptchaAI callback and publish to SNS."""
    # Parse query parameters from API Gateway
    params = event.get("queryStringParameters", {}) or {}
    task_id = params.get("id", "")
    solution = params.get("code", "")

    if not task_id or not solution:
        return {"statusCode": 400, "body": "Missing id or code"}

    # Publish to SNS
    message = {
        "task_id": task_id,
        "solution": solution,
        "status": "solved"
    }

    sns.publish(
        TopicArn=TOPIC_ARN,
        Message=json.dumps(message),
        Subject="captcha-solved",
        MessageAttributes={
            "task_id": {
                "DataType": "String",
                "StringValue": task_id
            }
        }
    )

    return {"statusCode": 200, "body": "OK"}

JavaScript (معالج لامدا)

const { SNSClient, PublishCommand } = require("@aws-sdk/client-sns");

const sns = new SNSClient({ region: "us-east-1" });
const TOPIC_ARN = process.env.SNS_TOPIC_ARN;

exports.handler = async (event) => {
  const params = event.queryStringParameters || {};
  const taskId = params.id;
  const solution = params.code;

  if (!taskId || !solution) {
    return { statusCode: 400, body: "Missing id or code" };
  }

  const message = {
    task_id: taskId,
    solution: solution,
    status: "solved",
  };

  await sns.send(
    new PublishCommand({
      TopicArn: TOPIC_ARN,
      Message: JSON.stringify(message),
      Subject: "captcha-solved",
      MessageAttributes: {
        task_id: { DataType: "String", StringValue: taskId },
      },
    })
  );

  return { statusCode: 200, body: "OK" };
};

الخطوة 3: قم بإرسال اختبارات CAPTCHA باستخدام عنوان URL لرد الاتصال

قم بتوجيه CaptchaAI's pingback إلى نقطة نهاية بوابة API الخاصة بك:

بايثون

import os
import requests

API_KEY = os.environ["CAPTCHAAI_API_KEY"]
CALLBACK_URL = os.environ["CALLBACK_GATEWAY_URL"]  # API Gateway URL


def submit_captcha(sitekey, pageurl):
    """Submit CAPTCHA with SNS-backed callback."""
    resp = requests.post("https://ocr.captchaai.com/in.php", data={
        "key": API_KEY,
        "method": "userrecaptcha",
        "googlekey": sitekey,
        "pageurl": pageurl,
        "pingback": CALLBACK_URL,
        "json": 1
    })
    data = resp.json()

    if data.get("status") == 1:
        return data["request"]  # task_id
    raise RuntimeError(f"Submit failed: {data.get('request')}")

الخطوة 4: الاشتراك المستهلكين

قائمة انتظار SQS (تخزين النتائج)

# Subscribe an SQS queue to receive all results
sqs_arn = "arn:aws:sqs:us-east-1:123456789:captcha-results-queue"

sns.subscribe(
    TopicArn=topic_arn,
    Protocol="sqs",
    Endpoint=sqs_arn
)

لامدا (مسجل التدقيق)

# Subscribe a Lambda for audit logging
lambda_arn = "arn:aws:lambda:us-east-1:123456789:function:captcha-audit-logger"

sns.subscribe(
    TopicArn=topic_arn,
    Protocol="lambda",
    Endpoint=lambda_arn
)

البريد الإلكتروني (تنبيهات الفشل)

# Subscribe email for error notifications with filter
sns.subscribe(
    TopicArn=topic_arn,
    Protocol="email",
    Endpoint="ops@example.com"
)

الخطوة 5: استهلاك النتائج من SQS

تقرأ مكشطة الحلول من SQS بدلاً من استقصاء CaptchaAI:

بايثون

import json
import boto3

sqs = boto3.client("sqs", region_name="us-east-1")
QUEUE_URL = os.environ["SQS_QUEUE_URL"]


def get_solved_captcha(timeout=30):
    """Wait for a CAPTCHA solution from the SQS queue."""
    response = sqs.receive_message(
        QueueUrl=QUEUE_URL,
        MaxNumberOfMessages=1,
        WaitTimeSeconds=min(timeout, 20)  # Long polling (max 20s)
    )

    messages = response.get("Messages", [])
    if not messages:
        return None

    msg = messages[0]
    # SNS wraps the message — unwrap it
    sns_envelope = json.loads(msg["Body"])
    result = json.loads(sns_envelope["Message"])

    # Delete message after processing
    sqs.delete_message(
        QueueUrl=QUEUE_URL,
        ReceiptHandle=msg["ReceiptHandle"]
    )

    return result

JavaScript

const {
  SQSClient,
  ReceiveMessageCommand,
  DeleteMessageCommand,
} = require("@aws-sdk/client-sqs");

const sqs = new SQSClient({ region: "us-east-1" });
const QUEUE_URL = process.env.SQS_QUEUE_URL;

async function getSolvedCaptcha(timeout = 30) {
  const response = await sqs.send(
    new ReceiveMessageCommand({
      QueueUrl: QUEUE_URL,
      MaxNumberOfMessages: 1,
      WaitTimeSeconds: Math.min(timeout, 20),
    })
  );

  const messages = response.Messages || [];
  if (messages.length === 0) return null;

  const msg = messages[0];
  const snsEnvelope = JSON.parse(msg.Body);
  const result = JSON.parse(snsEnvelope.Message);

  await sqs.send(
    new DeleteMessageCommand({
      QueueUrl: QUEUE_URL,
      ReceiptHandle: msg.ReceiptHandle,
    })
  );

  return result;
}

تصفية رسائل SNS

توجيه نتائج مختلفة إلى مستهلكين مختلفين:

# Only send failures to the ops queue
sns.subscribe(
    TopicArn=topic_arn,
    Protocol="sqs",
    Endpoint=failure_queue_arn,
    Attributes={
        "FilterPolicy": json.dumps({
            "status": ["failed", "error"]
        })
    }
)

استكشاف الأخطاء وإصلاحها

المشكلة السبب الإجراء
لم تصل رسالة SNS سياسة الاشتراك أو إعدادات التصفية غير صحيحة تحقّق من نهاية الموضوع وفلتر السمات
خطأ في تحليل JSON في Lambda حقل الحدث body في حمولة SNS مسلسلة استخدم json.loads(event['Records'][0]['Sns']['Message'])
تكاليف SNS مرتفعة عدد كبير من الرسائل الصغيرة ادمج النتائج في دفعات بدل رسالة لكل مهمة

الخطوات التالية

النقاشات (0)

لا توجد تعليقات بعد.

مقالات ذات صلة

DevOps & Scaling حل CAPTCHA بدون خوادم باستخدام AWS Lambda وCaptchaAI
دليل تشغيلي لـ حل CAPTCHA بدون خوادم باستخدام AWS Lambda وCaptcha AI يغطّي قرارات البنية، والاعتمادية، والمراقبة، وأنماط الأتمتة المناسبة لتشغيل Captcha AI في ب...

دليل تشغيلي لـ حل CAPTCHA بدون خوادم باستخدام AWS Lambda وCaptcha AI يغطّي قرارات البنية، والاعتمادية، والمراق...

Apr 20, 2026
DevOps & Scaling نشر عمّال CaptchaAI باستخدام Ansible
دليل تشغيلي لـ نشر عمّال Captcha AI باستخدام Ansible يغطّي قرارات البنية، والاعتمادية، والمراقبة، وأنماط الأتمتة المناسبة لتشغيل Captcha AI في بيئات الإنتاج.

دليل تشغيلي لـ نشر عمّال Captcha AI باستخدام Ansible يغطّي قرارات البنية، والاعتمادية، والمراقبة، وأنماط الأتم...

Apr 17, 2026
DevOps & Scaling النشر باللونين الأزرق والأخضر للبنية الأساسية لحل اختبار CAPTCHA
دليل تشغيلي لـ النشر باللونين الأزرق والأخضر للبنية الأساسية لحل اختبار CAPTCHA يغطّي قرارات البنية، والاعتمادية، والمراقبة، وأنماط الأتمتة المناسبة لتشغيل Capt...

دليل تشغيلي لـ النشر باللونين الأزرق والأخضر للبنية الأساسية لحل اختبار CAPTCHA يغطّي قرارات البنية، والاعتماد...

Apr 25, 2026