mirror of
https://github.com/bufanyun/hotgo.git
synced 2025-01-23 19:00:24 +08:00
130 lines
3.9 KiB
Go
130 lines
3.9 KiB
Go
// Package useragent
|
|
// @Link https://github.com/bufanyun/hotgo
|
|
// @Copyright Copyright (c) 2023 HotGo CLI
|
|
// @Author Ms <133814250@qq.com>
|
|
// @License https://github.com/bufanyun/hotgo/blob/master/LICENSE
|
|
package useragent
|
|
|
|
import (
|
|
"fmt"
|
|
"github.com/gogf/gf/v2/text/gstr"
|
|
"hotgo/internal/consts"
|
|
"regexp"
|
|
"strings"
|
|
)
|
|
|
|
// GetOs 获取OS名称
|
|
func GetOs(userAgent string) string {
|
|
osName := consts.Unknown
|
|
if userAgent == "" {
|
|
return osName
|
|
}
|
|
|
|
var (
|
|
strRe, _ = regexp.Compile(`(?i:\((.*?)\))`)
|
|
levelNames = ":micromessenger:dart:Windows NT:Windows Mobile:Windows Phone:Windows Phone OS:Macintosh|Macintosh:Mac OS:CrOS|CrOS:iPhone OS:iPad|iPad:OS:Android:Linux:blackberry:hpwOS:Series:Symbian:PalmOS:SymbianOS:J2ME:Sailfish:Bada:MeeGo:webOS|hpwOS:Maemo:"
|
|
namesArr = strings.Split(strings.Trim(levelNames, ":"), ":")
|
|
regStrArr = make([]string, len(namesArr))
|
|
)
|
|
|
|
for k, name := range namesArr {
|
|
regStrArr[k] = fmt.Sprintf("(%s[\\s?\\/XxSs0-9_.]+)", name)
|
|
}
|
|
|
|
userAgent = strRe.FindString(userAgent)
|
|
var (
|
|
nameRe, _ = regexp.Compile(fmt.Sprintf("(?i:%s)", strings.Join(regStrArr, "|")))
|
|
names = nameRe.FindAllString(userAgent, -1)
|
|
name = ""
|
|
)
|
|
|
|
for _, s := range names {
|
|
if len(name) == 0 {
|
|
name = strings.TrimSpace(s)
|
|
} else {
|
|
if strings.Contains(name, "Macintosh") && s != "" {
|
|
name = strings.TrimSpace(s)
|
|
} else if strings.Contains(name, s) {
|
|
name = strings.TrimSpace(s)
|
|
} else if !strings.Contains(s, name) {
|
|
if strings.Contains(name, "iPhone") || strings.Contains(name, "iPad") {
|
|
s = gstr.Trim(s, "Mac OS X")
|
|
}
|
|
|
|
if s != "" {
|
|
name += " " + strings.TrimSpace(s)
|
|
}
|
|
}
|
|
break
|
|
}
|
|
|
|
if strings.Contains(name, "Windows NT") {
|
|
name = getWinOsNameWithWinNT(name)
|
|
break
|
|
}
|
|
}
|
|
|
|
if name != "" {
|
|
osName = name
|
|
}
|
|
return osName
|
|
}
|
|
|
|
// GetBrowser 获取浏览器名称
|
|
func GetBrowser(userAgent string) string {
|
|
var (
|
|
deviceName = consts.Unknown
|
|
levelNames = ":VivoBrowser:QQDownload:QQBrowser:QQ:MQQBrowser:MicroMessenger:TencentTraveler:LBBROWSER:TaoBrowser:BrowserNG:UCWEB:TwonkyBeamBrowser:NokiaBrowser:OviBrowser:NF-Browser:OneBrowser:Obigo:DiigoBrowser:baidubrowser:baiduboxapp:xiaomi:Redmi:MI:Lumia:Micromax:MSIEMobile:IEMobile:EdgiOS:Yandex:Mercury:Openwave:TouchPad:UBrowser:Presto:Maxthon:MetaSr:Trident:Opera:IEMobile:Edge:Chrome:Chromium:OPR:CriOS:Firefox:FxiOS:fennec:CrMo:Safari:Nexus One:Nexus S:Nexus:Blazer:teashark:bolt:HTC:Dell:Motorola:Samsung:LG:Sony:SonyST:SonyLT:SonyEricsson:Asus:Palm:Vertu:Pantech:Fly:Wiko:i-mobile:Alcatel:Nintendo:Amoi:INQ:ONEPLUS:Tapatalk:PDA:Novarra-Vision:NetFront:Minimo:FlyFlow:Dolfin:Nokia:Series:AppleWebKit:Mobile:Mozilla:Version:"
|
|
namesArr = strings.Split(strings.Trim(levelNames, ":"), ":")
|
|
regStrArr []string
|
|
)
|
|
|
|
for _, name := range namesArr {
|
|
regStrArr = append(regStrArr, fmt.Sprintf("(%s[\\s?\\/0-9.]+)", name))
|
|
}
|
|
|
|
var (
|
|
regexpStr = fmt.Sprintf("(?i:%s)", strings.Join(regStrArr, "|"))
|
|
nameRe, _ = regexp.Compile(regexpStr)
|
|
names = nameRe.FindAllString(userAgent, -1)
|
|
level = 0
|
|
)
|
|
|
|
for _, name := range names {
|
|
replaceRe, _ := regexp.Compile(`(?i:[\s?\/0-9.]+)`)
|
|
l := strings.Index(levelNames, fmt.Sprintf(":%s:", replaceRe.ReplaceAllString(name, "")))
|
|
if level == 0 {
|
|
deviceName = strings.TrimSpace(name)
|
|
}
|
|
|
|
if l >= 0 && (level == 0 || level > l) {
|
|
level = l
|
|
deviceName = strings.TrimSpace(name)
|
|
}
|
|
}
|
|
return deviceName
|
|
}
|
|
|
|
func getWinOsNameWithWinNT(sName string) string {
|
|
osName := "Windows"
|
|
types := map[string]string{
|
|
"Windows NT 10": "Windows 10",
|
|
"Windows NT 6.3": "Windows 8",
|
|
"Windows NT 6.2": "Windows 8",
|
|
"Windows NT 6.1": "Windows 7",
|
|
"Windows NT 6.0": "Windows Vista/Server 2008",
|
|
"Windows NT 5.2": "Windows Server 2003",
|
|
"Windows NT 5.1": "Windows XP",
|
|
"Windows NT 5": "Windows 2000",
|
|
"Windows NT 4": "Windows NT4",
|
|
}
|
|
|
|
for keyWord, name := range types {
|
|
if strings.Contains(sName, keyWord) {
|
|
osName = name
|
|
break
|
|
}
|
|
}
|
|
return osName
|
|
}
|