package ua import ( "net/url" "strings" "91porn-server/common/constant" "91porn-server/common/log" "github.com/gin-gonic/gin" ) type UA struct { UserAgent string DevID string //设备id 唯一标识 DevType string //设备类型 华为nova7 SysType string //pc Ver string //1.0 BuildID string // Mac string // GlobalDevID string //全局唯一表示 Terminal string //终端 0-客户端;1-h5(ios)端;2-web端 IsH5 string SystemVersion string SystemName string DeviceBrand string DeviceModel string SID string } func UAer(c *gin.Context) { userAgent := c.GetHeader("X-User-Agent") //兼容H5 UserAgent if userAgent == "" { userAgent = c.Request.UserAgent() } if userAgent == "" { log.Warn("user-agent empty") return } ua := Parse(userAgent) if sid := strings.TrimSpace(c.GetHeader("sid")); sid != "" { ua.SID = sid } c.Set(constant.CtxUA, ua) } func Parse(userAgent string) UA { var uastr string ua := UA{} decodeUa, err := url.QueryUnescape(userAgent) if err != nil { log.Warn("URLDecode user-agent error", log.Any("ua", userAgent)) uastr = userAgent } else { uastr = decodeUa } uas := strings.Split(uastr, ";") for _, v := range uas { vss := strings.SplitN(strings.TrimSpace(v), "=", 2) if len(vss) < 2 { log.Warn("user-agent miss", log.Any("ua", userAgent)) continue } key := strings.TrimSpace(vss[0]) value := strings.TrimSpace(vss[1]) switch key { case "DevID": ua.DevID = value case "DevType": ua.DevType = value case "SysType": ua.SysType = value case "Ver": ua.Ver = value case "BuildID": ua.BuildID = value case "Mac": ua.Mac = value case "GlobalDevID": ua.GlobalDevID = value case "Terminal": ua.Terminal = value case "IsH5": ua.IsH5 = value case "SystemVersion": ua.SystemVersion = value case "SystemName": ua.SystemName = value case "DeviceBrand": ua.DeviceBrand = value case "DeviceModel", "device_model": ua.DeviceModel = value case "SID", "Sid", "sid": ua.SID = value default: log.Warn("user-agent unknown", log.Any("key", key), log.Any("ua", userAgent)) } } ua.UserAgent = uastr return ua }