Chame o solvethree a partir de um backend Flask

Por solvethree5 min de leitura

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. 1.

    Use Python 3.10 ou mais recente

    Instale o Flask com python -m pip install flask. Instale o SDK oficial do Python com python -m pip install https://solvethree.com/downloads/solvethree_sdk-0.1.0-py3-none-any.whl.

  2. 2.

    Defina as variáveis de ambiente do servidor

    Defina SOLVETHREE_API_KEY com a chave de API do seu workspace e INTEGRATION_KEY com o segredo que seu cliente autorizado enviará em X-Integration-Key. Defina CAPTCHA_SITE com o hostname de destino, não uma URL completa, e SOLVETHREE_PROXY com a URL do proxy HTTP ou HTTPS usado para esta tarefa. Mantenha esses valores no servidor.

  3. 3.

    Ative o perfil do site

    Configure no console do solvethree um perfil ativo para esse hostname, disponível para seu workspace. Definir CAPTCHA_SITE nã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

Flask · criar e consultar a mesma tarefa
# 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. 1.

    Crie um ID de requisição por tarefa lógica

    Armazene-o antes de chamar POST /captcha/tasks e envie-o como X-Request-ID junto com X-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. 2.

    Guarde o ID da tarefa retornado

    Após uma resposta HTTP bem-sucedida, salve o id do resultado. Consulte a tarefa por meio de GET /captcha/tasks/<task_id>, enviando X-Integration-Key novamente.

  3. 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-ID e 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.

Após uma resposta HTTP bem-sucedida, verifique o status da tarefa.
Após uma resposta HTTP bem-sucedida, verifique o status da tarefa.
Status da tarefaAção do cliente
pendenteMantenha o mesmo ID de tarefa e consulte novamente.
em resoluçãoMantenha o mesmo ID de tarefa e consulte novamente.
readyPare as consultas periódicas e leia a solução.
failedPare 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.

Execute sua primeira tarefa.

Comece com $5 em créditos no espaço de trabalho.

Criar um espaço de trabalho
Chame o solvethree a partir de um backend Flask · solvethree