Генерация и применение заголовков Kasada с помощью Go

Автор: solvethree3 мин на чтение

Создайте KasadaTask, затем отправьте полный набор возвращённых заголовков и идентификационные данные браузера через успешный прокси. Официальный Go SDK генерирует решение; ваш клиент net/http выполняет запрос к целевому сайту. Локальный браузер или плагин не требуется.

На этой странице

Настройте и запустите пример на Go

Используйте Go 1.22 или новее и установите официальный модуль solvethree.com/[email protected]. Установка описана в документации по интеграции с Go.

Отдельный режим Kasada сейчас поддерживает HTTPS-адреса только с точным именем хоста www.ticketmaster.com. Пример запрашивает его главную страницу; замените input.URL на нужный URL на этом поддерживаемом хосте.

  • Задайте в SOLVETHREE_API_KEY API-ключ вашего рабочего пространства. Храните его на сервере.
  • Задайте в SOLVETHREE_PROXY URL HTTP- или HTTPS-прокси без пути, строки запроса и фрагмента. В этом примере используется один прокси; не указывайте дополнительно 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 возвращает ошибку до выполнения запроса к целевому сайту.

Различайте HTTP-ошибку API и окончательное завершение задачи с ошибкой. Задача, завершившаяся с ошибкой, содержит errorCode и error.

Попробуйте: Используйте эти сведения, чтобы исправить запрос, а не повторять попытки с неизменёнными некорректными входными данными. Если вы замените Solve ручным опросом, прекращайте опрос при завершении задачи с ошибкой.

Сведения об ошибках при создании или решении задачи см. в разделе Обработка ошибок API.

Запустите первую задачу.

Начните с $5 на балансе рабочего пространства.

Создать рабочее пространство
Генерация и применение заголовков Kasada с помощью Go · solvethree