Surf:用Go编写的模拟浏览器的HTTP客户端


这是一个用于Go的HTTP客户端库,它解决了Web抓取和API自动化方面的一些现代挑战-特别是在机器人检测方面。

Surf是一个功能强大,功能丰富的Go HTTP客户端库,使处理HTTP请求变得直观和愉快。借助浏览器模拟、JA 3/JA 4指纹识别和全面的中间件支持等高级功能,Surf提供了现代Web交互所需的一切。

问题
今天,许多网站使用先进的机器人检测技术-例如:

  • TLS指纹(JA 3/JA 4)
  • HTTP/2设置和优先级帧检查
  • 标头排序
  • 多部分边界格式
  • 操作系统和浏览器特定的标头
标准的Go HTTP客户端很容易被标记,因为它们在这些较低的协议级别上不会模仿真实的浏览器行为。

Surf通过支持以下功能,帮助您的请求融入真实的浏览器流量:

  • 通过utls实现真实的JA 3/JA 4 TLS指纹
  • HTTP/2 SETTINGS优先级帧匹配Chrome,Firefox等。
  • 使用http.HeaderOrderKey进行准确的标头排序
  • 操作系统/浏览器特定的用户代理和头文件
  • WebKit/Gecko风格的多部分边界

技术特征

  • 具有优先级的内置中间件系统
  • 使用Singleton模式的连接池
  • 可以通过net/http.Client转换为.Std()
  • context.Context支持
  • 针对Cloudflare、Akamai等进行测试

示例使用,模拟chrome:


client := surf.NewClient().
    Builder().
    Impersonate().Chrome().
    Build()

resp := client.Get("https://api.example.com").Do()

浏览器模拟

  • Chrome Firefox支持:精确模拟Chrome v131和Firefox v131浏览器指纹
  • 平台多样性:模拟Windows、macOS、Linux、Android和iOS设备
  • TLS指纹:完全JA 3/JA 4指纹定制,增强隐私
  • 自动标题:正确的标题排序和浏览器特定的值
  • WebKit Form Boundary:精确的多部分表单边界生成匹配真实的浏览器
高级TLS和安全性
  • 自定义JA 3/JA 4:使用HelloID和HelloSpec配置精确的TLS指纹
  • HTTP/3支持:通过QUIC的完整HTTP/3,具有浏览器特定的QUIC指纹识别
  • JA4QUIC Fingerprinting:用于Chrome和Firefox的高级QUIC传输参数指纹
  • HTTP/2 HTTP/3:完全支持HTTP/2,可自定义设置(SETTINGS帧,窗口大小,优先级)
  • Ordered Headers:浏览器准确的头排序,完美的指纹规避
  • 证书固定:自定义TLS证书验证
  • DNS-over-TLS:通过DoT支持增强隐私
  • 代理支持:HTTP、HTTPS和SOCKS 5代理配置,支持HTTP/3的UDP
性能和可靠性
  • 连接池:使用单例模式的高效连接重用
  • 自动重试:具有自定义状态代码的可配置重试逻辑
  • 响应缓存:内置的体缓存用于重复访问
  • 流媒体支持:高效处理大型响应和SSE
  • 压缩:自动解压缩gzip、deflate、brotli和zstd响应
  • Keep-Alive:具有可配置参数的持久连接
️开发者体验
  • 标准库兼容:转换为net/http.Client以进行第三方库集成
  • 流畅的API:可链接的方法,实现优雅的代码
  • 中间件系统:具有优先级支持的可扩展请求/响应/客户端中间件
  • 类型安全:通过enetx/g支持泛型的强类型
  • 调试模式:全面的请求/响应调试
  • 错误处理:结果类型模式,用于更好的错误管理
  • 上下文支持:完整的上下文。取消和超时的上下文集成