Обработка ошибок Python SDK без повторного решения задач
Тайм-аут соединения не доказывает, что создание задачи не удалось. Сохраните исходные входные данные задачи и requestId; восстановите этот запрос, прежде чем создавать новую задачу решения.
На этой странице
Перехватывайте ошибки задач отдельно от HTTP-ошибок
Метод solve синхронного Python SDK создаёт задачу один раз и опрашивает её до готовности либо возникновения исключения. Перехватывайте конкретные исключения до SolvethreeError, чтобы отличать неуспешное решение от прерванного HTTP-запроса.
Задайте SOLVETHREE_API_KEY и SOLVETHREE_PROXY, затем замените имя хоста и действие из примера значениями целевого сервиса. Для решения на сайте требуется активный профиль рабочего пространства.
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: задача перешла в конечный статусfailed. Проверьтеerror.task_idиerror.error_code; не продолжайте опрос этой задачи.ApiError: HTTP-запрос завершился ошибкой. Проверьтеerror.statusиerror.retry_after, который измеряется в секундах. Это не то же самое, что конечный статус ошибки задачи.SolvethreeError: сохранитеerror.request_idиerror.task_idдля явного восстановления. Используйте доступные идентификаторы, а не исходите из того, что задача не была создана.
Пример выводит данные для восстановления, но не сохраняет их и не выполняет восстановление. Если интеграция должна переживать перезапуск процесса, сохраните исходные входные данные задачи и идентификатор запроса перед вызовом solve, а затем сохраняйте любой полученный идентификатор задачи. Защитите сохранённые входные данные, содержащие учётные данные прокси.
Возобновляйте работу по идентификатору задачи; восстанавливайте создание по идентификатору запроса
- 1.
Если есть task_id, возобновите get_task
Получите эту задачу вместо повторного вызова
solve.get_taskпринимает идентификатор задачи и аргументwait_ms; время ожидания по умолчанию — 15000 миллисекунд. Продолжайте, пока статус равенpendingилиsolving. Используйте решение только при статусеreadyи остановитесь приfailed. - 2.
Если создание прервалось до получения идентификатора задачи, повторите create_task
Отправьте идентичные входные данные задачи с тем же
requestId, при необходимости используя восстановленныйrequest_id. Повторное использование этого идентификатора с тем же запросом возвращает существующую задачу; изменение входных данных вызывает конфликт. Получив её идентификатор, продолжайте сget_task. - 3.
Не генерируйте новый идентификатор при восстановлении
Пример генерирует UUID перед вызовом
solve. Сохраните это значение для восстановления; не запускайте создание структуры задачи заново, чтобы случайно не заменить его. Новый идентификатор означает отдельный запрос, а не повтор прерванного.
SDK генерирует requestId, если вы его не указали, предоставляет идентификаторы для восстановления в ошибках и никогда не повторяет создание задачи автоматически. Во время solve он учитывает Retry-After при временных сбоях опроса в пределах срока решения. Если вызов всё же завершается исключением, используйте сохранённые идентификаторы для возобновления, а не запускайте новое решение.
Восстановление — не повод повторять некорректные запросы
При ApiError изучите HTTP-ошибку, прежде чем решать, нужно ли что-либо отправлять повторно. Восстановление прерванного создания уместно, когда результат неизвестен; слепая повторная отправка тех же некорректных входных данных — нет.
При TaskFailedError задача завершена. Полученная неуспешная задача содержит errorCode и error; исключение Python предоставляет код через error.error_code. Используйте эти сведения, чтобы решить, что нужно изменить. Например, site-unreachable требует проверки доступности целевого сервиса, а не предположения о нехватке средств на счёте. Средства за неуспешные решения возвращаются.
Источники и справочник API
Запустите первую задачу.
Начните с $5 на балансе рабочего пространства.