DevOps & Scaling

AWS SNS ve CaptchaAI ile Olay Odaklı CAPTCHA Çözümü Oluşturma

CAPTCHA sonuçlarına yönelik yoklama, konuları birbirine bağlar ve kazıyıcınız ile çözüm hattı arasında sıkı bir bağlantı oluşturur. AWS SNS (Basit Bildirim Hizmeti) bu endişeleri ortadan kaldırır; CaptchaAI, sonuçları SNS'de yayınlayan geri aramanıza gönderir ve herhangi bir sayıda alt tüketici bağımsız olarak tepki verir.

Mimariye Genel Bakış

[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 yayılma sağlar: Bir CAPTCHA sonucu, geri arama işleyicisinin haberi olmadan birden fazla tüketiciyi tetikler.

1. Adım: SNS Konusunu Oluşturun

AWS CLI

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

Python (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}")

Adım 2: Geri Arama Alıcısını Oluşturun

Bu Lambda işlevi CaptchaAI geri arama sonuçlarını alır ve bunları SNS'de yayınlar.

Python (Lambda İşleyicisi)

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 (Lambda İşleyicisi)

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. Adım: CAPTCHA'ları Geri Arama URL'siyle gönderin

CaptchaAI'nin pingback'sini API Ağ Geçidi uç noktanıza yönlendirin:

Python

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. Adım: Tüketicilere Abone Olun

SQS Kuyruğu (Sonuç Depolama)

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

Lambda (Denetim Kaydedici)

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

E-posta (Arıza Uyarıları)

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

5. Adım: SQS'den Sonuçları Kullanın

Kazıyıcınız CaptchaAI'yi sorgulamak yerine SQS'den gelen çözümleri okur:

Python

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 Mesaj Filtreleme

Farklı sonuçları farklı tüketicilere yönlendirin:

# 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"]
        })
    }
)

Sorun giderme

Sorun Sebep Düzeltme
Geri arama 403 değerini döndürür API Ağ Geçidi kimlik doğrulaması CaptchaAI'yi engelliyor Geri arama yolunda kimlik doğrulamayı devre dışı bırakın; bunun yerine belirteç tabanlı doğrulamayı kullanın
SQS mesajları gelmiyor SNS – SQS izni eksik SQS kuyruk politikasına sns:Publish iznini ekleyin
Yinelenen sonuçlar işlendi SNS en az bir kez yayın yapar İdempotency'yi uygulayın - işlemeden önce görev_id'sini kontrol edin
Lambda soğuk başlatma geri aramayı geciktirir Sağlanan eşzamanlılık ayarlanmadı Geri arama Lambda için sağlanan eş zamanlılığı etkinleştirin

SSS

Sonuçları doğrudan geri arama Lambda'da işlemek yerine neden SNS kullanmalısınız?

SNS, geri arama işleyicisini aşağı akış mantığından ayırır. Geri arama Lambda'yı değiştirmeden yeni tüketiciler (günlüğe kaydetme, uyarı verme, analiz) ekleyebilirsiniz. Geri arama basit ve hızlı kalır.

SNS katmanından kaynaklanan ilave gecikme nedir?

SNS mesaj başına 10-50 ms ekler. CAPTCHA'nın çözümleri 5-30 saniye sürdüğü için bu ek yük ihmal edilebilir düzeydedir.

Sipariş edilen işlemler için SNS FIFO'yu kullanabilir miyim?

Evet. Sıralı sonuçlara ihtiyacınız varsa SQS FIFO kuyruğuyla birlikte bir SNS FIFO konusu kullanın. Görev başına sıralama için MessageGroupId'yi görev kimliğine ayarlayın.

İlgili Makaleler

Sonraki Adımlar

Olay odaklı CAPTCHA çözümü oluşturun —CaptchaAI API anahtarınızı alınve onu AWS olay hattınıza bağlayın.

İlgili kılavuzlar:

Bu makale için yorumlar devre dışı bırakılmıştır.

İlgili Yazılar

DevOps & Scaling AWS Lambda + CaptchaAI: Sunucusuz CAPTCHA Çözümü
AWS Lambda + Captcha AI için Dev Ops kılavuzu: Sunucusuz CAPTCHA Çözümü, üretimdeki Captcha AI iş akışlarına yönelik mimari kararları, işletim hususlarını ve ot...

AWS Lambda + Captcha AI için Dev Ops kılavuzu: Sunucusuz CAPTCHA Çözümü, üretimdeki Captcha AI iş akışlarına y...

Apr 22, 2026
DevOps & Scaling CAPTCHA Çözme Altyapısı için Mavi-Yeşil Dağıtım
Üretimdeki Captcha AI iş akışlarına yönelik mimari kararları, işletim hususlarını ve otomasyon modellerini içeren CAPTCHA Çözme Altyapısı için Mavi-Yeşil Dağıtı...

Üretimdeki Captcha AI iş akışlarına yönelik mimari kararları, işletim hususlarını ve otomasyon modellerini içe...

Apr 27, 2026
DevOps & Scaling Azure İşlevleri + CaptchaAI: Bulut Entegrasyonu
Azure İşlevleri + Captcha AI: Bulut Entegrasyonu için Dev Ops kılavuzu, üretimdeki Captcha AI iş akışlarına yönelik mimari kararları, işletim hususlarını ve oto...

Azure İşlevleri + Captcha AI: Bulut Entegrasyonu için Dev Ops kılavuzu, üretimdeki Captcha AI iş akışlarına yö...

Apr 23, 2026