surf — продвинутый HTTP-клиент для Go. Он поддерживает имитацию браузерных отпечатков, HTTP/2 и HTTP/3, сессии, middleware, стриминг и многое другое.Зачем это нужно
Стандартный
net/http выдаёт себя по TLS-отпечатку. Большинство защищённых сайтов различают настоящий браузер и скрипт именно по нему. surf эмулирует не только заголовки, но и низкоуровневые параметры TLS-рукопожатия, порядок заголовков и настройки QUIC.Как это работает
Простой GET-запрос выглядит так:
resp := surf.NewClient().Get("https://api.github.com/users/github").Do()
if resp.IsErr() {
log.Fatal(resp.Err())
}
fmt.Println(resp.Ok().Body.String().Unwrap())Имитация Chrome с сессией:
client := surf.NewClient().
Builder().
Impersonate().Chrome().
Session().
Build().
Unwrap()
resp := client.Get("https://example.com").Do()
Firefox со случайной ОС:
client := surf.NewClient().
Builder().
Impersonate().
RandomOS().
Firefox().
Build().
Unwrap()
HTTP/3 с полным QUIC-отпечатком:
client := surf.NewClient().
Builder().
Impersonate().Chrome().
ForceHTTP3().
Build().
Unwrap()
resp := client.Get("https://cloudflare-quic.com/").Do()
fmt.Println(resp.Ok().Proto) // HTTP/3.0
Декодирование JSON-ответа:
type User struct {
Name string `json:"name"`
Company string `json:"company"`
}
resp := surf.NewClient().Get("https://api.github.com/users/github").Do()
if resp.IsOk() {
var user User
resp.Ok().Body.JSON(&user)
}Middleware для логирования:
client := surf.NewClient().
Builder().
With(func(resp *surf.Response) error {
fmt.Printf("статус: %d, время: %v\n", resp.StatusCode, resp.Time)
return nil
}).
Build().
Unwrap()
Что ещё умеет
• поддерживает прокси SOCKS5 с UDP для HTTP/3, DNS-over-TLS
• привязку к сетевому интерфейсу
• Unix-сокеты
• кэширование тела ответа
• стриминг, Server-Sent Events
Клиент совместим со стандартным
net/http через метод Std() — это позволяет использовать его с любыми сторонними библиотеками, ожидающими *http.Client.➡️ Репозиторий
📍 Навигация: Вакансии • Задачи • Собесы
🐸 Библиотека Go-разработчика
#GoToProduction
