Appeler solvethree depuis un backend Flask
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.
Utiliser Python 3.10 ou une version ultérieure
Installez Flask avec
python -m pip install flask. Installez le SDK Python officiel avecpython -m pip install https://solvethree.com/downloads/solvethree_sdk-0.1.0-py3-none-any.whl. - 2.
Définir les variables d’environnement du serveur
Définissez
SOLVETHREE_API_KEYsur la clé API de votre espace de travail etINTEGRATION_KEYsur le secret que votre appelant autorisé enverra dansX-Integration-Key. DéfinissezCAPTCHA_SITEsur le nom d’hôte cible, pas une URL complète, etSOLVETHREE_PROXYsur l’URL du proxy HTTP ou HTTPS utilisé pour cette tâche. Conservez ces valeurs sur le serveur. - 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_SITEne 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
# 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.
Créez un identifiant de requête par tâche logique
Enregistrez-le avant d’appeler
POST /captcha/tasks, puis envoyez-le dansX-Request-IDavecX-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.
Conserver l’identifiant de tâche renvoyé
Après une réponse HTTP réussie, enregistrez le champ
iddu résultat. Récupérez la tâche viaGET /captcha/tasks/<task_id>, en envoyant à nouveauX-Integration-Key. - 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-IDet 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é.
| Statut de la tâche | Action de l’appelant |
|---|---|
| en attente | Conservez le même identifiant de tâche et récupérez-la à nouveau. |
| résolution en cours | Conservez le même identifiant de tâche et récupérez-la à nouveau. |
| ready | Arrêtez les interrogations et lisez la solution. |
| failed | Arrê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.
Sources et référence de l’API
Lancez votre première tâche.
Démarrez avec $5 de crédit dans votre espace de travail.