GoでKasadaヘッダーを生成・適用する

著者:solvethree読了時間:1分

KasadaTask を作成し、返されたヘッダー一式とブラウザー識別情報を、成功したプロキシ経由で送信します。公式 Go SDK が解決結果を生成し、net/http クライアントが対象サイトへのリクエストを行います。ローカルのブラウザーやプラグインは不要です。

このページの内容

Go のサンプルを設定して実行する

Go 1.22 以降を使用し、公式モジュール solvethree.com/[email protected] をインストールしてください。インストール方法は Go 連携ドキュメントで説明しています。

スタンドアロンの Kasada は現在、ホスト名が正確に www.ticketmaster.com である HTTPS の対象 URL に対応しています。この例ではそのホームページをリクエストします。input.URL を、この対応ホスト上の目的の URL に変更してください。

  • SOLVETHREE_API_KEY にワークスペースの API キーを設定してください。キーはサーバー側に保持してください。
  • SOLVETHREE_PROXY に、パス、クエリ、フラグメントを含まない HTTP または HTTPS プロキシ URL を設定してください。この例ではプロキシを 1 つ使用します。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 に自動送信するのではなく、リダイレクトレスポンスを返します。

成功と判断する前にアプリケーションのレスポンスを確認する

「ready 状態のタスク」は、解決結果が生成されたことを意味し、Ticketmaster がそれを受け入れたことを意味するわけではありません。この例ではアプリケーションの HTTP ステータスを出力しますが、レスポンスの解釈は利用側で行います。成功を記録する前に、レスポンス本文と、アプリケーションが期待していた結果を確認してください。

タスクは ready だが、対象サイトがリクエストを拒否する。

送信するリクエストを確認してください。URL、返されたすべてのヘッダー、User-Agent、sec-ch-ua、SuccessfulProxy が選択したプロキシを確認します。

試してみましょう: 別の解決処理を要求する前に、不一致を修正してください。ready 状態の解決結果があっても、その後の送信先で受け入れられる保証はありません。

対象サイトへのリクエストを実行する前に Solve がエラーを返す。

API の HTTP エラーと、終端状態となったタスクの失敗を区別してください。失敗したタスクには errorCode と error が含まれます。

試してみましょう: 無効な入力を変えずに再試行するのではなく、これらの詳細を使ってリクエストを修正してください。Solve を手動ポーリングに置き換える場合は、タスクが失敗した時点でポーリングを停止してください。

タスクの作成中や解決中の失敗については、API エラー処理を参照してください。

最初のタスクを実行しましょう。

$5のワークスペースクレジットで始められます。

ワークスペースを作成
GoでKasadaヘッダーを生成・適用する · solvethree