验证码类型 · perimeterx
PerimeterX(HUMAN)识别 API:获取 _px3 Cookie
通过 SolveHub API 处理 PerimeterX / HUMAN 人机验证:应用 ID、目标站点、代理与浏览器 Cookie。了解需要提交的字段以及如何使用返回的 Cookie。
适用于授权自动化测试、风控 QA 与浏览器集成。请仅在有权测试的站点和业务流程中使用。
POST /v1/tasks 发送下方 JSON,附带 Authorization: Bearer <API_KEY>、Content-Type: application/json 与 Idempotency-Key。先在实时价格确认该类型可用;完整创建与查询流程见快速开始。必填页面地址 websiteURL、PerimeterX 应用 ID websiteKey(pxAppId)及 HTTP 代理。可选 useragent。不要把页面出现的 UUID 或访客 ID 代替应用 ID。
请求字段
外层 type 和 task 必填;以下 task.* 路径均位于 task 对象内。字段名区分大小写。长度限制按 UTF-8 字节计算。
| 字段 | 类型 | 必填 | 限制 | 说明 |
|---|---|---|---|---|
type |
字符串 | 是 | 固定为 perimeterx |
平台任务类型。 |
task |
JSON 对象 | 是 | ≤ 7 MiB | 此类型的任务参数。 |
task.type |
字符串 | 否 | 如提供必须为 perimeterx |
兼容旧请求格式;新接入可省略。 |
task.websiteURL |
HTTP(S) URL | 是 | ≤ 2048 字节 | 需要解题的目标页面完整 URL,不含账号密码。 |
task.websiteKey |
字符串 | 是 | ≤ 256 字节 | PerimeterX 应用 ID,即 pxAppId;访客 UUID/vid 不能替代。 |
task.useragent |
字符串 | 否 | ≤ 512 字节 | 自定义浏览器 User-Agent;后续请求优先使用实际返回的 solution.useragent。 |
task.proxyType |
字符串 | 是 | 仅 http |
代理协议;提供时必须为 http。 |
task.proxyAddress |
字符串 | 是 | ≤ 256 字节 | 代理 IP 或主机名,必须与 proxyPort 同时提供。 |
task.proxyPort |
字符串 | 是 | 1–5 字节,数值 1–65535 | 代理端口,必须为带引号的数字字符串。 |
task.proxyLogin |
字符串 | 否 | ≤ 256 字节 | 代理需要认证时填写用户名;不得单独提供而不填地址与端口。 |
task.proxyPassword |
字符串 | 否 | ≤ 256 字节 | 代理需要认证时填写密码;不得单独提供而不填地址与端口。 |
创建请求示例
{
"type": "perimeterx",
"task": {
"websiteURL": "https://example.com/protected",
"websiteKey": "PX_EXAMPLE_APP_ID",
"proxyType": "http",
"proxyAddress": "203.0.113.10",
"proxyPort": "8080"
}
}
cURL 调用
把示例中的 Key、站点信息与代理替换为你的实际值;Idempotency-Key 对同一次业务请求保持不变。
curl -sS -X POST 'https://www.tiam.codes/v1/tasks' \
-H 'Authorization: Bearer sh_REPLACE_ME' \
-H 'Content-Type: application/json' \
-H 'Idempotency-Key: example-perimeterx-0001' \
--data-binary @- <<'JSON'
{
"type": "perimeterx",
"task": {
"websiteURL": "https://example.com/protected",
"websiteKey": "PX_EXAMPLE_APP_ID",
"proxyType": "http",
"proxyAddress": "203.0.113.10",
"proxyPort": "8080"
}
}
JSON
创建响应与查询
创建成功返回 HTTP 202,status 初始通常为 queued。保存 taskId,每约 2–3 秒调用 GET /v1/tasks/{taskId} 查询。本类型处理软时限为 210 秒;超过软时限可能进入 uncertain,有已受理任务的结果可继续核对,客户端不要用新幂等键盲目重建。
结果字段
只在 status=completed 时读取 solution;下表列出常用字段,实际字段以该任务响应为准。
| 字段 | 类型 | 读取方式 |
|---|---|---|
solution.cookies |
对象 | 浏览器会话 Cookie;名称由目标页面决定,可含 _px3、_pxvid、_pxhd。 |
solution.useragent |
字符串 | 后续请求与相同代理一起复用的 User-Agent。 |
solution.value |
字符串,可选 | 有些结果会给空字符串,不能代替 Cookie 判断成功。 |
结果以 solution.cookies 和 solution.useragent 为主;Cookie 名称随目标站配置变化,可能包含 _px3、_pxvid。结果示意:{"cookies":{"_px3":"EXAMPLE_COOKIE"},"useragent":"Mozilla/5.0 ..."}。后续请求应复用解题代理和返回的 User-Agent。
完成响应示例(平台字段与结果分开;价格与时间仅为示意):
{
"taskId": "00000000-0000-4000-8000-000000000001",
"type": "perimeterx",
"status": "completed",
"priceMicros": 1000,
"traceId": "00000000-0000-4000-8000-000000000002",
"solution": {
"value": "",
"cookies": {
"_px3": "EXAMPLE_COOKIE",
"_pxvid": "EXAMPLE_VISITOR"
},
"useragent": "Mozilla/5.0 ..."
},
"createdAt": "2026-10-05T00:00:00Z",
"finishedAt": "2026-10-05T00:00:30Z"
}
Python 创建并查询
示例使用 requests。把占位站点、代理和环境变量替换为实际值;创建请求网络异常时应使用同一幂等键与同一请求体重试,不能换键。任务进入 uncertain 时保留 taskId 继续查询或联系客服。
import os
import time
import requests
base = os.environ["SOLVEHUB_URL"].rstrip("/")
headers = {
"Authorization": f"Bearer {os.environ['SOLVEHUB_API_KEY']}",
"Idempotency-Key": "your-business-request-perimeterx-001",
}
payload = {
"type": "perimeterx",
"task": {
"websiteURL": "https://example.com/protected",
"websiteKey": "PX_EXAMPLE_APP_ID",
"proxyType": "http",
"proxyAddress": "203.0.113.10",
"proxyPort": "8080",
},
}
response = requests.post(f"{base}/v1/tasks", headers=headers, json=payload, timeout=20)
response.raise_for_status()
task_id = response.json()["taskId"]
deadline = time.monotonic() + 15 * 60
while time.monotonic() < deadline:
response = requests.get(f"{base}/v1/tasks/{task_id}", headers=headers, timeout=20)
response.raise_for_status()
task = response.json()
if task["status"] == "completed":
solution = task["solution"]
print(solution.get("cookies", {}), solution.get("useragent"))
break
if task["status"] in ("failed", "cancelled"):
raise RuntimeError(task.get("errorCode", task["status"]))
if task["status"] == "uncertain":
print("任务待核对:", task_id)
break
time.sleep(3)
else:
print("已到本地轮询时限,请稍后继续查询原任务:", task_id)
失败与排查
websiteKey 必须是应用 ID pxAppId;不要提交访客 UUID/vid。proxyPort 是字符串。后续访问复用同一代理、完整 Cookie 集和 solution.useragent。
创建请求常见错误为 400 INVALID_TASK、402 INSUFFICIENT_BALANCE、429 TASK_LIMIT_EXCEEDED 和 503 TYPE_UNAVAILABLE。已创建任务失败时公开错误码为 TASK_FAILED 或 TASK_TIMEOUT;uncertain 对应 TASK_UNCERTAIN。详见 平台 API 参考。
常见问题
websiteKey应填什么? 填目标站的 PerimeterX 应用 IDpxAppId。页面访客 UUID 和 vid 都不能替代它。- 可以省略代理吗? 此类型不可以。
proxyType固定为http,proxyAddress与字符串proxyPort必须同时提供;只有代理需要认证时才填写proxyLogin、proxyPassword。 - 需要 SOCKS5 代理怎么办? 此类型只接受 HTTP 代理;需要
socks5时使用perimeterx_cookies类型(当前默认关闭,以GET /v1/prices为准)。 - 为什么返回的 Cookie 不能使用? 先确认提交的是当前目标页面、应用 ID、完整 Cookie 集;后续请求复用解题时的代理出口和返回的
solution.useragent。Cookie 名称由目标页面配置决定,不能只依赖_px3。
处理窗口从任务确认受理后起算,不扣除已花费的排队时间。解题节点当前约 180 秒超时;平台保留 210 秒软时限以等待网络和轮询结果。
相关文档
最近更新: