קריאה ל-API של CAPTCHA מתוך PowerShell

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

השתמשו ב-PowerShell 7.5+ וב-Invoke-RestMethod כדי לקרוא ישירות ל-solvethree. הסקריפט הבא יוצר משימת reCAPTCHA Enterprise אחת ומתשאל את אותו מזהה משימה עד שהיא מסתיימת או שמסגרת זמן ההמתנה המקומית מסתיימת.

בדף הזה

הגדירו את פרטי האימות ואת קלטי היעד

  1. 1.

    הפכו את האתר לזמין לסביבת העבודה שלכם

    הגדירו במסוף פרופיל פעיל לשם מארח היעד. שליחת שם מארח ופעולה אינה יוצרת פרופיל. ראו הגדרת פרופיל אתר אם הדבר טרם נעשה.

  2. 2.

    ספקו את משתני הסביבה

    הגדירו את SOLVETHREE_API_KEY ואת SOLVETHREE_PROXY בסביבה של תהליך PowerShell באמצעות מנגנון הטיפול הרגיל שלכם בסודות. ודאו שלשניהם יש ערכים לפני ההרצה. מפתח ה-API משמש בכותרת Bearer; הוא לא שייך ל-JSON של המשימה.

  3. 3.

    החליפו את שם המארח והפעולה שבדוגמה

    החליפו את accounts.example.com ואת login בשם המארח ובפעולה הנדרשים לאינטגרציה שלכם. השתמשו בשם מארח, לא בכתובת URL מלאה. ברירת המחדל של הבקשה היא Enterprise v3, ולכן אין צורך בשדה type או url.

צרו פעם אחת, ואז תשאלו לפי מזהה המשימה

PowerShell · יצירה פעם אחת ושמירת מזהה השחזור
#requires -Version 7.5
$ErrorActionPreference = 'Stop'
$apiBase = 'https://api.solvethree.com/v1'
$headers = @{ Authorization = "Bearer $env:SOLVETHREE_API_KEY"; Accept = 'application/json' }
$taskInput = @{ site = 'accounts.example.com'; action = 'login'; proxy = $env:SOLVETHREE_PROXY; requestId = [guid]::NewGuid().ToString() }
$requestClock = [Diagnostics.Stopwatch]::StartNew()
function Call-TaskApi($Method, $Path, $Payload = $null) {
    $remaining = 180 - $requestClock.Elapsed.TotalSeconds
    if ($remaining -le 0) { throw 'Local deadline reached' }
    $seconds = [int][Math]::Ceiling([Math]::Min(25, $remaining))
    $options = @{ Method = $Method; Uri = "$apiBase$Path"; Headers = $headers;
        ConnectionTimeoutSeconds = $seconds; OperationTimeoutSeconds = $seconds;
        MaximumRetryCount = 0; MaximumRedirection = 0 }
    if ($null -ne $Payload) { $options.Body = $Payload | ConvertTo-Json -Depth 6; $options.ContentType = 'application/json' }
    Invoke-RestMethod @options
}
$taskId = $null
try {
    $result = Call-TaskApi 'POST' '/tasks?waitMs=0' $taskInput
    $taskId = $result.id
    while ($result.status -in @('pending', 'solving')) {
        $escapedId = [uri]::EscapeDataString($taskId)
        $result = Call-TaskApi 'GET' "/tasks/$escapedId`?waitMs=15000"
        if ($result.status -in @('pending', 'solving')) { Start-Sleep -Seconds 1 }
    }
    if ($result.status -ne 'ready') { throw "Task failed: $($result.errorCode)" }
    Write-Host "Ready task: $taskId"
    # Submit $result.solution.token with userAgent/secChUa and the original proxy.
} catch {
    Write-Host "Recovery requestId=$($taskInput.requestId) taskId=$taskId"
    throw
}

הסקריפט שולח בקשת POST אחת אל /v1/tasks?waitMs=0. הבקשות הבאות הן בקשות GET עבור המזהה שהוחזר, עם waitMs=15000. הסטטוסים pending ו-solving משאירים את הלולאה פעילה; כל סטטוס אחר מסיים אותה.

ConvertTo-Json מבצע סריאליזציה של טבלת הגיבוב של המשימה, במקום להסתמך על JSON עם מירכאות שהוזנו ידנית או על פקודת מעטפת. מזהה המשימה מקודד לשימוש ב-URL לפני התשאול. שמרו על החלקים האלה כשאתם מתאימים את הדוגמה.

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

MaximumRetryCount = 0 משבית ניסיונות HTTP חוזרים אוטומטיים, ו-MaximumRedirection = 0 מסרב להפניות. פרמטרי הזמן הקצוב שמשמשים כאן דורשים PowerShell 7.5+, ולא כל התקנה של PowerShell 7 תתאים. הפרמטרים האלה מתועדים בתיעוד Invoke-RestMethod של Microsoft.

השתמשו בטוקן, לא במזהה המשימה

בסטטוס ready, ערך ה-reCAPTCHA שיש לשלוח הוא $result.solution.token. המשתנה $taskId רק מזהה את המשימה ב-solvethree. הדוגמה נעצרת לפני שליחת בקשת האפליקציה ליעד שלכם.

שלחו את הטוקן עם userAgent ו-secChUa של הפתרון שהוחזר, באמצעות הפרוקסי המקורי. אל תחליפו אותם בזהות דפדפן לא קשורה ואל תשלחו אותו ליעד אחר. ready מציין ש-solvethree יצר פתרון; הוא לא מוכיח שהיעד קיבל את בקשת האפליקציה שלכם.

Invoke-RestMethod זורק חריגת HTTP או חיבור

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

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

המשימה מחזירה failed

בדקו גם את $result.errorCode וגם את $result.error. החריגה שהסקריפט זורק כשמשימה מסתיימת כוללת רק את קוד השגיאה.

כדאי לנסות: הפסיקו לתשאל את המשימה הזו וטפלו בגורם שדווח. לדוגמה, site-unreachable היא שגיאת משימה, ולא הוכחה לכך שבקשת ה-API עצמה נכשלה. ראו שגיאות ב-CAPTCHA API.

שחזרו בקשה שתוצאתה אינה ודאית בלי ליצור משימה נוספת

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

  1. 1.

    אם יש לכם מזהה משימה, אחזרו את המשימה הזו

    המשיכו עם GET אל /v1/tasks/:id במקום ליצור משימה נוספת. הגעה למגבלת הזמן המקומית של הסקריפט לא מוכיחה שהמשימה המרוחקת נכשלה.

  2. 2.

    אם היצירה לא החזירה מזהה משימה, השתמשו שוב בבקשה המקורית

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

  3. 3.

    אל תפעילו מחדש את הסקריפט הזה כהליך שחזור

    הרצה חדשה מייצרת GUID חדש, ולכן גם בקשה לוגית חדשה. לשימוש ללא השגחה, שמרו באופן מאובטח את requestId המקורי ואת נתוני הקלט למשימה לפני ה-POST, ואז שמרו את מזהה המשימה כשהוא מתקבל. הדוגמה מדפיסה מזהים לשחזור במקרה של כשל, אך לא שומרת אותם לשימוש לאחר אובדן התהליך.

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

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

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

יצירת סביבת עבודה
קריאה ל-API של CAPTCHA מתוך PowerShell · solvethree