DevOps & Scaling

Azure İşlevleri + CaptchaAI: Bulut Entegrasyonu

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.

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

İlgili Yazılar

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 Otomatik Ölçeklendirme CAPTCHA Çözme Çalışanları
Üretimdeki Captcha AI iş akışlarına yönelik mimari kararları, işletim hususlarını ve otomasyon modellerini içeren Otomatik Ölçeklendirme CAPTCHA Çözme Çalışanla...

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

Apr 21, 2026
DevOps & Scaling CaptchaAI Çalışan Dağıtımı için Ansible Playbook'lar
Ansible Playbook'lar için Captcha AI Çalışan Dağıtımı için Dev Ops kılavuzu, üretimdeki Captcha AI iş akışlarına yönelik mimari kararları, işletim hususlarını v...

Ansible Playbook'lar için Captcha AI Çalışan Dağıtımı için Dev Ops kılavuzu, üretimdeki Captcha AI iş akışları...

Apr 19, 2026