GoでKasadaヘッダーを生成・適用する
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、セッション、独自のブラウザー識別情報のフィールドを追加しないでください。
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 エラー処理を参照してください。
参照元とAPIリファレンス
最初のタスクを実行しましょう。
$5のワークスペースクレジットで始められます。