Chame o solvethree a partir de um backend Flask
Use rotas separadas do Flask para criar e consultar uma tarefa do solvethree. O POST abaixo retorna sem esperar toda a resolução; o cliente guarda o ID da tarefa e consulta a rota GET até que a tarefa esteja pronta ou tenha falhado.
Nesta página
Instale as dependências e configure o destino
- 1.
Use Python 3.10 ou mais recente
Instale o Flask com
python -m pip install flask. Instale o SDK oficial do Python compython -m pip install https://solvethree.com/downloads/solvethree_sdk-0.1.0-py3-none-any.whl. - 2.
Defina as variáveis de ambiente do servidor
Defina
SOLVETHREE_API_KEYcom a chave de API do seu workspace eINTEGRATION_KEYcom o segredo que seu cliente autorizado enviará emX-Integration-Key. DefinaCAPTCHA_SITEcom o hostname de destino, não uma URL completa, eSOLVETHREE_PROXYcom a URL do proxy HTTP ou HTTPS usado para esta tarefa. Mantenha esses valores no servidor. - 3.
Ative o perfil do site
Configure no console do solvethree um perfil ativo para esse hostname, disponível para seu workspace. Definir
CAPTCHA_SITEnão cria um perfil. Consulte a configuração de perfil de site se o destino ainda não estiver configurado.
O exemplo fixa a ação em login e usa a tarefa padrão de reCAPTCHA Enterprise v3. Altere essa ação para corresponder à operação de destino antes de executá-lo. O cliente não pode sobrescrever o site, a ação ou o proxy pelo corpo da requisição.
Adicione as rotas de criação e consulta
# 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))Salve o exemplo como app.py. Com as variáveis de ambiente definidas, inicie-o localmente com python -m flask --app app run. As rotas são POST /captcha/tasks e GET /captcha/tasks/<task_id>. O Flask não precisa de um URLconf separado: os decoradores registram ambas as rotas. Consulte o guia de início rápido do Flask para detalhes sobre a inicialização local; mantenha sua configuração WSGI de produção existente.
A criação usa wait_ms=0 com um tempo limite de rede de 20 segundos. Isso elimina a espera pela resolução, não pela requisição HTTP em si. A consulta permite até 15 segundos de espera por uma atualização da tarefa, com um tempo limite de rede de 25 segundos. Ambas as views usam o SDK síncrono, então cada uma ocupa seu worker de requisições enquanto a chamada ao SDK está em execução.
Guarde o ID da requisição antes de enviar o POST
- 1.
Crie um ID de requisição por tarefa lógica
Armazene-o antes de chamar
POST /captcha/taskse envie-o comoX-Request-IDjunto comX-Integration-Key. Use de 1–64 letras ASCII, números, sublinhados ou hífens. Esse POST não precisa de um corpo com os dados da tarefa, pois o servidor monta a tarefa a partir de sua configuração fixa. - 2.
Guarde o ID da tarefa retornado
Após uma resposta HTTP bem-sucedida, salve o
iddo resultado. Consulte a tarefa por meio deGET /captcha/tasks/<task_id>, enviandoX-Integration-Keynovamente. - 3.
Recupere uma criação incerta em vez de criar outra tarefa
Se a conexão do POST atingir o tempo limite, a criação ainda pode ter sido bem-sucedida. Consulte a tarefa se tiver o ID dela. Caso contrário, repita o POST com o mesmo
X-Request-IDe os mesmos dados de entrada da tarefa para recuperar a tarefa existente. Reutilizar o ID após alterar o site, a ação ou o proxy gera um conflito.
O cabeçalho é opcional no exemplo, mas omiti-lo elimina essa opção de recuperação quando a criação é bem-sucedida e a resposta se perde. Não gere um novo ID só porque a primeira requisição atingiu o tempo limite.
Trate os erros HTTP antes do status da tarefa
Verifique primeiro o status HTTP da resposta do Flask. O exemplo retorna 401 quando a chave de integração está ausente ou incorreta, 400 para um ValueError capturado e 502 para um SolvethreeError capturado. O corpo dessa resposta 502 expõe requestId e taskId para recuperação; ele não é um payload de status da tarefa e, por si só, não significa que a tarefa falhou.
| Status da tarefa | Ação do cliente |
|---|---|
| pendente | Mantenha o mesmo ID de tarefa e consulte novamente. |
| em resolução | Mantenha o mesmo ID de tarefa e consulte novamente. |
| ready | Pare as consultas periódicas e leia a solução. |
| failed | Pare as consultas periódicas e verifique errorCode e error. Resoluções que falham são reembolsadas. |
Envie o token com o proxy original e a identidade retornada
Somente um resultado ready contém uma solução utilizável. Envie solution.token ao destino pretendido — não o ID da tarefa — e use a identidade de navegador retornada em solution.userAgent e solution.secChUa.
Faça o envio usando o mesmo proxy usado para criar a tarefa. Este exemplo usa um único SOLVETHREE_PROXY fixo; portanto, guarde essa configuração original de proxy junto com a tarefa, em vez de presumir que o valor atual da variável de ambiente continuará sendo o mesmo depois. As rotas do Flask retornam o resultado do SDK; elas não fazem o envio ao destino nem configuram o proxy de quem faz a chamada.
Mantenha juntos o token, o proxy, a identidade de navegador e o destino pretendido. Uma tarefa pronta significa que o solvethree gerou uma solução; a aceitação é determinada pela resposta do destino à requisição subsequente da aplicação.
Fontes e referência da API
Execute sua primeira tarefa.
Comece com $5 em créditos no espaço de trabalho.