恢复超时请求,无需为另一个任务付费
连接超时并不意味着任务创建失败。solvethree 可能已在响应丢失前创建了任务。请使用相同的任务输入和相同的 requestId 重新发送请求以恢复任务,而不是提交新的逻辑任务。
本页内容
保存请求,然后原样重放
requestId 用于在多次创建尝试中标识同一个逻辑任务。它接受 1–64 个 ASCII 字母、数字、下划线或连字符。请在发送请求前选定该值,并将其与原始任务输入一起保存。
- 1.
保存任务请求体
将包含
requestId的完整请求保存到request.json中。对于 reCAPTCHA Enterprise,请将site设为主机名,包含action,并且只提供proxy或proxyCandidates中的一个。不要添加type或url。该文件包含代理凭据,请妥善保密。 - 2.
发送已保存的文件
使用工作区 API 密钥运行以下命令。请将密钥保存在服务器端。
- 3.
如果连接超时,重复执行命令
使用完全相同的命令和未经修改的
request.json。不要仅因未收到响应就生成另一个 requestId 或修改任务输入。
# request.json contains one valid task body and a saved requestId.
# Keep the file private: it contains your proxy credentials.
curl --fail-with-body --max-time 30 \
'https://api.solvethree.com/v1/tasks?waitMs=0' \
-H "Authorization: Bearer $SOLVETHREE_API_KEY" \
-H 'Content-Type: application/json' --data-binary @request.json
# If the connection broke, run the identical command with the identical file.
# New task: HTTP 201. Same requestId + same inputs: HTTP 200, existing task.
# Same requestId + changed inputs: HTTP 409.HTTP 201 表示已创建新任务。HTTP 200 表示相同请求已恢复现有任务。无论哪种情况,都应读取返回的任务 ID 和状态;仅凭这两种 HTTP 状态都不能判断解决结果已就绪。
举一个更改输入的具体例子:假设保存的请求将 action 设为 login。如果将其改为 checkout,同时保留相同的 requestId,就会返回 HTTP 409,表示请求 ID 冲突。要恢复原始任务,请还原原始文件并重放请求。如果确实需要使用更改后的输入,请为这个新的逻辑任务分配新的 requestId。
读取任务成功响应体之前,请先处理非成功的 HTTP 响应。409 是 HTTP 请求错误,并不表示原始任务已进入失败终态。
从 SDK 错误中获取恢复所需的 ID
两个官方 SDK 都会在你省略 requestId 时生成该值,但都不会自动重试任务创建。如果 SDK 调用抛出异常,请在启动另一个任务前检查其恢复字段。
- JavaScript:
SolvethreeError提供requestId和taskId。 - Python:
SolvethreeError提供request_id和task_id。
如果错误包含任务 ID,请恢复对该任务的 GET 轮询,无需重复创建。如果仅包含请求 ID,请使用该 ID 和原始输入重放创建请求,然后使用返回的任务 ID。即使 ID 是由 SDK 生成的,也必须保留原始输入。
不要将所有异常都视为创建过程被中断。TaskFailedError 表示任务已进入失败终态,而不是需要恢复的请求。
继续处理已恢复的任务
使用 GET /v1/tasks/:id 获取已恢复的任务。当状态为 pending 或 solving 时,继续轮询。只有 ready 状态才包含可用的解决结果。
如果状态为 failed,请停止轮询并检查 errorCode 和 error。解题失败会退款。这与网站拒绝生成的解决结果不同:ready 表示解决结果可用,并不表示目标网站已接受它。
保留期到期后,已完成的结果可能返回 HTTP 410,因此恢复机制并非永久结果存储。有关轮询循环本身,请参阅任务轮询与超时。
仍有问题?
请将任务 ID 和收到的错误信息发送给支持团队。