Запрос и использование cookie TMPT с помощью cURL

Автор: solvethree3 мин на чтение

Используйте TicketmasterTmptTask для запроса cookie TMPT. Возвращённое значение solution.token — это само значение cookie: отправляйте его как cookie tmpt, а не как токен reCAPTCHA или полный заголовок Set-Cookie. Для запроса к целевому серверу используйте возвращённые идентификационные данные браузера и тот же прокси.

На этой странице

Задайте действие и точный целевой URL

  • Для Event укажите в url точный URL события.
  • Для Login укажите в url адрес точки входа в процесс авторизации.
  • Укажите для этого скрипта один прокси. Он повторно использует этот прокси при отправке cookie целевому серверу.
  • Не включайте site, recaptchaType или session в задачу TMPT.

В примере используются Login и URL главной страницы Ticketmaster в качестве заглушки. Замените URL задачи и целевой адрес финального вызова cURL на фактические URL вашего поддерживаемого сценария. Если вы запрашиваете cookie для события, также измените действие на Event.

Создайте задачу, опрашивайте её и примените cookie

Запускайте скрипт на сервере с Bash, cURL 7.76 или новее, jq и openssl. Укажите в SOLVETHREE_API_KEY API-ключ рабочего пространства, а в SOLVETHREE_PROXY — URL прокси. Не включайте трассировку команд оболочки: она может раскрыть ключ, учётные данные прокси и 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, затем опрашивает только возвращённый для неё ID через GET /v1/tasks/: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 задачи и проверьте эти поля. Прекратите опрос неудачной задачи. За неудачные решения средства возвращаются.

Истекает локальный лимит времени опроса.

Задача всё ещё может находиться в состоянии pending или solving.

Попробуйте: Возобновите получение данных с помощью выведенного ID задачи. Не создавайте новую задачу лишь потому, что локальный скрипт прекратил ожидание.

Задача готова, но целевой сайт отклоняет запрос.

Проверьте исходящий cookie, user agent, client hints, прокси и целевой URL, а не только статус решения.

Попробуйте: Убедитесь, что cookie tmpt содержит solution.token без префикса Set-Cookie и атрибутов. Используйте возвращённые идентификационные данные и исходный прокси, а также проверьте, соответствует ли целевой URL нужному сценарию.

Запустите первую задачу.

Начните с $5 на балансе рабочего пространства.

Создать рабочее пространство
Запрос и использование cookie TMPT с помощью cURL · solvethree