Golang实现浏览器检测功能v1.0.0
Golang实现浏览器检测功能v1.0.0 https://github.com/dineshgowda24/browser
它能做什么?
Browser Go 包旨在解析用户代理字符串,提供关于用户浏览器、设备和操作平台的宝贵信息。该包简化了通常复杂的用户代理分析过程,对于需要根据客户端特性提供定制响应的 Web 应用程序尤其有益。
为什么创建它?
这个项目源于实际需求。我们遇到了必须识别客户端浏览器、设备和平台的情况。
一个重要的应用是创建了一个内部 URL 缩短器,具备深度链接和通用链接功能。这些缩短的 URL 用于跨各种社交媒体平台的营销活动,以及通过 WhatsApp 等不同渠道发送通知。这个 URL 缩短器的独特之处在于它能够适应多种客户端场景:
- 增强链接互动性: 与典型的 URL 缩短器在浏览器中打开时重定向到目标 URL不同,该服务确保在社交媒体平台上共享的链接看起来更具吸引力。它通过返回带有 Open Graph (OG) 标签的纯 HTML 来实现这一点,使 URL 内容变得丰富且诱人点击,特别是当客户端不是真正的浏览器时,即针对来自社交媒体网站的机器人/链接扩展请求。这种方法显著提高了点击率 (CTR)。
- 基于平台的重定向: 除了单纯的重定向,该项目还允许针对特定平台重定向到应用商店,使其成为纯应用链接的理想选择。这是通用 URL 缩短器中不常见的功能。
- 搜索引擎优化 (SEO): 为了优化 SEO,通常需要为 Google 机器人以不同方式呈现内容。该项目促进了这一点,确保当 Google 机器人访问网站时,后端 API 能够做出适当的响应。
- 分析: 该包也是与短链接相关的分析的有价值工具。它能够跟踪客户端信息,包括浏览器、设备和平台,以便为产品决策和其他战略考虑提供依据。
为什么它有用,特别是与现有的类似项目相比?
这个包因以下几个原因而脱颖而出:
- 强大的数据支持: 该包得到了从 https://www.whatismybrowser.com/ 购买的全面用户代理数据库的支持。借助包含 2.5 亿用户代理的数据库,跨各种设备和平台测试客户端变得简单可靠。
- 广泛的客户端支持: 该项目支持全面的浏览器、设备、平台和机器人列表,使其功能多样,能够适应各种客户端场景。
- 代码可扩展性: 可以轻松扩展该包以支持新客户端,只需进行最少的代码更改,确保添加新功能不会破坏现有功能。
- 全面的测试: 该项目包含大量的单元测试,保证了其功能的可靠性和稳定性。
更多关于Golang实现浏览器检测功能v1.0.0的实战教程也可以访问 https://www.itying.com/category-94-b0.html
有趣。我目前的一个项目正在使用 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亿用户代理数据库的检测准确性是该库的主要优势,特别适合需要精确客户端识别的应用场景。

