Golang实现浏览器检测功能v1.0.0

Golang实现浏览器检测功能v1.0.0 https://github.com/dineshgowda24/browser

它能做什么?

Browser Go 包旨在解析用户代理字符串,提供关于用户浏览器、设备和操作平台的宝贵信息。该包简化了通常复杂的用户代理分析过程,对于需要根据客户端特性提供定制响应的 Web 应用程序尤其有益。

为什么创建它?

这个项目源于实际需求。我们遇到了必须识别客户端浏览器、设备和平台的情况。

一个重要的应用是创建了一个内部 URL 缩短器,具备深度链接和通用链接功能。这些缩短的 URL 用于跨各种社交媒体平台的营销活动,以及通过 WhatsApp 等不同渠道发送通知。这个 URL 缩短器的独特之处在于它能够适应多种客户端场景:

  1. 增强链接互动性: 与典型的 URL 缩短器在浏览器中打开时重定向到目标 URL不同,该服务确保在社交媒体平台上共享的链接看起来更具吸引力。它通过返回带有 Open Graph (OG) 标签的纯 HTML 来实现这一点,使 URL 内容变得丰富且诱人点击,特别是当客户端不是真正的浏览器时,即针对来自社交媒体网站的机器人/链接扩展请求。这种方法显著提高了点击率 (CTR)。
  2. 基于平台的重定向: 除了单纯的重定向,该项目还允许针对特定平台重定向到应用商店,使其成为纯应用链接的理想选择。这是通用 URL 缩短器中不常见的功能。
  3. 搜索引擎优化 (SEO): 为了优化 SEO,通常需要为 Google 机器人以不同方式呈现内容。该项目促进了这一点,确保当 Google 机器人访问网站时,后端 API 能够做出适当的响应。
  4. 分析: 该包也是与短链接相关的分析的有价值工具。它能够跟踪客户端信息,包括浏览器、设备和平台,以便为产品决策和其他战略考虑提供依据。

为什么它有用,特别是与现有的类似项目相比?

这个包因以下几个原因而脱颖而出:

  1. 强大的数据支持: 该包得到了从 https://www.whatismybrowser.com/ 购买的全面用户代理数据库的支持。借助包含 2.5 亿用户代理的数据库,跨各种设备和平台测试客户端变得简单可靠。
  2. 广泛的客户端支持: 该项目支持全面的浏览器、设备、平台和机器人列表,使其功能多样,能够适应各种客户端场景。
  3. 代码可扩展性: 可以轻松扩展该包以支持新客户端,只需进行最少的代码更改,确保添加新功能不会破坏现有功能。
  4. 全面的测试: 该项目包含大量的单元测试,保证了其功能的可靠性和稳定性。

更多关于Golang实现浏览器检测功能v1.0.0的实战教程也可以访问 https://www.itying.com/category-94-b0.html

3 回复

有趣。我目前的一个项目正在使用 avct/uasurfer,但我认为它已经不再被积极维护了。如果这个项目能长期保持活跃开发,我可能会尝试一下。

更多关于Golang实现浏览器检测功能v1.0.0的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


我计划根据社区采用情况来长期维护它。接下来几周我还会发布一些新功能。

是的,uasurfer 已不再维护。

另外,我很喜欢 uasurfer 的 README;我需要在包的文档中添加支持的浏览器、平台、设备和机器人列表,因为这样能给用户提供更好的可见性。

这是一个功能完整的浏览器检测库实现。以下是核心使用示例:

package main

import (
    "fmt"
    "github.com/dineshgowda24/browser"
)

func main() {
    // 示例用户代理字符串
    userAgent := "Mozilla/5.0 (iPhone; CPU iPhone OS 14_0 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/14.0 Mobile/15E148 Safari/604.1"
    
    // 解析用户代理
    result := browser.Parse(userAgent)
    
    // 获取浏览器信息
    fmt.Printf("浏览器名称: %s\n", result.Browser.Name)
    fmt.Printf("浏览器版本: %s\n", result.Browser.Version)
    fmt.Printf("浏览器引擎: %s\n", result.Browser.Engine)
    
    // 获取设备信息
    fmt.Printf("设备类型: %s\n", result.Device.Type)
    fmt.Printf("设备品牌: %s\n", result.Device.Brand)
    fmt.Printf("设备型号: %s\n", result.Device.Model)
    
    // 获取平台信息
    fmt.Printf("操作系统: %s\n", result.Platform.Name)
    fmt.Printf("系统版本: %s\n", result.Platform.Version)
    
    // 检查是否为机器人
    fmt.Printf("是否为机器人: %v\n", result.IsBot())
    
    // 检查是否为移动设备
    fmt.Printf("是否为移动设备: %v\n", result.IsMobile())
}

对于Web应用中的实际使用:

package main

import (
    "net/http"
    "github.com/dineshgowda24/browser"
)

func handler(w http.ResponseWriter, r *http.Request) {
    userAgent := r.Header.Get("User-Agent")
    result := browser.Parse(userAgent)
    
    // 根据浏览器类型返回不同响应
    switch {
    case result.IsBot():
        // 为搜索引擎机器人返回OG标签
        w.Header().Set("Content-Type", "text/html")
        fmt.Fprintf(w, `
            <!DOCTYPE html>
            <html prefix="og: http://ogp.me/ns#">
            <head>
                <meta property="og:title" content="页面标题" />
                <meta property="og:description" content="页面描述" />
                <meta property="og:image" content="https://example.com/image.jpg" />
            </head>
            <body></body>
            </html>
        `)
    case result.IsMobile() && result.Platform.Name == "iOS":
        // iOS设备重定向到App Store
        http.Redirect(w, r, "https://apps.apple.com/app/id123456", http.StatusFound)
    case result.IsMobile() && result.Platform.Name == "Android":
        // Android设备重定向到Google Play
        http.Redirect(w, r, "https://play.google.com/store/apps/details?id=com.example", http.StatusFound)
    default:
        // 桌面浏览器正常重定向
        http.Redirect(w, r, "https://example.com", http.StatusFound)
    }
}

func main() {
    http.HandleFunc("/", handler)
    http.ListenAndServe(":8080", nil)
}

该库的优势在于其完整的类型定义和结构化数据:

// 浏览器信息结构
type Browser struct {
    Name    string
    Version string
    Engine  string
}

// 设备信息结构  
type Device struct {
    Type  string // "mobile", "tablet", "desktop", "bot"
    Brand string
    Model string
}

// 平台信息结构
type Platform struct {
    Name    string
    Version string
}

// 完整的解析结果
type Result struct {
    Browser  Browser
    Device   Device
    Platform Platform
    Bot      bool
}

基于2.5亿用户代理数据库的检测准确性是该库的主要优势,特别适合需要精确客户端识别的应用场景。

回到顶部