Go로 Kasada 헤더 생성 및 적용하기

작성: solvethree읽는 데 2분

KasadaTask를 생성한 다음, 반환된 전체 헤더 세트와 브라우저 식별 정보를 성공한 프록시를 통해 전송하세요. 공식 Go SDK는 해결 결과를 생성하고, net/http 클라이언트는 대상 요청을 수행합니다. 로컬 브라우저나 플러그인은 필요하지 않습니다.

이 페이지의 내용

Go 예제 구성 및 실행하기

Go 1.22 이상을 사용하고 공식 모듈 solvethree.com/[email protected]을 설치하세요. 설치 방법은 Go 연동 문서를 참고하세요.

독립형 Kasada는 현재 호스트 이름이 정확히 www.ticketmaster.com인 HTTPS 대상만 지원합니다. 이 예제는 해당 홈페이지를 요청합니다. input.URL을 지원되는 해당 호스트에서 원하는 URL로 변경하세요.

  • SOLVETHREE_API_KEY를 워크스페이스 API 키로 설정하세요. 키는 서버에 보관하세요.
  • SOLVETHREE_PROXY를 경로, 쿼리, 프래그먼트가 없는 HTTP 또는 HTTPS 프록시 URL로 설정하세요. 이 예제는 프록시 하나를 사용합니다. ProxyCandidates를 함께 제공하지 마세요.
  • Type을 KasadaTask로 유지하세요. Site, Action, RecaptchaType, 세션 또는 사용자 지정 브라우저 식별 정보 필드를 추가하지 마세요.
Go · 전체 Kasada 헤더 세트 적용
package main

import (
    "context"
    "fmt"
    "log"
    "os"
    "net/http"
    "net/url"
    "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{Type: "KasadaTask", URL: "https://www.ticketmaster.com/", 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, "GET", input.URL, nil)
    if err != nil { log.Fatal(err) }

    request.Header.Set("User-Agent", result.Solution.UserAgent)
    request.Header.Set("sec-ch-ua", result.Solution.SecChUA)
    for name, value := range result.Solution.Headers { request.Header.Set(name, value) }

    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.

}

헤더, 브라우저 식별 정보, 프록시를 함께 유지하기

Kasada의 경우 Solution.Token이 아닌 result.Solution.Headers를 적용하세요. 반복문은 반환된 모든 헤더를 복사합니다. 그 앞의 할당문은 반환된 UserAgent와 SecChUA도 적용합니다. 이를 자신의 브라우저 값으로 교체하지 마세요.

SuccessfulProxy(input, result)는 성공한 프록시를 식별하고, http.ProxyURL은 해당 프록시를 통해 대상 요청을 라우팅합니다. 제출 시 다른 프록시를 선택하지 말고 이 결과를 사용하세요. 나중에 작업을 프록시 후보 방식으로 전환하는 경우에도 중요합니다.

대상 요청은 input.URL을 사용하므로 해결과 제출이 동일한 URL을 대상으로 합니다. 리디렉션 자동 이동은 비활성화되어 있습니다. 클라이언트는 생성된 헤더를 다른 URL로 자동 전송하는 대신 리디렉션 응답을 반환합니다.

성공으로 판단하기 전에 애플리케이션 응답 확인하기

“준비 완료 상태의 작업”은 해결 결과가 생성되었다는 뜻이지, Ticketmaster가 이를 수락했다는 뜻은 아닙니다. 이 예제는 애플리케이션 HTTP 상태를 출력하지만 응답 해석은 직접 해야 합니다. 성공으로 기록하기 전에 응답 본문과 애플리케이션에서 기대한 결과를 확인하세요.

작업이 준비 완료 상태이지만 대상이 요청을 거부합니다.

전송되는 요청의 URL, 반환된 모든 헤더, User-Agent, sec-ch-ua, SuccessfulProxy가 선택한 프록시를 확인하세요.

다음을 시도해 보세요: 다른 해결 요청을 보내기 전에 불일치를 수정하세요. 준비 완료된 해결 결과가 후속 요청의 수락을 보장하지는 않습니다.

대상 요청이 실행되기 전에 Solve가 오류를 반환합니다.

API HTTP 오류와 최종 상태인 작업 실패를 구분하세요. 실패한 작업에는 errorCode와 error가 포함됩니다.

다음을 시도해 보세요: 잘못된 입력을 그대로 재시도하지 말고 해당 세부 정보를 사용해 요청을 수정하세요. Solve 대신 수동 폴링을 사용한다면 작업 실패 시 폴링을 중단하세요.

작업 생성 또는 해결 중 발생하는 실패는 API 오류 처리를 참고하세요.

첫 작업을 실행하세요.

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

워크스페이스 만들기
Go로 Kasada 헤더 생성 및 적용하기 · solvethree