useragent

package
v0.19.4 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Nov 1, 2026 License: Apache-2.0 Imports: 8 Imported by: 0

Documentation

Overview

* @Author: kamalyes 501893067@qq.com * @Date: 2025-04-21 13:58:25 * @LastEditors: kamalyes 501893067@qq.com * @LastEditTime: 2025-04-23 11:25:40 * @FilePath: \go-toolbox\pkg\useragent\consts.go * @Description: * * Copyright (c) 2025 by kamalyes, All Rights Reserved.

* @Author: kamalyes 501893067@qq.com * @Date: 2025-04-22 10:57:03 * @LastEditors: kamalyes 501893067@qq.com * @LastEditTime: 2025-04-23 11:33:24 * @FilePath: \go-toolbox\pkg\useragent\fake.go * @Description: * * Copyright (c) 2025 by kamalyes, All Rights Reserved.

* @Author: kamalyes 501893067@qq.com * @Date: 2025-12-20 00:00:00 * @LastEditors: kamalyes 501893067@qq.com * @LastEditTime: 2025-12-20 15:30:00 * @FilePath: \go-toolbox\pkg\useragent\parser.go * @Description: User-Agent 解析器 * * Copyright (c) 2025 by kamalyes, All Rights Reserved.

Index

Constants

View Source
const (
	Google              = "Google"              // Google 浏览器
	Chrome              = "Chrome"              // Chrome 浏览器
	Firefox             = "Firefox"             // Firefox 浏览器
	Edge                = "Edge"                // Edge 浏览器
	Opera               = "Opera"               // Opera 浏览器
	OperaMini           = "Opera Mini"          // Opera Mini 浏览器
	OperaTouch          = "Opera Touch"         // Opera Touch 浏览器
	HeadlessChrome      = "Headless Chrome"     // 无头 Chrome 浏览器
	Safari              = "Safari"              // Safari 浏览器
	Vivaldi             = "Vivaldi"             // Vivaldi 浏览器
	InternetExplorer    = "Internet Explorer"   // Internet Explorer 浏览器
	MobileSafari        = "Mobile Safari"       // 移动 Safari 浏览器
	AndroidBrowser      = "Android"             // Android 浏览器
	SamsungBrowser      = "Samsung Browser"     // Samsung 浏览器
	YandexBrowser       = "Yandex Browser"      // Yandex 浏览器
	Whale               = "Whale"               // Whale 浏览器
	DuckDuckGoMobile    = "DuckDuckGo Mobile"   // DuckDuckGo 移动浏览器
	MiuiBrowser         = "MiuiBrowser"         // Miui 浏览器
	Twitter             = "Twitter"             // Twitter 浏览器
	Facebook            = "Facebook"            // Facebook 浏览器
	AmazonSilk          = "Amazon Silk"         // Amazon Silk 浏览器
	GoogleAdsBot        = "Google Ads Bot"      // Google Ads 机器人
	Googlebot           = "Googlebot"           // Google 机器人
	Twitterbot          = "Twitterbot"          // Twitter 机器人
	FacebookExternalHit = "FacebookExternalHit" // Facebook 外部抓取
	FacebookCatalog     = "FacebookCatalog"     // Facebook 商品目录
	Applebot            = "Applebot"            // Apple 机器人
	Bingbot             = "Bingbot"             // Bing 机器人
	YandexBot           = "YandexBot"           // Yandex 机器人
	YandexAdNet         = "YandexAdNet"         // Yandex 广告网络
	FacebookApp         = "Facebook App"        // Facebook 应用
	InstagramApp        = "Instagram App"       // Instagram 应用
	TiktokApp           = "TikTok App"          // TikTok 应用
	CriOS               = "CriOS"               // CriOS 浏览器
	FxiOS               = "FxiOS"               // FxiOS 浏览器
	EdgiOS              = "Edg"                 // EdgiOS 浏览器
	HuaweiBrowser       = "Huawei Browser"      // Huawei 浏览器
	BraveChrome         = "Brave Chrome"        // Brave Chrome 浏览器
)

浏览器常量

