פתרון reCAPTCHA Enterprise באמצעות Go

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

התקינו את solvethree.com/sdk וקראו ל־Solve עם שם המארח של היעד, הפעולה והפרוקסי. ה־SDK יוצר את המשימה פעם אחת ומתשאל לקבלת התוצאה. לאחר מכן היישום שלכם שולח את האסימון ליעד.

בדף הזה

התקנה והגדרה של ה־SDK

השתמשו ב־Go 1.22+. במודול ה־Go שלכם, הריצו:

התקנת ה-SDK הרשמי של Go
go get solvethree.com/sdk@v0.1.0
  • הגדירו את SOLVETHREE_API_KEY למפתח ה־API של סביבת העבודה שלכם ואת SOLVETHREE_PROXY לכתובת ה־URL של פרוקסי ה־HTTP(S) שלכם. שמרו את שניהם בתצורת השרת.
  • צרו בסביבת העבודה שלכם פרופיל פעיל עבור שם המארח של היעד. ראו הגדרת פרופיל אתר.
  • החליפו את accounts.example.com ואת login בשם המארח ובפעולה שבהם היעד שלכם משתמש. Site מקבל שם מארח, ללא סכמה או נתיב.

פתרון משימה אחת

שמרו זאת בשם main.go והריצו go run ..

Go · יצירה פעם אחת ותשאול
package main

import (
    "context"
    "fmt"
    "log"
    "os"
    "time"
    solvethree "solvethree.com/sdk"
)

func main() {
    client, err := solvethree.NewClient(os.Getenv("SOLVETHREE_API_KEY"), nil)
    if err != nil { log.Fatal(err) }
    ctx, cancel := context.WithTimeout(context.Background(), 180*time.Second)
    defer cancel()
    input := solvethree.TaskRequest{Site: "accounts.example.com", Action: "login", Proxy: os.Getenv("SOLVETHREE_PROXY")}
    result, err := client.Solve(ctx, input, solvethree.SolveOptions{})
    if err != nil { log.Fatal(err) }
    fmt.Println("Ready task:", result.ID)
    // Submit result.Solution.Token with its browser identity and original proxy.
}

ה־context מגביל את ההמתנה המקומית ל־180 שניות. Solve מחזיר TaskResult מוכן או שגיאה; אין צורך בלולאת תשאול נוספת סביבו. הבקשה הזו משתמשת במצב ברירת המחדל Enterprise v3. עבור v3 רגיל, הגדירו RecaptchaType: "v3". עבור reCAPTCHA, השאירו את Type ואת URL ללא ערך.

שליחת האסימון ליעד שלכם

שלחו את result.Solution.Token בשדה ה־CAPTCHA של היישום. result.ID המודפס מזהה את המשימה; הוא אינו האסימון.

השתמשו ב־result.Solution.UserAgent בתור User-Agent וב־result.Solution.SecChUA בתור sec-ch-ua. נתבו את הבקשה ליעד דרך הפרוקסי שבו הפתרון הצליח, שנבחר באמצעות solvethree.SuccessfulProxy(input, result).

כללו את שאר שדות הטופס של היישום, את קובצי ה־cookie ואת ערך ה־CSRF, ואז בדקו את תגובתו. ה־SDK מחזיר פתרון; הוא אינו שולח עבורכם את הבקשה ליישום.

שמירת המזהים אם ההמתנה נקטעת

ביטול ה־context מפסיק את ההמתנה המקומית, לא את העבודה המרוחקת. *solvethree.Error חושף את RequestID ואת TaskID. אחזרו משימה ידועה באמצעות GetTask; אם לא ברור אם היא נוצרה, שלחו שוב את הקלט המקורי המדויק עם אותו RequestID.

כדי לאפשר שחזור לאחר הפעלות מחדש של התהליך, הקצו ושמרו RequestID עם קלט המשימה לפני יצירתה. *TaskFailedError מציין כשל סופי: בדקו את ה־ErrorCode שלו ואחזרו את המשימה לקבלת טקסט השגיאה. תקנו את הגורם לפני התחלת פתרון נוסף.

חלופה: קריאה ל־REST באמצעות הספרייה הסטנדרטית

אם אתם מעדיפים לשלוט בעצמכם בקריאות ה־HTTP, הגרסה הזו משתמשת ישירות ב־net/http. בחרו בה או בדוגמת ה־SDK שלעיל; הרצת שתיהן יוצרת שתי משימות. מבני התגובה כאן שייכים לדוגמה העצמאית הזו, ולכן שמות השדות שלהם שונים מאלה שבטיפוסים של ה־SDK.

Go 1.22+ · main.go
package main

import (
    "bytes"
    "context"
    "encoding/json"
    "fmt"
    "net/http"
    "net/url"
    "os"
    "time"
)

type Task struct {
    ID string `json:"id"`
    Status string `json:"status"`
    ErrorCode string `json:"errorCode"`
    Error string `json:"error"`
    Solution struct {
        Token string `json:"token"`
        UserAgent string `json:"userAgent"`
        SecChUa string `json:"secChUa"`
    } `json:"solution"`
}

func main() {
    key, proxy := os.Getenv("SOLVETHREE_API_KEY"), os.Getenv("SOLVETHREE_PROXY")
    if key == "" || proxy == "" { panic("Set SOLVETHREE_API_KEY and SOLVETHREE_PROXY") }
    ctx, cancel := context.WithTimeout(context.Background(), 180*time.Second)
    defer cancel()
    client := &http.Client{Timeout: 30*time.Second}
    api := func(method, path string, body []byte) (Task, error) {
        var task Task
        req, err := http.NewRequestWithContext(ctx, method, "https://api.solvethree.com/v1"+path, bytes.NewReader(body))
        if err != nil { return task, err }
        req.Header.Set("Authorization", "Bearer "+key)
        req.Header.Set("Content-Type", "application/json")
        response, err := client.Do(req)
        if err != nil { return task, err }
        defer response.Body.Close()
        if response.StatusCode < 200 || response.StatusCode >= 300 { return task, fmt.Errorf("API HTTP %d", response.StatusCode) }
        err = json.NewDecoder(response.Body).Decode(&task)
        return task, err
    }
    requestID := fmt.Sprintf("go-%d", time.Now().UnixNano())
    body, err := json.Marshal(map[string]string{
        "site":"accounts.example.com", "action":"login", "proxy":proxy, "requestId":requestID,
    })
    if err != nil { panic(err) }
    // Persist requestID and body before creation if this must survive a restart.
    task, err := api(http.MethodPost, "/tasks?waitMs=0", body)
    if err != nil { panic(fmt.Errorf("request %s: %w", requestID, err)) }
    for task.Status == "pending" || task.Status == "solving" {
        task, err = api(http.MethodGet, "/tasks/"+url.PathEscape(task.ID)+"?waitMs=15000", nil)
        if err != nil { panic(err) }
        if task.Status == "pending" || task.Status == "solving" {
            select { case <-ctx.Done(): panic(ctx.Err()); case <-time.After(time.Second): }
        }
    }
    if task.Status != "ready" { panic("Task failed: "+task.ErrorCode+": "+task.Error) }
    solution := task.Solution
    _ = solution // Apply token and returned browser identity using the same proxy.
    fmt.Println("Ready task:", task.ID)
}

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

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

יצירת סביבת עבודה
פתרון reCAPTCHA Enterprise באמצעות Go · solvethree