使用 Go 生成并应用 Kasada 请求头

作者:solvethree阅读需 1 分钟

创建 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,请应用 result.Solution.Headers,而不是 Solution.Token。循环会复制返回的每一个请求头。前面的赋值还会应用返回的 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