View Source
const (
	Windows        = "Windows"          // Windows 操作系统
	WindowsPhone   = "Windows Phone"    // Windows Phone 操作系统
	WindowsNT      = "Windows NT"       // Windows NT 操作系统
	WindowsPhoneOS = "Windows Phone OS" // Windows Phone 操作系统
	Android        = "Android"          // Android 操作系统
	MacOS          = "macOS"            // macOS 操作系统
	IPhone         = "IPhone"           // IPhone 操作系统
	IOS            = "iOS"              // iOS 操作系统
	Linux          = "Linux"            // Linux 操作系统
	FreeBSD        = "FreeBSD"          // FreeBSD 操作系统
	ChromeOS       = "ChromeOS"         // ChromeOS 操作系统
	BlackBerry     = "BlackBerry"       // BlackBerry 操作系统
	CrOS           = "CrOS"             // CrOS 操作系统
	OpenHarmony    = "OpenHarmony"      // OpenHarmony 设备
	IPad           = "iPad"             // iPad 设备
)

操作系统常量

View Source
const (
	VendorApple     = "Apple"     // 苹果
	VendorSamsung   = "Samsung"   // 三星
	VendorHuawei    = "Huawei"    // 华为
	VendorHonor     = "Honor"     // 荣耀
	VendorXiaomi    = "Xiaomi"    // 小米
	VendorOPPO      = "OPPO"      // OPPO
	VendorVivo      = "Vivo"      // Vivo
	VendorMicrosoft = "Microsoft" // 微软
)

设备厂商常量

View Source
const (
	DeviceBot     = "bot"     // 机器人
	DeviceTablet  = "tablet"  // 平板
	DeviceMobile  = "mobile"  // 移动设备
	DeviceDesktop = "desktop" // 桌面设备
	DeviceUnknown = "unknown" // 未知设备
)

设备类型常量

View Source
const (
	BotBaidu   = "Baidu"   // 百度爬虫
	BotYahoo   = "Yahoo"   // Yahoo爬虫
	BotGeneric = "Bot"     // 通用爬虫
	BotCrawler = "Crawler" // 爬虫
	BotSpider  = "Spider"  // 蜘蛛
)

爬虫名称常量

View Source
const (
	X86 = "X86"
	X64 = "X64"
)

设备类型常量

View Source
const (
	EngineBlink   = "Blink"   // Chrome / Edge / Opera 等 Chromium 系
	EngineWebKit  = "WebKit"  // Safari 及 iOS 上的全部浏览器
	EngineGecko   = "Gecko"   // Firefox
	EngineTrident = "Trident" // 旧版 IE
	EnginePresto  = "Presto"  // 旧版 Opera
)

渲染引擎

View Source
const (
	InAppWeChat    = "WeChat"    // 微信
	InAppWeCom     = "WeCom"     // 企业微信
	InAppAlipay    = "Alipay"    // 支付宝
	InAppDingTalk  = "DingTalk"  // 钉钉
	InAppFeishu    = "Feishu"    // 飞书
	InAppQQ        = "QQ"        // QQ
	InAppWeibo     = "Weibo"     // 微博
	InAppDouyin    = "Douyin"    // 抖音
	InAppKuaishou  = "Kuaishou"  // 快手
	InAppXiaohongs = "RedNote"   // 小红书
	InAppBaiduApp  = "BaiduApp"  // 百度 App
	InAppTaobao    = "Taobao"    // 手机淘宝
	InAppJD        = "JD"        // 京东
	InAppMeituan   = "Meituan"   // 美团
	InAppLine      = "Line"      // Line
	InAppFacebook  = "Facebook"  // Facebook App
	InAppInstagram = "Instagram" // Instagram
	InAppTwitter   = "Twitter"   // Twitter / X
	InAppSnapchat  = "Snapchat"  // Snapchat
	InAppElectron  = "Electron"  // Electron 桌面应用
)

端内浏览器(WebView)宿主应用

这些应用内置的 WebView 在 UA 里保留了 Safari / Chrome 的标识,所以仅看 Browser 字段无法区分其限制与真浏览器不同(下载、新开窗口、部分 API 不可用), 前端常需据此降级,因此单独识别

[EN] These apps' embedded WebViews keep the Safari or Chrome markers in their UA, so the Browser field alone cannot tell them apart. Their restrictions differ from a real browser — downloads, opening windows and some APIs are unavailable — and front ends routinely need to degrade accordingly, so they are detected separately

View Source
const (
	ClientCurl       = "curl"
	ClientWget       = "wget"
	ClientOkHttp     = "OkHttp"
	ClientPython     = "python-requests"
	ClientPostman    = "Postman"
	ClientInsomnia   = "Insomnia"
	ClientJava       = "Java"
	ClientGoHTTP     = "Go-http-client"
	ClientAxios      = "axios"
	ClientNodeFetch  = "node-fetch"
	ClientApacheHTTP = "Apache-HttpClient"
	ClientRestSharp  = "RestSharp"
	ClientPHP        = "PHP"
	ClientRuby       = "Ruby"
)

非浏览器 HTTP 客户端

与爬虫分开:爬虫是抓取行为,这些是程序化调用(SDK、命令行、测试工具) 服务端常需据此区分「真人访问」与「接口调用」

[EN] Kept apart from bots: a bot is crawling behaviour while these are programmatic callers — SDKs, command-line tools, test clients. Servers routinely need to tell a human visit from an API call

View Source
const (
	ArchX8664 = "x86_64" // 64 位 x86
	ArchX86   = "x86"    // 32 位 x86
	ArchARM64 = "arm64"  // 64 位 ARM
	ArchARM   = "arm"    // 32 位 ARM
)

CPU 架构

Variables

所有浏览器常量

所有操作系统常量

热门浏览器常量

热门操作系统常量

View Source
var StabilizeUserAgents = map[DeviceType][]string{
	DeviceTypeDesktop: {

		"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36",
		"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36",
		"Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36",

		"Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:120.0) Gecko/20100101 Firefox/120.0",
		"Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:120.0) Gecko/20100101 Firefox/120.0",
		"Mozilla/5.0 (X11; Linux x86_64; rv:120.0) Gecko/20100101 Firefox/120.0",

		"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36 Edg/120.0.0.0",
		"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36 Edg/120.0.0.0",

		"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.1 Safari/605.1.15",
	},
	DeviceTypeMobile: {

		"Mozilla/5.0 (iPhone; CPU iPhone OS 17_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.1 Mobile/15E148 Safari/604.1",
		"Mozilla/5.0 (iPad; CPU OS 17_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.1 Mobile/15E148 Safari/604.1",

		"Mozilla/5.0 (Linux; Android 14; Pixel 7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Mobile Safari/537.36",
		"Mozilla/5.0 (Linux; HarmonyOS; HUAWEI LIO-AN00) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Mobile Safari/537.36",
		"Mozilla/5.0 (Linux; Android 14; 23116PN5BC) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Mobile Safari/537.36",
		"Mozilla/5.0 (Linux; Android 14; CPH2581) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Mobile Safari/537.36",
		"Mozilla/5.0 (Linux; Android 14; V2309) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Mobile Safari/537.36",

		"Mozilla/5.0 (HarmonyOS; Tablet; HUAWEI MRX-W09) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/120.0.0.0 Safari/537.36",
		"Mozilla/5.0 (Mobile; Nokia_2720; rv:48.0) Gecko/48.0 Firefox/48.0 KAIOS/3.0",
	},
	DeviceTypeTablet: {
		"Mozilla/5.0 (iPad; CPU OS 17_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.1 Mobile/15E148 Safari/604.1",
		"Mozilla/5.0 (Linux; Android 14; SM-X710) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36",
		"Mozilla/5.0 (Linux; Android 14; 23043RP34C) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36",
	},
	DeviceTypeFoldable: {
		"Mozilla/5.0 (Linux; Android 14; SM-F946B) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Mobile Safari/537.36",
		"Mozilla/5.0 (HarmonyOS; Tablet; HUAWEI TET-AN00) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36",
	},
	DeviceTypeMobileBrowser: {
		"Mozilla/5.0 (Linux; U; Android 14; zh-CN; 23116PN5BC Build/UKQ1.230804.001) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/120.0.0.0 Mobile UCBrowser/13.6.0.1306 Safari/537.36",
		"Mozilla/5.0 (iPhone; CPU iPhone OS 17_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.1 Mobile/15E148 Safari/604.1 MQQBrowser/9.8.8",
		"Mozilla/5.0 (Linux; Android 14; SM-G998B) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Mobile Safari/537.36 T7/14.3 baidubrowser/13.23.5.10",
	},
}

