Gestiona los errores del SDK de Python sin duplicar las resoluciones
Que se agote el tiempo de espera de conexión no demuestra que la creación de la tarea haya fallado. Conserva los datos originales de la tarea y su requestId; recupera esa solicitud antes de crear otra resolución.
En esta página
Capturar los fallos de las tareas por separado de los errores HTTP
El método solve del SDK síncrono de Python crea una tarea una sola vez y la sondea hasta que está lista o lanza un error. Captura las excepciones específicas antes de SolvethreeError para poder distinguir una resolución fallida de una solicitud HTTP interrumpida.
Configura SOLVETHREE_API_KEY y SOLVETHREE_PROXY y sustituye el nombre de host y la acción del ejemplo por los valores de tu destino. El sitio necesita un perfil activo en el espacio de trabajo antes de poder resolverlo.
import os
import uuid
from solvethree import Solvethree, ApiError, TaskFailedError, SolvethreeError
client = Solvethree(os.environ["SOLVETHREE_API_KEY"])
task = {"site": "accounts.example.com", "action": "login", "proxy": os.environ["SOLVETHREE_PROXY"], "requestId": str(uuid.uuid4())}
try:
result = client.solve(task, timeout=180)
print("Ready task:", result["id"])
# Submit result["solution"] privately through the target application.
except TaskFailedError as error:
print("Failed task:", error.task_id, "code:", error.error_code)
# This task is terminal. Inspect it before starting different work.
except ApiError as error:
print("HTTP status:", error.status, "retry delay:", error.retry_after)
print("Recovery IDs:", error.request_id, error.task_id)
# A known task_id means resume get_task; otherwise replay the exact task
# with error.request_id. Do not generate a new logical request to recover it.
except SolvethreeError as error:
print("Recovery IDs:", error.request_id, error.task_id)
# Save these IDs and the original task inputs for explicit recovery.TaskFailedError: la tarea alcanzó el estado terminalfailed. Inspeccionaerror.task_idyerror.error_code; no sigas sondeando esa tarea.ApiError: una solicitud HTTP falló. Inspeccionaerror.statusyerror.retry_after, que se mide en segundos. Esto no equivale a un fallo terminal de la tarea.SolvethreeError: conservaerror.request_idyerror.task_idpara una recuperación explícita. Usa los ID que estén disponibles en lugar de asumir que la creación nunca se produjo.
El ejemplo imprime la información de recuperación, pero no la guarda de forma persistente ni realiza la recuperación. En una integración que deba resistir un reinicio del proceso, guarda los datos originales de la tarea y el ID de solicitud antes de llamar a solve y conserva después cualquier ID de tarea devuelto. Protege los datos almacenados que contengan credenciales del proxy.
Reanudar por ID de tarea; recuperar la creación por ID de solicitud
- 1.
Si tienes un task_id, reanuda get_task
Recupera esa tarea en lugar de volver a llamar a
solve.get_taskacepta el ID de tarea y un argumentowait_ms; su espera predeterminada es de 15000 milisegundos. Continúa mientras el estado seapendingosolving. Usa la solución solo cuando el estado seareadyy detente si esfailed. - 2.
Si la creación se interrumpió antes de que recibieras un ID de tarea, vuelve a ejecutar create_task
Envía exactamente los mismos datos de la tarea con el mismo
requestId, usando elrequest_idrecuperado cuando sea necesario. Reutilizar ese ID con la misma solicitud devuelve la tarea existente; cambiar los datos provoca un conflicto. Una vez que tengas su ID de tarea, continúa conget_task. - 3.
No generar otro ID durante la recuperación
El ejemplo genera su UUID antes de llamar a
solve. Conserva ese valor durante la recuperación; no vuelvas a ejecutar la construcción de la tarea y lo sustituyas por accidente. Un ID nuevo representa una solicitud distinta, no un reintento de la que se interrumpió.
El SDK genera un requestId si lo omites, expone los ID de recuperación en los errores y nunca reintenta automáticamente la creación de tareas. Durante solve, respeta Retry-After para los fallos temporales de sondeo dentro del plazo de resolución. Si la llamada sigue lanzando una excepción, usa los ID guardados para reanudarla en lugar de iniciar otra resolución.
La recuperación no justifica repetir solicitudes no válidas
En el caso de ApiError, inspecciona el error HTTP antes de decidir si vuelves a enviar algo. Recuperar una creación interrumpida es adecuado cuando el resultado es incierto; reenviar a ciegas los mismos datos no válidos no lo es.
En el caso de TaskFailedError, la tarea ha terminado. Una tarea fallida recuperada contiene errorCode y error; la excepción de Python expone el código como error.error_code. Usa esa información para decidir qué debes cambiar. Por ejemplo, site-unreachable requiere investigar la accesibilidad del destino, no asumir que la cuenta carece de crédito. Las resoluciones fallidas se reembolsan.
Fuentes y referencia de la API
Ejecuta tu primera tarea.
Empieza con $5 de crédito en tu espacio de trabajo.