Go HTTP 프록시를 통해 CAPTCHA 토큰 제출하기

작성: solvethree읽는 데 3분

대상 웹사이트에는 solvethree.SuccessfulProxy가 선택한 프록시로 구성한 별도의 Go HTTP 클라이언트를 사용하세요. 반환된 브라우저 식별 정보로 Solution.Token을 제출하세요. 이 대상용 트랜스포트는 SDK 클라이언트의 solvethree API 트랜스포트와 분리하세요.

이 페이지의 내용

태스크 준비

  1. 1.

    Go SDK 및 인증 정보 설정

    Go 1.22 이상에서 공식 solvethree.com/sdk 모듈 버전 v0.1.0을 사용하세요. 설정 방법은 Go 연동 참조 문서에 있습니다. SOLVETHREE_API_KEY를 워크스페이스 API 키로 설정하고 서버에만 보관하세요. SOLVETHREE_PROXY를 HTTP 또는 HTTPS 프록시 URL로 설정하세요.

  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를 복제하고 http.ProxyURL을 통해 복제본의 Proxy를 설정합니다. 별도의 targetClient만 이 트랜스포트를 사용하며, SDK 클라이언트의 API 트랜스포트는 변경되지 않습니다.

프록시 인증 정보는 URL의 사용자 정보 구성 요소에 유지하세요. url.Parse는 프록시 트랜스포트에서 사용할 수 있도록 이를 보존합니다. URL을 수동으로 분리하거나 프록시 인증 정보를 대상의 Authorization 헤더로 보내지 말고, 사용자 이름이나 비밀번호의 예약 문자를 퍼센트 인코딩하세요.

현재 프록시를 하나만 제공하더라도 원래 태스크 입력값을 보관하고 SuccessfulProxy를 사용하세요. ProxyCandidates를 사용할 때 성공한 후보는 원래 목록에서 1부터 시작하는 인덱스인 Solution.EgressAttempts로 식별됩니다. 이 헬퍼를 사용하면 어떤 후보가 성공했는지 추측할 필요가 없습니다. false를 반환하면 중단하세요. 후보 목록에는 경로, 쿼리, 프래그먼트가 없는 서로 다른 HTTP 또는 HTTPS 프록시 URL을 최대 12개까지 지정할 수 있습니다.

대상의 헤더, 폼 필드, 세션 포함

이 예제는 url.Values를 사용하여 Solution.Token을 g-recaptcha-response 필드에 폼 인코딩하고, 이에 맞는 콘텐츠 유형을 설정합니다. 애플리케이션이 다른 필드 이름을 요구하면 해당 이름으로 바꾸세요. 로그인 입력값과 세션에 바인딩된 CSRF 방지 값 등 엔드포인트에 필요한 다른 필드도 추가하세요. CAPTCHA 토큰만으로는 완전한 로그인 요청이 되지 않습니다.

예제처럼 반환된 UserAgent와 SecChUA를 사용하세요. 솔루션의 Headers에도 항목이 제공되면 해당 헤더를 대상 요청에도 적용하세요. 이 예제는 해당 컬렉션을 복사하지 않습니다. 브라우저 식별 정보를 일관되게 유지하고 전송하는 본문에 맞는 콘텐츠 유형을 사용하세요.

이 예제에는 쿠키 저장소가 없습니다. 대상에 세션이 필요하면 net/http/cookiejar로 쿠키 저장소를 생성하고, 대상 흐름을 시작하기 전에 targetClient.Jar에 연결한 다음, 페이지 요청과 폼 제출에 해당 클라이언트를 재사용하세요. 세션 전체에서 동일한 성공 프록시를 사용하세요. solvethree API 클라이언트는 대상의 세션 클라이언트가 아닙니다.

솔루션에 접근하기 전에 풀이 오류를 확인하세요. 준비 완료 상태의 작업에만 사용 가능한 솔루션이 있습니다. 실패한 작업의 errorCode와 error는 실패 원인을 설명합니다. 대상 요청에서는 Do의 오류를 처리한 다음, 응답 본문을 해석하기 전에 HTTP 상태를 확인하세요. Do가 오류 없이 응답을 반환하면 성공이 아닌 HTTP 응답을 포함해 항상 response.Body를 닫으세요.

이 예제는 자동 리디렉션을 비활성화하고 애플리케이션 상태를 출력합니다. 애플리케이션이 제출을 수락했는지 판단하려면 응답 본문과 예상되는 리디렉션을 확인하세요. 작업이 준비 완료 상태이거나 HTTP 상태가 성공이라는 사실만으로는 수락 여부를 알 수 없습니다.

첫 작업을 실행하세요.

워크스페이스 크레딧 $5로 시작하세요.

워크스페이스 만들기
Go HTTP 프록시를 통해 CAPTCHA 토큰 제출하기 · solvethree