DevOps & Scaling

Azure Functions + CaptchaAI: Cloud-Integration

Azure Functions bietet serverlose CAPTCHA-Lösung mit enger Integration in das Azure-Ökosystem – Key Vault für Geheimnisse, Queue Storage für die Aufgabenverteilung und Application Insights für die Überwachung.


HTTP-ausgelöste Funktion

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

Key Vault-Integration

Speichern Sie den API-Schlüssel im Azure Key Vault:

# 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

Referenz in den Anwendungseinstellungen:

CAPTCHAAI_KEY=@Microsoft.KeyVault(SecretUri=https://captchaai-vault.vault.azure.net/secrets/CaptchaAIKey/)

Durch die Warteschlange ausgelöste Stapelverarbeitung

Verarbeiten Sie CAPTCHA-Aufgaben aus Azure Queue Storage:

@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}")

Projektstruktur

captcha-function/
├── function_app.py
├── requirements.txt
├── host.json
└── local.settings.json

requirements.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"
  }
}

Bereitstellen

# 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"
    }
  }'

Senden Sie Aufgaben an die Warteschlange

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

Fehlerbehebung

Problem Ursache Lösung
Die Funktion läuft nach 5 Minuten ab Standard-Timeout Legen Sie functionTimeout in host.json fest
Die Key Vault-Referenz gibt einen leeren Wert zurück Fehlende Identität/policy Weisen Sie verwaltete Identitäten und Key Vault-Richtlinien zu
Warteschlangennachrichten werden endlos wiederholt Funktion löst Ausnahme aus Behandeln Sie bekannte Fehler, protokollieren Sie sie und geben Sie sie zurück
Kaltstart > 10 Sekunden Python-Laufzeitinitialisierung Verwenden Sie den Premium-Plan oder legen Sie FUNCTIONS_WORKER_PROCESS_COUNT fest

FAQ

Verbrauch vs. Premium-Plan?

Verwenden Sie Consumption für geringe Mengen (< 100/Tag). Verwenden Sie Premium für konsistente Arbeitslasten – es hält Instanzen warm, eliminiert Kaltstarts und unterstützt die VNET-Integration.

Wie sind die Preise für Azure Functions im Vergleich zu AWS Lambda?

Sehr ähnlich für CAPTCHA-Workloads. Beide berechnen etwa 0,0001 US-Dollar pro Aufruf bei 256 MB/60 s. Azure umfasst 1 Mio. kostenlose Aufrufe/Monat.

Kann ich Durable Functions für komplexe Arbeitsabläufe verwenden?

Ja. Durable Functions unterstützen Fan-out-/fan-in-Muster – senden Sie 10 CAPTCHAs parallel und sammeln Sie dann alle Ergebnisse. Ideal für die Stapelverarbeitung.


Verwandte Leitfäden

  • AWS Lambda + CaptchaAI
  • Google Cloud-Funktionen + CaptchaAI

Bereitstellung auf Azure – Holen Sie sich Ihren CaptchaAI-Schlüssel und starten Sie heute.

Kommentare sind für diesen Artikel deaktiviert.

Verwandte Beiträge

DevOps & Scaling Auto-Scaling CAPTCHA-Solver-Worker
CAPTCHA-Worker dynamisch skalieren – Thread-basiertes und prozessbasiertes Auto-Scaling mit Warteschlangentiefe, Auslastungssignalen und Kontostandprüfung.

CAPTCHA-Worker dynamisch skalieren – Thread-basiertes und prozessbasiertes Auto-Scaling mit Warteschlangentief...

May 01, 2026
DevOps & Scaling CaptchaAI Überwachung mit Datadog: Metriken und Warnungen
Captcha AI mit Datadog überwachen: CAPTCHA-Lösungsraten, Latenz und Fehlerraten als Datadog-Metriken senden und Alerts konfigurieren.

Captcha AI mit Datadog überwachen: CAPTCHA-Lösungsraten, Latenz und Fehlerraten als Datadog-Metriken senden un...

May 06, 2026