使用 cURL 请求并使用 TMPT Cookie

作者:solvethree阅读需 1 分钟

使用 TicketmasterTmptTask 请求 TMPT cookie。返回的 solution.token 是原始 cookie 值:将其作为 tmpt cookie 发送,而不是作为 reCAPTCHA 令牌或完整的 Set-Cookie 请求头发送。向目标发出请求时,请使用返回的浏览器身份和同一个代理。

本页内容

设置操作和准确的目标 URL

  • 对于 Event,将 url 设置为准确的活动 URL。
  • 对于 Login,将 url 设置为登录入口 URL。
  • 为此脚本提供单个代理。脚本会在向目标发送 cookie 时再次使用该代理。
  • 不要在 TMPT 任务中包含 site、recaptchaType 或 session。

示例使用 Login 和作为占位符的 Ticketmaster 主页 URL。请将任务 URL 和最终 cURL 目标替换为受支持工作流的实际 URL。如果请求的是活动 cookie,还需将操作改为 Event。

创建、轮询并应用 cookie

在服务端使用 Bash、cURL 7.76 或更高版本、jq 和 openssl 运行脚本。将 SOLVETHREE_API_KEY 设置为工作区 API 密钥,将 SOLVETHREE_PROXY 设置为代理 URL。请关闭 shell 跟踪,否则可能泄露密钥、代理凭据和 cookie。

TMPT · 创建、轮询并应用结果
#!/usr/bin/env bash
set -euo pipefail
: "${SOLVETHREE_API_KEY:?Set the API key}" "${SOLVETHREE_PROXY:?Set the proxy}"
# Requires bash, curl, jq and openssl. Do not enable shell tracing.
work=$(mktemp -d)
chmod 700 "$work"
trap 'rm -rf "$work"' EXIT
request_id=$(openssl rand -hex 16)
printf 'Recovery requestId=%s\n' "$request_id"
printf 'Authorization: Bearer %s\n' "$SOLVETHREE_API_KEY" > "$work/auth"
jq -n --arg proxy "$SOLVETHREE_PROXY" --arg id "$request_id" '{"type":"TicketmasterTmptTask","url":"https://www.ticketmaster.com/","action":"Login","proxy":$proxy,"requestId":$id}' > "$work/input.json"
api='https://api.solvethree.com/v1'
curl --fail-with-body --silent --show-error --max-time 30 \
  --header @"$work/auth" --header 'Content-Type: application/json' \
  --data-binary @"$work/input.json" --output "$work/result.json" "$api/tasks?waitMs=0"
task_id=$(jq -er '.id' "$work/result.json")
encoded_id=$(jq -nr --arg id "$task_id" '$id|@uri')
printf 'Recovery taskId=%s\n' "$task_id"
deadline=$((SECONDS + 180))
while [[ $(jq -r '.status' "$work/result.json") =~ ^(pending|solving)$ ]]; do
  remaining=$((deadline - SECONDS))
  (( remaining > 0 )) || { echo 'Local deadline reached; resume the saved task ID' >&2; exit 1; }
  timeout=$((remaining < 25 ? remaining : 25))
  curl --fail-with-body --silent --show-error --max-time "$timeout" \
    --header @"$work/auth" --output "$work/result.json" "$api/tasks/$encoded_id?waitMs=15000"
  [[ $(jq -r '.status' "$work/result.json") =~ ^(pending|solving)$ ]] && sleep 1 || true
done
[[ $(jq -r '.status' "$work/result.json") == ready ]] || { echo 'Solver task failed' >&2; exit 1; }
user_agent=$(jq -er '.solution.userAgent' "$work/result.json")
client_hints=$(jq -er '.solution.secChUa' "$work/result.json")
cookie=$(jq -er '.solution.token' "$work/result.json")
curl --silent --show-error --max-time 30 --proxy "$SOLVETHREE_PROXY" \
  --cookie "tmpt=$cookie" --user-agent "$user_agent" \
  --header "sec-ch-ua: $client_hints" --output "$work/target-response" \
  --write-out 'Target HTTP %{http_code}\n' 'https://www.ticketmaster.com/'
# Inspect the application's response before treating the operation as successful.
# Replace the example target path with the actual supported workflow URL.

脚本使用 Bearer 密钥进行身份验证,通过 POST /v1/tasks 创建一个任务,然后通过 GET /v1/tasks/:id 仅轮询返回的任务 ID。pending 和 solving 都表示应继续轮询;只有 ready 才会提供可用的求解结果。

创建请求的超时时间为 30 秒。轮询循环会在每次轮询前检查 180 秒的本地截止时间,并将单次轮询请求限制为最多 25 秒。到达该截止时间会停止此脚本,但这并不能证明远程任务已失败。

对于目标请求,cURL 的 --cookie 选项会根据原始令牌构建 Cookie 请求头。脚本还会应用 solution.userAgent、solution.secChUa 和原来的代理。脚本既不启用自动重试,也不跟随重定向。

恢复任务或修复失败的请求

任务创建在输出任务 ID 前超时。

连接超时并不能证明 API 未能创建任务。

试试这样做: 保留输出的 requestId 和原始任务输入。使用该 requestId 重新提交相同输入,以恢复现有任务,而不是创建逻辑上的新任务。复用该 ID 时更改输入会产生冲突。

API 调用返回非成功 HTTP 响应。

这是 HTTP 层错误,而不是任务状态。脚本的 --fail-with-body 选项会使调用失败,同时保存响应体。

试试这样做: 在清理临时文件前检查已保存的 API 响应。请修正报告的问题,不要将响应作为成功任务来解析,也不要盲目重复提交未更改的输入。

脚本报告求解任务失败。

脚本会输出通用失败消息;失败的任务中包含 errorCode 和 error。

试试这样做: 获取输出的任务 ID 并检查这些字段。停止轮询失败的任务。求解失败会退款。

已到达本地轮询截止时间。

任务可能仍处于待处理或求解中状态。

试试这样做: 使用输出的任务 ID 恢复获取任务信息。不要仅仅因为本地脚本停止等待就创建另一个任务。

任务已就绪,但目标拒绝请求。

检查发出的 cookie、用户代理、客户端提示、代理和目标 URL,而不只是求解器状态。

试试这样做: 确认 tmpt cookie 包含 solution.token,且不带 Set-Cookie 前缀或属性。使用返回的身份信息和原来的代理,并检查目标 URL 是否与预期工作流匹配。

运行您的第一个任务。

使用 $5 工作区额度开始体验。

创建工作区
使用 cURL 请求并使用 TMPT Cookie · solvethree