定义一个 map 来存储可靠稳定的设备类型的 User-Agent

冷门浏览器常量

冷门操作系统常量

Functions

This section is empty.

Types

type DeviceType

type DeviceType int
const (
	DeviceTypeDesktop DeviceType = iota
	DeviceTypeMobile
	DeviceTypeTablet
	DeviceTypeFoldable
	DeviceTypeMobileBrowser
)

type ParsedUserAgent

type ParsedUserAgent struct {
	Raw            string `json:"raw"`                // 原始 User-Agent 字符串
	Browser        string `json:"browser"`            // 浏览器名称: Chrome, Firefox, Safari 等
	BrowserVersion string `json:"browser_version"`    // 浏览器版本号
	OS             string `json:"os"`                 // 操作系统: Windows, macOS, Android, iOS 等
	OSVersion      string `json:"os_version"`         // 操作系统版本号
	Device         string `json:"device"`             // 设备名称
	DeviceType     string `json:"device_type"`        // 设备类型: mobile/tablet/desktop/bot
	DeviceVendor   string `json:"device_vendor"`      // 设备厂商: Apple, Samsung, Huawei 等
	IsBot          bool   `json:"is_bot"`             // 是否为爬虫/机器人
	BotName        string `json:"bot_name,omitempty"` // 爬虫名称
	IsMobile       bool   `json:"is_mobile"`          // 是否为移动设备
	IsTablet       bool   `json:"is_tablet"`          // 是否为平板设备
	Engine         string `json:"engine,omitempty"`   // 渲染引擎: Blink, WebKit, Gecko 等
}

ParsedUserAgent 解析后的 User-Agent 信息

func Parse

func Parse(ua string) *ParsedUserAgent

Parse 解析 User-Agent 字符串,返回解析后的结构化信息 包括浏览器、操作系统、设备类型等信息

func (*ParsedUserAgent) Arch

func (p *ParsedUserAgent) Arch() string

Arch 返回 CPU 架构,无法判断则返回空串

注意 UA 里的架构信息是不可靠的:Windows 上的 32 位浏览器在 64 位系统上会报 WOW64,而 Apple Silicon 的 Safari 为了兼容仍然报 Intel Mac OS X 这个方法只反映 UA 的字面内容,不做推断

[EN] Architecture as stated in the UA, which is not reliable: a 32-bit browser on 64-bit Windows reports WOW64, and Safari on Apple Silicon still reports Intel Mac OS X for compatibility. This reflects the literal UA only and infers nothing

func (*ParsedUserAgent) HTTPClient

func (p *ParsedUserAgent) HTTPClient() string

HTTPClient 返回非浏览器 HTTP 客户端的名称,不是则返回空串

与爬虫分开判断:爬虫是抓取行为,这里是程序化调用

func (*ParsedUserAgent) InApp

func (p *ParsedUserAgent) InApp() string

InApp 返回承载这个 WebView 的宿主应用名,不是端内浏览器则返回空串

按需计算,不缓存,原因见本节开头的说明

func (*ParsedUserAgent) IsAndroid

func (p *ParsedUserAgent) IsAndroid() bool

IsAndroid 是否为 Android 系统

func (*ParsedUserAgent) IsChromium

func (p *ParsedUserAgent) IsChromium() bool

IsChromium 是否为 Chromium 系浏览器(引擎为 Blink)

func (*ParsedUserAgent) IsDesktop

func (p *ParsedUserAgent) IsDesktop() bool

IsDesktop 是否为桌面设备

func (*ParsedUserAgent) IsHTTPClient

func (p *ParsedUserAgent) IsHTTPClient() bool

IsHTTPClient 是否为非浏览器的程序化调用

func (*ParsedUserAgent) IsIOS

func (p *ParsedUserAgent) IsIOS() bool

IsIOS 是否为 iOS 系统

func (*ParsedUserAgent) IsInApp

func (p *ParsedUserAgent) IsInApp() bool

IsInApp 是否运行在某个应用内置的 WebView 里

func (*ParsedUserAgent) IsMacOS

func (p *ParsedUserAgent) IsMacOS() bool

IsMacOS 是否为 macOS 系统

