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
- İstemci Captcha Boru Hatları Oluşturma Captchaai
- Sorumlu Otomasyon Oluşturma Captchaai
- Captchaai Kullanım Kontrol Paneli İzleme Oluşturma
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: