cURL로 Kasada 헤더 생성
KasadaTask를 생성하고 ready를 기다린 다음, 반환된 브라우저 식별 정보와 함께 전체 solution.headers 객체를 동일한 프록시를 통해 보내세요. 독립형 Kasada는 현재 www.ticketmaster.com의 HTTPS 대상만 지원합니다.
이 페이지의 내용
cURL로 생성, 폴링 및 제출
이 스크립트에는 Bash, cURL 7.76 이상, jq 및 openssl이 필요합니다. SOLVETHREE_API_KEY를 워크스페이스 API 키로, SOLVETHREE_PROXY를 HTTP 또는 HTTPS 프록시 URL로 설정하세요. API 키는 서버 측에 보관하고 셸 추적은 끈 상태로 유지하세요.
이 예제는 전체 과정에서 하나의 프록시를 사용합니다. Kasada 요청에는 type, url과 함께 proxy 또는 proxyCandidates 중 정확히 하나가 필요합니다. site나 action 같은 reCAPTCHA 필드, session 또는 사용자 지정 브라우저 식별 정보 필드를 포함해서는 안 됩니다. Kasada 요청 규약을 참고하세요.
#!/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":"KasadaTask","url":"https://www.ticketmaster.com/","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")
jq -r '.solution.headers | to_entries[] | "\(.key): \(.value)"' "$work/result.json" > "$work/target-headers"
curl --silent --show-error --max-time 30 --proxy "$SOLVETHREE_PROXY" \
--header @"$work/target-headers" --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.태스크 본문과 마지막 cURL 호출 양쪽의 예제 대상 URL을 지원되는 워크플로에서 사용하려는 URL로 바꾸세요. 한 URL에 대해 풀이한 결과를 관련 없는 대상에 제출하지 마세요.
이 스크립트는 Bearer 헤더로 인증하고 태스크 하나를 생성한 뒤 반환된 ID만 폴링합니다. 생성 요청의 타임아웃은 30초이며, 폴링에는 180초의 로컬 제한 시간과 시간 제한이 있는 GET 요청을 사용합니다. 이는 스크립트의 제한이며 풀이 시간을 보장하지 않습니다. 자동 재시도와 리디렉션 따라가기는 모두 활성화되어 있지 않습니다.
전체 헤더 객체 적용
pending과 solving은 폴링을 계속해야 한다는 뜻입니다. 사용 가능한 풀이 결과는 ready에만 포함됩니다. 스크립트는 jq로 원본 solution.headers 객체를 읽고 모든 항목을 헤더 파일의 각 줄로 변환합니다. 단일 헤더만 선택하거나 태스크 ID를 풀이 결과로 취급하지 않습니다.
마지막 요청은 해당 헤더 파일을 불러오고 solution.userAgent와 solution.secChUa를 설정하며 원래 프록시를 사용합니다. 평소 사용하는 브라우저 헤더로 대체하지 말고 이 값들을 함께 유지하세요.
API 응답, 생성된 헤더 및 대상 응답은 출력되지 않고 비공개 임시 디렉터리에 보관됩니다. 일반 로그에 남기지 말고 셸 추적을 활성화하지 마세요.
새로 생성하지 말고 태스크 복구
출력된 복구용 ID를 저장하세요. 스크립트를 다시 실행하면 새 requestId가 생성되므로 복구 시도가 아닙니다. 생성 요청을 복구하려면 저장한 요청 ID를 원래 태스크 입력과 정확히 동일하게 재사용하세요. 스크립트는 종료 시 입력 파일을 삭제하므로 요청을 재구성해야 한다면 해당 입력을 안전하게 보관하세요.
- 태스크 ID가 반환되기 전에 POST 요청 시간이 초과됩니다.
연결 타임아웃이 발생했다고 해서 태스크 생성이 실패한 것은 아닙니다.
다음을 시도해 보세요: 저장한 requestId로 동일한 태스크 요청을 제출하세요. 입력이 동일하면 기존 태스크를 복구하지만, 해당 ID를 재사용하면서 입력을 변경하면 충돌이 발생합니다.
- 로컬 폴링 제한 시간이 만료됩니다.
출력된 태스크 ID로 기존 태스크가 여전히 대기 중이거나 풀이 중인지 확인하세요.
다음을 시도해 보세요: 새로운 유한 제한 시간을 설정해 해당 ID의 GET 폴링을 재개하세요. 로컬 대기가 끝났다는 이유만으로 대체 태스크를 생성하지 마세요.
- API 요청이 성공이 아닌 HTTP 응답을 반환합니다.
API 호출은 --fail-with-body를 사용하므로 스크립트가 성공 페이로드를 읽기 전에 cURL이 종료됩니다.
다음을 시도해 보세요: 진단을 위해 정리 전에 저장된 응답 본문을 비공개로 검사하는 HTTP 오류 핸들러를 추가하세요. 입력을 그대로 무작정 재시도하지 말고 보고된 요청 문제를 수정하세요.
- 작업이 failed 상태가 됩니다.
예제는 일반적인 실패 메시지를 출력하며, 응답에는 errorCode와 error도 포함됩니다.
다음을 시도해 보세요: 정리 전에 실패 분기에서 해당 필드를 검사한 다음 그 태스크의 폴링을 중단하세요. 보고된 원인을 바탕으로 변경할 사항을 결정하세요. 실패한 풀이 비용은 환불됩니다.
출처 및 API 레퍼런스
첫 작업을 실행하세요.
워크스페이스 크레딧 $5로 시작하세요.