יצירת כותרות Kasada באמצעות cURL

מאת solvethree3 דקות קריאה

צרו KasadaTask, המתינו ל-ready, ואז שלחו את אובייקט solution.headers במלואו עם זהות הדפדפן שהוחזרה דרך אותו פרוקסי. Kasada עצמאי תומך כעת ביעדי HTTPS ב-www.ticketmaster.com.

בדף הזה

יצירה, תשאול ושליחה באמצעות cURL

הסקריפט דורש Bash,‏ cURL 7.76 ואילך, jq ו-openssl. הגדירו את SOLVETHREE_API_KEY כמפתח ה-API של סביבת העבודה ואת SOLVETHREE_PROXY ככתובת פרוקסי ה-HTTP או ה-HTTPS שלכם. שמרו את מפתח ה-API בצד השרת והשאירו את מעקב פקודות המעטפת כבוי.

הדוגמה הזאת משתמשת בפרוקסי אחד לאורך כל התהליך. בקשת Kasada דורשת type,‏ url ובדיוק אחד מבין proxy או proxyCandidates; אסור לכלול בה שדות reCAPTCHA כגון site או action,‏ session או שדות מותאמים אישית של זהות דפדפן. ראו מפרט בקשת Kasada.

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 הסופית, בכתובת המיועדת לתהליך הנתמך. אל תפתרו עבור כתובת אחת ותשלחו את התוצאה ליעד לא קשור.

הסקריפט מבצע אימות באמצעות כותרת Bearer, יוצר משימה אחת ומתשאל רק את המזהה שהוחזר עבורה. לבקשת היצירה יש זמן המתנה מרבי של 30 שניות; התשאול משתמש במגבלת זמן מקומית של 180 שניות ובבקשות GET מוגבלות בזמן. אלה מגבלות של הסקריפט, לא התחייבויות לזמן הפתרון. ניסיונות חוזרים אוטומטיים ומעקב אחר הפניות אינם מופעלים.

החלת אובייקט הכותרות במלואו

pending ו-solving מציינים שיש להמשיך בתשאול. רק ready מכיל פתרון שמיש. הסקריפט קורא את אובייקט solution.headers הגולמי באמצעות jq וממיר כל רשומה לשורה בקובץ כותרות; הוא אינו בוחר כותרת יחידה ואינו מתייחס למזהה המשימה כאל הפתרון.

הבקשה הסופית טוענת את קובץ הכותרות הזה, מגדירה את solution.userAgent ואת solution.secChUa ומשתמשת בפרוקסי המקורי. השתמשו בערכים האלה יחד במקום להחליף אותם בכותרות הדפדפן הרגילות שלכם.

תגובות ה-API, הכותרות שנוצרו ותגובת היעד נשארות בתיקייה זמנית פרטית במקום להיות מודפסות. אל תכללו אותן ביומנים שגרתיים ואל תפעילו מעקב פקודות מעטפת.

שחזור המשימה במקום יצירת משימה נוספת

שמרו את מזהי השחזור שהודפסו. הרצה חוזרת של הסקריפט יוצרת requestId חדש; היא אינה ניסיון שחזור. כדי לשחזר את היצירה, השתמשו שוב במזהה הבקשה השמור עם אותם נתוני קלט מקוריים בדיוק של המשימה. הסקריפט מוחק את קובץ הקלט שלו ביציאה, לכן שמרו את נתוני הקלט האלה באופן מאובטח אם תצטרכו להרכיב מחדש את הבקשה.

בקשת ה-POST חורגת מזמן ההמתנה לפני שמוחזר מזהה משימה.

חריגה מזמן ההמתנה לחיבור אינה מוכיחה שיצירת המשימה נכשלה.

כדאי לנסות: שלחו את אותה בקשת משימה עם requestId השמור. נתוני קלט זהים משחזרים את המשימה הקיימת; שינוי נתוני הקלט תוך שימוש חוזר במזהה הזה גורם להתנגשות.

מגבלת הזמן המקומית לתשאול פגה.

השתמשו במזהה המשימה שהודפס כדי לבדוק אם המשימה הקיימת עדיין ממתינה או נמצאת בתהליך פתרון.

כדאי לנסות: חדשו את תשאול ה-GET עבור המזהה הזה עם מגבלת זמן סופית נוספת. אל תיצרו משימה חלופית רק משום שההמתנה המקומית הסתיימה.

בקשת API מחזירה תגובת HTTP שאינה מציינת הצלחה.

קריאות ה-API משתמשות ב---fail-with-body, ולכן cURL יוצא לפני שהסקריפט קורא תוכן תגובה של הצלחה.

כדאי לנסות: לצורכי אבחון, הוסיפו טיפול בשגיאות HTTP שבודק באופן פרטי את גוף התגובה השמור לפני הניקוי. תקנו את הבעיה שדווחה בבקשה במקום לנסות שוב באופן עיוור עם קלט ללא שינוי.

המשימה מגיעה לסטטוס failed.

הדוגמה מדפיסה הודעת כשל כללית; התגובה מכילה גם errorCode ו-error.

כדאי לנסות: בדקו את השדות האלה בענף הטיפול בכשל לפני הניקוי, ואז הפסיקו לתשאל את המשימה הזאת. השתמשו בסיבה שדווחה כדי להחליט מה לשנות. על פתרונות שנכשלו ניתן החזר כספי.

הפעלת המשימה הראשונה שלך.

התחילו עם $5 בקרדיט לסביבת העבודה.

יצירת סביבת עבודה
יצירת כותרות Kasada באמצעות cURL · solvethree