func (*ParsedUserAgent) IsWindows

func (p *ParsedUserAgent) IsWindows() bool

IsWindows 是否为 Windows 系统

type RgType

type RgType int
const (
	RgTypeAll RgType = iota
	RgTypeUnpopular
	RgTypePopular
)

type UserAgent

type UserAgent struct {
	// contains filtered or unexported fields
}

UserAgent 结构体

func New

func New() *UserAgent

func (*UserAgent) GenerateRand

func (u *UserAgent) GenerateRand() *UserAgent

GenerateRand 随机生成UserAgent

func (*UserAgent) GenerateStabilize

func (u *UserAgent) GenerateStabilize(dt DeviceType) string

GenerateStabilize 生成稳定可靠的UserAgent

func (*UserAgent) GetFullOSVersion

func (u *UserAgent) GetFullOSVersion() string

GetFullOSVersion 获取操作系统版本

func (*UserAgent) GetFullValue

func (u *UserAgent) GetFullValue() string

GetFullValue 获取完整的用户代理字符串

func (*UserAgent) GetFullVersion

func (u *UserAgent) GetFullVersion() string

GetFullVersion 获取版本

func (*UserAgent) GetName

func (u *UserAgent) GetName() string

GetName 获取名称

func (*UserAgent) GetOS

func (u *UserAgent) GetOS() string

GetOS 获取操作系统

func (*UserAgent) IsAndroid

func (ua *UserAgent) IsAndroid() bool

IsAndroid 检查是否为 Android 设备

func (*UserAgent) IsBlackBerry

func (ua *UserAgent) IsBlackBerry() bool

IsBlackBerry 检查是否为 BlackBerry 设备

func (*UserAgent) IsChromeOS

func (ua *UserAgent) IsChromeOS() bool

IsChromeOS 检查是否为 ChromeOS 设备

func (*UserAgent) IsCrOS

func (ua *UserAgent) IsCrOS() bool

IsCrOS 检查是否为 CrOS 设备

func (*UserAgent) IsFreeBSD

func (ua *UserAgent) IsFreeBSD() bool

IsFreeBSD 检查是否为 FreeBSD 设备

func (*UserAgent) IsIOS

func (ua *UserAgent) IsIOS() bool

IsIOS 检查是否为 iOS 设备

func (*UserAgent) IsLinux

func (ua *UserAgent) IsLinux() bool

IsLinux 检查是否为 Linux 设备

func (*UserAgent) IsMacOS

func (ua *UserAgent) IsMacOS() bool

IsMacOS 检查是否为 macOS 设备

func (*UserAgent) IsOpenHarmony

func (ua *UserAgent) IsOpenHarmony() bool

IsOpenHarmony 检查是否为 OpenHarmony 设备

func (*UserAgent) IsWindows

func (ua *UserAgent) IsWindows() bool

IsWindows 检查是否为 Windows 设备

func (*UserAgent) OSVersionNoFull

func (ua *UserAgent) OSVersionNoFull() string

OSVersionNoFull 返回操作系统版本字符串,格式为 <Major>.<Minor>.<Patch>

func (*UserAgent) OSVersionNoShort

func (ua *UserAgent) OSVersionNoShort() string

OSVersionNoShort 返回操作系统版本字符串,格式为 <Major>.<Minor>

func (*UserAgent) SetRgType

func (u *UserAgent) SetRgType(value RgType) *UserAgent

func (*UserAgent) VersionNoFull

func (ua *UserAgent) VersionNoFull() string

VersionNoFull 返回版本字符串,格式为 <Major>.<Minor>.<Patch>

func (*UserAgent) VersionNoShort

func (ua *UserAgent) VersionNoShort() string

VersionNoShort 返回版本字符串,格式为 <Major>.<Minor>

type VersionNo

type VersionNo struct {
	Major int   // 主版本号
	Minor int   // 次版本号
	Patch int   // 修订版本号
	Other []int // 其它版本号
}

func ParseVersion

func ParseVersion(ver string) (vern VersionNo)

ParseVersion 将版本字符串解析为 Major.Minor.Patch 结构体

func (*VersionNo) Rand

func (v *VersionNo) Rand(rng *rand.Rand)

Rand 生成一个随机的 VersionNo

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL