Azure İşlevleri, Azure ekosistemiyle sıkı entegrasyonla sunucusuz CAPTCHA çözümü sağlar; sırlar için Key Vault, görev dağıtımı için Queue Storage ve izleme için Application Insights.
HTTP ile Tetiklenen İşlev
# function_app.py
import json
import time
import os
import logging
import urllib.request
import urllib.parse
import azure.functions as func
app = func.FunctionApp()
@app.route(route="solve", methods=["POST"])
def solve_captcha(req: func.HttpRequest) -> func.HttpResponse:
"""HTTP trigger for CAPTCHA solving."""
try:
body = req.get_json()
except ValueError:
return func.HttpResponse(
json.dumps({"error": "JSON body required"}),
status_code=400,
mimetype="application/json",
)
method = body.get("method", "userrecaptcha")
params = body.get("params", {})
api_key = os.environ["CAPTCHAAI_KEY"]
try:
token = solve(api_key, method, params)
return func.HttpResponse(
json.dumps({"token": token}),
mimetype="application/json",
)
except Exception as e:
logging.error(f"Solve failed: {e}")
return func.HttpResponse(
json.dumps({"error": str(e)}),
status_code=500,
mimetype="application/json",
)
def solve(api_key, method, params, timeout=90):
"""Solve CAPTCHA via CaptchaAI API."""
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"]
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")
Anahtar Kasası Entegrasyonu
API anahtarını Azure Key Vault'ta saklayın:
# Create Key Vault
az keyvault create \
--name captchaai-vault \
--resource-group myResourceGroup
# Store secret
az keyvault secret set \
--vault-name captchaai-vault \
--name CaptchaAIKey \
--value "YOUR_API_KEY"
# Grant function access
az webapp identity assign \
--name my-captcha-function \
--resource-group myResourceGroup
az keyvault set-policy \
--name captchaai-vault \
--object-id <principal-id> \
--secret-permissions get
Uygulama ayarlarında referans:
CAPTCHAAI_KEY=@Microsoft.KeyVault(SecretUri=https://captchaai-vault.vault.azure.net/secrets/CaptchaAIKey/)
Kuyrukla Tetiklenen Toplu İşleme
CAPTCHA görevlerini Azure Queue Storage'dan işleyin:
@app.queue_trigger(
arg_name="msg",
queue_name="captcha-tasks",
connection="AzureWebJobsStorage",
)
def process_queue_task(msg: func.QueueMessage):
"""Process CAPTCHA task from queue."""
task = json.loads(msg.get_body().decode())
api_key = os.environ["CAPTCHAAI_KEY"]
try:
token = solve(api_key, task["method"], task["params"])
logging.info(f"Task {task['id']} solved")
# Store result in Table Storage or return queue
_store_result(task["id"], "success", token)
except Exception as e:
logging.error(f"Task {task['id']} failed: {e}")
_store_result(task["id"], "error", str(e))
def _store_result(task_id, status, value):
"""Store result (simplified — use Table Storage in production)."""
logging.info(f"Result: {task_id} = {status}")
Proje Yapısı
captcha-function/
├── function_app.py
├── requirements.txt
├── host.json
└── local.settings.json
gereksinimler.txt:
azure-functions
host.json:
{
"version": "2.0",
"functionTimeout": "00:02:00",
"logging": {
"logLevel": {
"default": "Information"
}
}
}
local.settings.json:
{
"IsEncrypted": false,
"Values": {
"FUNCTIONS_WORKER_RUNTIME": "python",
"AzureWebJobsStorage": "UseDevelopmentStorage=true",
"CAPTCHAAI_KEY": "YOUR_API_KEY_FOR_LOCAL_DEV"
}
}
Dağıt
# Create function app
az functionapp create \
--resource-group myResourceGroup \
--consumption-plan-location westus2 \
--runtime python \
--runtime-version 3.11 \
--functions-version 4 \
--name my-captcha-solver \
--storage-account mystorageaccount
# Deploy
func azure functionapp publish my-captcha-solver
# Test
curl -X POST https://my-captcha-solver.azurewebsites.net/api/solve \
-H "Content-Type: application/json" \
-d '{
"method": "userrecaptcha",
"params": {
"googlekey": "SITE_KEY",
"pageurl": "https://example.com"
}
}'
Görevleri Kuyruğa Gönder
from azure.storage.queue import QueueClient
import json
queue = QueueClient.from_connection_string(
conn_str="YOUR_STORAGE_CONNECTION_STRING",
queue_name="captcha-tasks",
)
# Submit batch
for i in range(10):
task = {
"id": f"task-{i}",
"method": "userrecaptcha",
"params": {
"googlekey": "SITE_KEY",
"pageurl": f"https://example.com/page{i}",
},
}
queue.send_message(json.dumps(task))
print(f"Queued task-{i}")
Sorun giderme
| Sorun | Sebep | Düzeltme |
|---|---|---|
| İşlev 5 dakikada zaman aşımına uğradı | Varsayılan zaman aşımı | Host.json'da functionTimeout'yi ayarlayın |
| Key Vault referansı boş dönüyor | Eksik kimlik/policy | Yönetilen kimliği ve Key Vault ilkesini atama |
| İletileri sıraya koyma, sonsuza kadar yeniden deneme | İşlev istisna atar | Bilinen hataları yönetin, günlüğe kaydedin ve geri gönderin |
| Soğuk başlatma > 10 saniye | Python çalışma zamanı başlatma | Premium planı kullanın veya FUNCTIONS_WORKER_PROCESS_COUNT'yi ayarlayın |
SSS
Tüketim vs Premium planı?
Düşük hacim için Tüketim'i kullanın (< 100/day). Tutarlı iş yükleri için Premium'u kullanın; bulut sunucularını sıcak tutar, soğuk başlatmaları ortadan kaldırır ve VNET entegrasyonunu destekler.
Azure İşlevleri fiyatlandırması AWS Lambda ile karşılaştırıldığında nasıldır?
CAPTCHA iş yükleri için çok benzer. Her ikisi de çağrı başına ~0,0001 ABD doları tutarında 256MB/60s. ücret alır Azure, 1 milyon ücretsiz çağrı içerir/month.
Dayanıklı İşlevleri karmaşık iş akışları için kullanabilir miyim?
Evet. Dayanıklı İşlevler, yayılmayı destekler/fan-in modellerini paralel olarak 10 CAPTCHA gönderin, ardından tüm sonuçları toplayın. Toplu işleme için idealdir.
İlgili Kılavuzlar
Azure'de dağıtın –CaptchaAI anahtarınızı alınBugün.