שליחת טוקן CAPTCHA דרך פרוקסי HTTP ב-Go

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

השתמשו בלקוח HTTP נפרד ב-Go עבור אתר היעד, המוגדר עם הפרוקסי שנבחר על ידי solvethree.SuccessfulProxy. שלחו את Solution.Token עם זהות הדפדפן שהוחזרה. השאירו את התעבורה הזו ליעד נפרדת מתעבורת ה-API של solvethree בלקוח ה-SDK.

בדף הזה

הכנת המשימה

  1. 1.

    הגדרת Go SDK ופרטי הגישה

    השתמשו במודול הרשמי solvethree.com/sdk, בגרסה v0.1.0, עם Go 1.22 ומעלה. פרטי ההגדרה מופיעים בתיעוד האינטגרציה עם Go. הגדירו את SOLVETHREE_API_KEY למפתח ה-API של סביבת העבודה שלכם ושמרו אותו בשרת. הגדירו את SOLVETHREE_PROXY לכתובת ה-URL של פרוקסי ה-HTTP או ה-HTTPS שלכם.

  2. 2.

    הגדרת האתר לפני הפתרון

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

  3. 3.

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

    שנו את accounts.example.com, את הפעולה login ואת נקודת הקצה של היישום כך שיתאימו לאינטגרציה שלכם. Site הוא שם מארח, לא כתובת URL מלאה. עבור reCAPTCHA, ספקו בדיוק אחד מבין Proxy או ProxyCandidates; אל תמלאו את השדות Type או URL של המשימה. סוג ה-reCAPTCHA המוגדר כברירת מחדל הוא Enterprise v3.

שליחה דרך הפרוקסי שפתר את המשימה

Go · שליחה דרך הפרוקסי שהצליח
package main

import (
    "context"
    "fmt"
    "log"
    "os"
    "net/http"
    "net/url"
    "strings"
    "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)

    proxy, ok := solvethree.SuccessfulProxy(input, result)
    if !ok { log.Fatal("No valid successful proxy") }
    proxyURL, err := url.Parse(proxy)
    if err != nil { log.Fatal(err) }
    transport := http.DefaultTransport.(*http.Transport).Clone()
    transport.Proxy = http.ProxyURL(proxyURL)
    defer transport.CloseIdleConnections()
    targetClient := &http.Client{Transport: transport, Timeout: 30*time.Second,
        CheckRedirect: func(*http.Request, []*http.Request) error { return http.ErrUseLastResponse }}
    request, err := http.NewRequestWithContext(ctx, "POST", "https://accounts.example.com/login",
        strings.NewReader(url.Values{"g-recaptcha-response": {result.Solution.Token}}.Encode()))
    if err != nil { log.Fatal(err) }

    request.Header.Set("User-Agent", result.Solution.UserAgent)
    request.Header.Set("sec-ch-ua", result.Solution.SecChUA)
    request.Header.Set("Content-Type", "application/x-www-form-urlencoded")

    response, err := targetClient.Do(request)
    if err != nil { log.Fatal(err) }
    defer response.Body.Close()
    fmt.Println("Application HTTP status:", response.StatusCode)
    // Inspect the application response to determine whether submission succeeded.

}

ה-SDK פותר את המשימה אך אינו שולח דבר לאתר. לאחר הפתרון, הדוגמה משכפלת את http.DefaultTransport ומגדירה את Proxy של העותק באמצעות http.ProxyURL. רק ה-targetClient הנפרד משתמש בתעבורה הזו; תעבורת ה-API של לקוח ה-SDK אינה משתנה.

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

שמרו את קלט המשימה המקורי והשתמשו ב-SuccessfulProxy גם אם אתם מספקים כרגע רק פרוקסי אחד. עם ProxyCandidates, המועמד שהצליח מזוהה באמצעות Solution.EgressAttempts, אינדקס שמתחיל ב-1 ברשימה המקורית. פונקציית העזר חוסכת ניחוש לגבי המועמד שהצליח; עצרו אם היא מחזירה false. רשימות מועמדים מקבלות לכל היותר שתים עשרה כתובות URL שונות של פרוקסי HTTP או HTTPS, ללא נתיב, שאילתה או מקטע.

כללו את הכותרות, שדות הטופס והסשן של היעד

הדוגמה משתמשת ב-url.Values כדי לקודד את Solution.Token כנתוני טופס תחת g-recaptcha-response, ומגדירה את סוג התוכן המתאים. החליפו את שם השדה אם היישום שלכם מצפה לשם אחר. הוסיפו את השדות האחרים שנקודת הקצה דורשת, כגון פרטי התחברות וכל ערך נגד CSRF הקשור לסשן; טוקן CAPTCHA אינו בקשת התחברות מלאה.

השתמשו ב-UserAgent וב-SecChUA שהוחזרו, כפי שעושה הדוגמה. אם הפתרון מספק גם רשומות ב-Headers, החילו גם את הכותרות שהוחזרו על הבקשה ליעד — הדוגמה אינה מעתיקה את האוסף הזה. שמרו על זהות דפדפן עקבית ועל סוג תוכן שמתאים לגוף הבקשה שאתם שולחים.

בדוגמה אין מאגר עוגיות. אם היעד דורש סשן, צרו מאגר באמצעות net/http/cookiejar, שייכו אותו ל-targetClient.Jar לפני תחילת התהליך מול היעד, והשתמשו שוב באותו לקוח לבקשת הדף ולשליחת הטופס. השתמשו באותו פרוקסי שהצליח לאורך כל הסשן. לקוח ה-API של solvethree אינו לקוח הסשן של היעד.

בדקו את שגיאת הפתרון לפני הגישה לפתרון עצמו. רק למשימה מוכנה יש פתרון שמיש; השדות errorCode ו-error של משימה שנכשלה מסבירים את הכשל. בבקשה ליעד, טפלו בשגיאה מ-Do, ואז בדקו את סטטוס ה-HTTP לפני פירוש גוף התגובה. סגרו את response.Body בכל פעם ש-Do מחזיר תגובה ללא שגיאה, גם בתגובות HTTP שאינן מציינות הצלחה.

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

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

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

יצירת סביבת עבודה
שליחת טוקן CAPTCHA דרך פרוקסי HTTP ב-Go · solvethree