Surf — HTTP-клиент для Go, который умеет притворяться браузером

11 May, 2026

Surf logo

Знаете ли вы, что более 40% сайтов сегодня используют антибот-системы, блокирующие стандартные HTTP-запросы? Особенно остро эта проблема стоит при веб-скрапинге и автоматизации. Именно для таких случаев создан Surf — не просто HTTP-клиент, а настоящий мастер перевоплощения в Go-экосистеме.

Что такое Surf?

Surf — это продвинутый HTTP-клиент для Go, который сочетает мощь стандартной библиотеки net/http с функциями для обхода антибот-защит. Его главная фишка — точная эмуляция поведения реальных браузеров, включая Chrome и Firefox, с поддержкой современных протоколов HTTP/2 и HTTP/3.

Кому пригодится Surf?

  • Разработчикам, работающим с API с жесткими требованиями к заголовкам
  • Специалистам по веб-скрапингу, уставшим от капч и блокировок
  • QA-инженерам, тестирующим поведение серверов при разных клиентах
  • Всем, кому нужно делать HTTP-запросы «как из браузера»

5 причин попробовать Surf

1. Полноценная эмуляция браузеров

Surf умеет не просто подменять User-Agent, а полностью имитировать поведение Chrome (вплоть до версии 142) и Firefox (до v144). Это включает:

// Эмуляция Chrome на Windows
client := surf.NewClient().
    Builder().
    Impersonate().Chrome().Windows().
    Build()

// Или случайный браузер и ОС
client := surf.NewClient().
    Builder().
    Impersonate().RandomOS().FireFox().
    Build()

2. Поддержка HTTP/3 и QUIC

Одно из немногих Go-решений с полной поддержкой HTTP/3 и настройкой QUIC-фингерпринтов:

Реклама
client := surf.NewClient().
    Builder().
    HTTP3(). // Автоматически определяет настройки для Chrome
    Build()

3. Гибкая система middleware

Можно легко добавлять свою логику на разных этапах запроса:

client := surf.NewClient().
    Builder().
    With(func(req *surf.Request) error {
        // Логируем все запросы
        fmt.Printf("Making request to %s", req.URL)
        return nil
    }).
    Build()

4. Совместимость со стандартной библиотекой

Surf-клиент можно конвертировать в стандартный *http.Client для работы с другими библиотеками:

stdClient := surfClient.Std()
resp, err := stdClient.Get("https://api.example.com")

5. Встроенные механизмы обхода блокировок

  • Ротация TLS-отпечатков (JA3/JA4)
  • Точный порядок заголовков как в реальных браузерах
  • Поддержка SOCKS5 прокси (включая UDP для HTTP/3)

Как это работает под капотом?

Surf построен на трех основных компонентах:

  1. uTLS — кастомная реализация TLS для эмуляции отпечатков
  2. uQUIC — реализация QUIC с поддержкой HTTP/3
  3. enetx/g — набор generic-утилит для работы с типами

Архитектура модульная — можно подключать только нужные функции, сохраняя минимальный размер зависимостей.

Практические кейсы использования

Веб-скрапинг сложных сайтов

С Surf можно обходить даже такие защиты как:

  • Cloudflare антибот
  • Akamai Bot Manager
  • PerimeterX

Достаточно правильно сконфигурировать клиента:

client := surf.NewClient().
    Builder().
    Impersonate().Chrome().Windows().
    JA().Chrome142(). // Точный TLS-отпечаток
    HTTP3Settings().Chrome().Set(). // QUIC-отпечаток
    Build()

Тестирование API

Идеально подходит для проверки:

  • Корректности обработки заголовков
  • Поддержки HTTP/2/3 сервером
  • Поведения при разных User-Agent
// Проверка поддержки HTTP/3
resp := client.Get("https://api.example.com").Do()
if resp.IsOk() && resp.Ok().Proto == "HTTP/3.0" {
    fmt.Println("Сервер поддерживает HTTP/3!")
}

Автоматизация браузерных действий

Можно эмулировать:

  • Логины на сайтах
  • Отправку форм
  • Работу с cookies и сессиями
// Логин с сохранением сессии
client := surf.NewClient().
    Builder().
    Session(). // Включаем cookies
    Build()

// Отправляем учетные данные
client.Post("https://site.com/login", map[string]string{
    "username": "test",
    "password": "secret",
}).Do()

// Теперь сессия сохранена
resp := client.Get("https://site.com/dashboard").Do()

Установка

Проще некуда:

go get -u github.com/enetx/surf

Требуется Go 1.24+.

Вывод: стоит ли пробовать?

Surf — это Swiss Army Knife среди HTTP-клиентов в Go. Если вам нужно:

✔ Работать с «капризными» API ✔ Парсить сайты с антибот-защитой ✔ Тестировать поведение серверов при разных клиентах ✔ Использовать современные протоколы HTTP/2 и HTTP/3

— то Surf определенно заслуживает места в вашем инструментарии. Проект активно развивается, имеет хорошую документацию и покрытие тестами.

Для простых запросов стандартной библиотеки может быть достаточно, но когда нужны «тяжелая артиллерия» — Surf один из лучших вариантов в Go-экосистеме.

Полезные ссылки