Die CAPTCHA-API aus Cloudflare Workers aufrufen

Von solvethree4 Min. Lesezeit

Rufen Sie die Task-API von solvethree über einen Worker mit serverseitigem fetch auf. Hinterlegen Sie den Workspace-API-Schlüssel in einer Secret-Bindung, legen Sie die Zieleingaben im Worker fest und geben Sie Task-Antworten nur an Ihren autorisierten Anwendungsaufrufer zurück.

Auf dieser Seite

Ziel und Secrets konfigurieren

Aktivieren Sie zunächst das Profil der Zielwebsite für Ihren Workspace in der Konsole. Durch das Senden eines Hostnamens und einer Aktion wird kein Profil erstellt. Falls diese Voraussetzung noch nicht erfüllt ist, lesen Sie Website-Profil einrichten.

  • SOLVETHREE_API_KEY: Ihr Workspace-API-Schlüssel, gespeichert als Worker-Secret.
  • INTEGRATION_KEY: ein separates Secret, das Ihr Anwendungsaufrufer in x-integration-key senden muss.
  • SOLVETHREE_PROXY: die zum Lösen verwendete Proxy-URL. Speichern Sie sie als Secret, wenn sie Zugangsdaten enthält.
  • CAPTCHA_SITE: der Zielhostname, keine vollständige URL.

Das Beispiel legt die Aktion auf login fest und gibt einen Proxy an. Passen Sie diese bereitgestellten Eingaben an Ihre Integration an; akzeptieren Sie keine beliebigen Zieleingaben von Aufrufern. Wenn recaptchaType weggelassen wird, verwendet die API standardmäßig reCAPTCHA Enterprise v3.

Verwenden Sie den Integrationsschlüssel zwischen einem vertrauenswürdigen Anwendungsaufrufer und dem Worker, nicht in öffentlich ausgeliefertem Browsercode. Er ist ein gemeinsam genutzter Zugangsschlüssel, keine benutzerspezifische Task-Autorisierung.

Tasks erstellen und abrufen

Worker · Authentifizierte REST-Aufrufe zum Erstellen und Abrufen
export default {
  async fetch(request, env) {
    if (!env.INTEGRATION_KEY || request.headers.get('x-integration-key') !== env.INTEGRATION_KEY) {
      return new Response('Unauthorized', { status: 401 });
    }
    const url = new URL(request.url);
    const headers = { Authorization: `Bearer ${env.SOLVETHREE_API_KEY}`, 'Content-Type': 'application/json' };
    let response;
    if (request.method === 'POST') {
      const requestId = request.headers.get('x-request-id');
      if (!requestId || !/^[A-Za-z0-9_-]{1,64}$/.test(requestId)) return new Response('Provide X-Request-ID', { status: 400 });
      response = await fetch('https://api.solvethree.com/v1/tasks?waitMs=0', {
        method: 'POST', headers, redirect: 'error', signal: AbortSignal.timeout(20000),
        body: JSON.stringify({ site: env.CAPTCHA_SITE, action: 'login', proxy: env.SOLVETHREE_PROXY, requestId }),
      });
    } else if (request.method === 'GET') {
      const id = url.searchParams.get('id');
      if (!id || !/^[A-Za-z0-9_-]{1,128}$/.test(id)) return new Response('Provide a valid id', { status: 400 });
      response = await fetch(`https://api.solvethree.com/v1/tasks/${encodeURIComponent(id)}?waitMs=15000`, {
        headers, redirect: 'error', signal: AbortSignal.timeout(25000),
      });
    } else return new Response('Use POST or GET', { status: 405 });
    if (!response.ok) return Response.json({ error: 'Solver API request failed', status: response.status }, { status: response.status });
    return Response.json(await response.json(), { headers: { 'Cache-Control': 'no-store' } });
  },
};
// Store keys in Worker secret bindings. The task proxy field does not add a
// generic HTTP proxy option to Workers fetch; another client must submit through it.
  1. 1.

    Task erstellen

    Senden Sie eine POST-Anfrage mit x-integration-key und x-request-id an den Worker. Wählen Sie eine Anfrage-ID aus 1–64 ASCII-Buchstaben, Ziffern, Unterstrichen oder Bindestrichen. Der Worker erstellt den Task-Body anhand seines konfigurierten Ziels und Proxys; er verwendet keinen vom Aufrufer bereitgestellten Body.

  2. 2.

    Task-ID aufbewahren

    Der Worker gibt die JSON-Antwort des Solvers zurück. Speichern Sie die zurückgegebene Task-ID und bewahren Sie die zur Erstellung verwendete Anfrage-ID auf.

  3. 3.

    Ergebnis abrufen

    Senden Sie eine GET-Anfrage mit der Task-ID im Abfrageparameter id und demselben Integrationsschlüssel-Header an den Worker. Der Handler validiert die Syntax der ID und ruft den Task von solvethree ab.

Beide Upstream-Anfragen authentifizieren sich mit dem Workspace-Schlüssel. Der Handler leitet HTTP-Statuscodes, die keinen Erfolg anzeigen, mit einem generischen Fehler-Body weiter und kennzeichnet erfolgreiche JSON-Antworten mit Cache-Control: no-store. Über den gemeinsamen Integrationsschlüssel hinaus prüft er nicht, wem der Task gehört; ergänzen Sie diese Autorisierung, bevor Sie den Abruf für verschiedene Benutzer zugänglich machen.

Timeouts behandeln, ohne eine weitere Aufgabe zu erstellen

Die Erstellung verwendet waitMs=0 mit einem Fetch-Timeout von 20 Sekunden. Der Abruf verwendet waitMs=15000 mit einem Fetch-Timeout von 25 Sekunden. Diese Grenzen beschränken einzelne HTTP-Aufrufe, nicht die gesamte Lebensdauer des Tasks.

Wenn bei der Erstellung ein Timeout auftritt, bevor Sie eine Task-ID erhalten, wiederholen Sie dieselbe Task-Anfrage mit derselben Anfrage-ID. Dadurch wird der bestehende Task wieder abgerufen, falls er erstellt wurde. Generieren Sie nicht allein wegen eines Verbindungsfehlers eine neue ID: Die erste Anfrage könnte solvethree bereits erreicht haben. Die Wiederverwendung einer ID mit geänderten Eingaben führt zu einem Konflikt.

Das Beispiel fängt keine Fetch-Ausnahmen ab, auch keine Timeouts. Ergänzen Sie eine Ausnahmebehandlung, wenn Ihr Aufrufer eine strukturierte Fehlerantwort benötigt, aber halten Sie die Anfrage-ID für die Wiederherstellung verfügbar.

  • pending oder solving: Rufen Sie denselben Task erneut ab und beachten Sie dabei eine Gesamtfrist in Ihrem Aufrufer.
  • ready: Die Lösung ist verfügbar; beenden Sie das Polling und übergeben Sie sie an den Client für die Übermittlung.
  • failed: Beenden Sie das Polling und prüfen Sie errorCode und error. Beheben Sie das gemeldete Problem, bevor Sie einen weiteren Task erstellen.

Ein HTTP-Fehler und ein Task mit dem Status failed sind unterschiedliche Fehlerfälle. Der Handler prüft zuerst den HTTP-Status; der Aufrufer muss den Task-Status in einer erfolgreichen Antwort trotzdem prüfen. Hinweise zur Diagnose finden Sie unter CAPTCHA-API-Fehler.

Über einen Client übermitteln, der den Proxy nutzen kann

Das Worker-Beispiel ruft nur solvethree auf. Das Feld proxy des Tasks teilt dem Solver mit, welchen Proxy er verwenden soll; es ändert nicht das Netzwerk-Routing des Workers. Workers fetch bietet keine allgemeine Option für eine Proxy-URL.

Senden Sie die fertige Lösung an einen Client, der sie über denselben Proxy an das vorgesehene Ziel übermitteln kann. Verwenden Sie die mit der Lösung zurückgegebenen Werte für userAgent und secChUa statt anderer Browser-Header. Ein fertiger Task bedeutet, dass solvethree eine Lösung generiert hat; ob sie akzeptiert wird, hängt von der anschließenden Anfrage an das Ziel ab.

Führe deinen ersten Task aus.

Starte mit $5 Workspace-Guthaben.

Workspace erstellen
Die CAPTCHA-API aus Cloudflare Workers aufrufen · solvethree