Appeler solvethree depuis un backend Flask

Par solvethree5 min de lecture

Utilisez des routes Flask distinctes pour créer et récupérer une tâche solvethree. Le POST ci-dessous renvoie une réponse sans attendre la fin de toute la résolution ; l’appelant conserve l’ID de tâche et consulte la route GET jusqu’à ce que la tâche soit prête ou ait échoué.

Sur cette page

Installer les dépendances et configurer la cible

  1. 1.

    Utiliser Python 3.10 ou une version ultérieure

    Installez Flask avec python -m pip install flask. Installez le SDK Python officiel avec python -m pip install https://solvethree.com/downloads/solvethree_sdk-0.1.0-py3-none-any.whl.

  2. 2.

    Définir les variables d’environnement du serveur

    Définissez SOLVETHREE_API_KEY sur la clé API de votre espace de travail et INTEGRATION_KEY sur le secret que votre appelant autorisé enverra dans X-Integration-Key. Définissez CAPTCHA_SITE sur le nom d’hôte cible, pas une URL complète, et SOLVETHREE_PROXY sur l’URL du proxy HTTP ou HTTPS utilisé pour cette tâche. Conservez ces valeurs sur le serveur.

  3. 3.

    Activer le profil de site

    Configurez dans la console solvethree un profil actif pour ce nom d’hôte, accessible à votre espace de travail. Définir CAPTCHA_SITE ne crée pas de profil. Consultez la configuration d’un profil de site si la cible n’est pas encore configurée.

L’exemple fixe l’action à login et utilise la tâche reCAPTCHA Enterprise v3 par défaut. Modifiez cette action pour qu’elle corresponde à l’opération cible avant de l’exécuter. L’appelant ne peut pas remplacer le site, l’action ou le proxy via le corps de la requête.

Ajouter les routes de création et de récupération

Flask · créer et récupérer la même tâche
# pip install flask and the official solvethree SDK wheel.
import hmac
import os
from flask import Flask, abort, jsonify, request
from solvethree import Solvethree, SolvethreeError

app = Flask(__name__)

def client():
    return Solvethree(os.environ["SOLVETHREE_API_KEY"])

@app.before_request
def authorize():
    if not hmac.compare_digest(request.headers.get("x-integration-key", ""), os.environ["INTEGRATION_KEY"]):
        abort(401)

@app.errorhandler(SolvethreeError)
def task_error(error):
    return jsonify(requestId=error.request_id, taskId=error.task_id), 502

@app.errorhandler(ValueError)
def invalid_input(error):
    return jsonify(error="Invalid task input or ID"), 400

@app.post("/captcha/tasks")
def create():
    task = {"site": os.environ["CAPTCHA_SITE"], "action": "login", "proxy": os.environ["SOLVETHREE_PROXY"]}
    if request.headers.get("x-request-id"):
        task["requestId"] = request.headers["x-request-id"]
    return jsonify(client().create_task(task, wait_ms=0, timeout=20))

@app.get("/captcha/tasks/<task_id>")
def retrieve(task_id):
    return jsonify(client().get_task(task_id, wait_ms=15000, timeout=25))

Enregistrez l’exemple dans app.py. Une fois les variables d’environnement définies, démarrez-le localement avec python -m flask --app app run. Les routes sont POST /captcha/tasks et GET /captcha/tasks/<task_id>. Flask n’a pas besoin de URLconf distinct : les décorateurs enregistrent les deux routes. Consultez le guide de démarrage rapide de Flask pour les détails du démarrage local ; conservez votre configuration WSGI de production existante.

La création utilise wait_ms=0 avec un délai d’expiration réseau de 20 secondes. Cela évite d’attendre la résolution, pas la requête HTTP elle-même. La récupération autorise jusqu’à 15 secondes d’attente d’une mise à jour de la tâche, avec un délai d’expiration réseau de 25 secondes. Les deux vues utilisent le SDK synchrone ; chacune occupe donc son worker de traitement des requêtes pendant l’exécution de l’appel SDK.

Conservez l’identifiant de requête avant d’envoyer le POST

  1. 1.

    Créez un identifiant de requête par tâche logique

    Enregistrez-le avant d’appeler POST /captcha/tasks, puis envoyez-le dans X-Request-ID avec X-Integration-Key. Utilisez 1–64 lettres ASCII, chiffres, traits de soulignement ou traits d’union. Ce POST ne nécessite aucun corps de tâche, car le serveur construit la tâche à partir de sa configuration fixe.

  2. 2.

    Conserver l’identifiant de tâche renvoyé

    Après une réponse HTTP réussie, enregistrez le champ id du résultat. Récupérez la tâche via GET /captcha/tasks/<task_id>, en envoyant à nouveau X-Integration-Key.

  3. 3.

    Récupérez une tâche dont la création est incertaine plutôt que d’en créer une autre

    Si la connexion POST expire, la création peut tout de même avoir réussi. Récupérez la tâche si vous avez son identifiant. Sinon, répétez le POST avec le même X-Request-ID et les mêmes paramètres de tâche pour récupérer la tâche existante. Réutiliser l’identifiant après avoir modifié le site, l’action ou le proxy provoque un conflit.

L’en-tête est facultatif dans l’exemple, mais son omission supprime cette possibilité de récupération si la création réussit et que sa réponse est perdue. Ne générez pas un nouvel identifiant simplement parce que la première requête a expiré.

Traitez les erreurs HTTP avant le statut de la tâche

Vérifiez d’abord le statut HTTP de la réponse Flask. L’exemple renvoie 401 si la clé d’intégration est absente ou incorrecte, 400 pour une exception ValueError interceptée et 502 pour une exception SolvethreeError interceptée. Le corps de cette réponse 502 expose requestId et taskId pour permettre la récupération ; il ne s’agit pas d’une réponse contenant le statut de la tâche et cela ne signifie pas en soi que la tâche a échoué.

Après une réponse HTTP réussie, examinez le statut de la tâche.
Après une réponse HTTP réussie, examinez le statut de la tâche.
Statut de la tâcheAction de l’appelant
en attenteConservez le même identifiant de tâche et récupérez-la à nouveau.
résolution en coursConservez le même identifiant de tâche et récupérez-la à nouveau.
readyArrêtez les interrogations et lisez la solution.
failedArrêtez les interrogations et examinez errorCode et error. Les résolutions échouées sont remboursées.

Soumettre le jeton avec le proxy d’origine et l’identité renvoyée

Seul un résultat ready contient une solution utilisable. Envoyez solution.token à la cible prévue, et non l’identifiant de tâche, et utilisez l’identité du navigateur renvoyée dans solution.userAgent et solution.secChUa.

Effectuez l’envoi via le même proxy que celui utilisé pour créer la tâche. Cet exemple utilise un seul SOLVETHREE_PROXY fixe : conservez donc cette configuration de proxy d’origine avec la tâche, plutôt que de supposer que la valeur actuelle de l’environnement correspondra encore par la suite. Les routes Flask renvoient le résultat du SDK ; elles n’effectuent pas l’envoi à la cible et ne configurent pas le proxy de l’appelant.

Conservez ensemble le jeton, le proxy, l’identité du navigateur et la cible prévue. Une tâche prête signifie que solvethree a généré une solution ; son acceptation est déterminée par la réponse de la cible à la requête applicative suivante.

Lancez votre première tâche.

Démarrez avec $5 de crédit dans votre espace de travail.

Créer un espace de travail
Appeler solvethree depuis un backend Flask · solvethree