package visit import ( "strings" "unicode" ) // friendlyAndroidName 将 UA 中的型号码映射为可读名称(品牌 + 营销名/型号) func friendlyAndroidName(model string) string { model = strings.TrimSpace(model) if model == "" { return "Android" } key := strings.ToUpper(model) key = strings.ReplaceAll(key, " ", "") if name, ok := androidModelNames[key]; ok { return name } // 部分型号带前缀品牌词 if name, ok := androidModelNames[strings.ToUpper(strings.TrimSpace(model))]; ok { return name } brand, rest := detectAndroidBrand(model) if brand != "" { if rest == "" || strings.EqualFold(rest, brand) { return brand } // 已是「Xiaomi 14」这类可读名 if looksHumanDeviceName(model) { if !strings.HasPrefix(model, brand) && !strings.Contains(model, brand) { return brand + " " + model } return model } return brand + " " + rest } if looksHumanDeviceName(model) { return model } return model } func looksHumanDeviceName(s string) bool { hasLetter := false hasSpaceOrCJK := false for _, r := range s { if unicode.Is(unicode.Han, r) { return true } if r == ' ' { hasSpaceOrCJK = true } if unicode.IsLetter(r) { hasLetter = true } } // Pixel 7 / Nexus 5X 等 return hasLetter && hasSpaceOrCJK } func detectAndroidBrand(model string) (brand, rest string) { m := strings.TrimSpace(model) upper := strings.ToUpper(m) // 显式品牌前缀 prefixes := []struct { prefix string brand string }{ {"HUAWEI ", "华为"}, {"HONOR ", "荣耀"}, {"XIAOMI ", "小米"}, {"REDMI ", "红米"}, {"OPPO ", "OPPO"}, {"VIVO ", "vivo"}, {"SAMSUNG ", "三星"}, {"ONEPLUS ", "一加"}, {"REALME ", "realme"}, {"MEIZU ", "魅族"}, {"GOOGLE ", "Google"}, {"PIXEL ", "Google"}, } for _, p := range prefixes { if strings.HasPrefix(upper, strings.ToUpper(p.prefix)) { return p.brand, strings.TrimSpace(m[len(p.prefix):]) } } switch { case strings.HasPrefix(upper, "SM-"), strings.HasPrefix(upper, "GT-"), strings.HasPrefix(upper, "SCH-"): return "三星", m case strings.HasPrefix(upper, "RMX"): return "realme", m case strings.HasPrefix(upper, "CPH"), strings.HasPrefix(upper, "PGFM"), strings.HasPrefix(upper, "PGBM"), strings.HasPrefix(upper, "PGEM"), strings.HasPrefix(upper, "PHN"), strings.HasPrefix(upper, "PHW"), strings.HasPrefix(upper, "PJU"), strings.HasPrefix(upper, "PJD"): return "OPPO", m case strings.HasPrefix(upper, "V2"), strings.HasPrefix(upper, "V1"), strings.HasPrefix(upper, "V3"): // vivo / iQOO 国内型号多为 VxxxxA if len(upper) >= 5 && unicode.IsDigit(rune(upper[1])) { return "vivo", m } case strings.HasPrefix(upper, "NE2"), strings.HasPrefix(upper, "LE2"), strings.HasPrefix(upper, "KB2"), strings.HasPrefix(upper, "PHB"), strings.HasPrefix(upper, "PHP"), strings.HasPrefix(upper, "CPH24"), strings.HasPrefix(upper, "ONEPLUS"): return "一加", m case strings.HasPrefix(upper, "M20"), strings.HasPrefix(upper, "M21"), strings.HasPrefix(upper, "220"), strings.HasPrefix(upper, "221"), strings.HasPrefix(upper, "222"), strings.HasPrefix(upper, "230"), strings.HasPrefix(upper, "231"), strings.HasPrefix(upper, "240"), strings.HasPrefix(upper, "241"), strings.HasPrefix(upper, "MI "), strings.HasPrefix(upper, "MI-"): return "小米", m case strings.Contains(upper, "REDMI"): return "红米", m case strings.HasSuffix(upper, "-AN00"), strings.HasSuffix(upper, "-AN10"), strings.HasSuffix(upper, "-AL00"), strings.HasSuffix(upper, "-AL10"), strings.HasSuffix(upper, "-TL00"), strings.HasSuffix(upper, "-LND"): // 华为/荣耀鸿蒙型号:XXX-AN00 if isHonorModel(upper) { return "荣耀", m } return "华为", m case strings.HasPrefix(upper, "PIXEL"): return "Google", m case strings.HasPrefix(upper, "NEXUS"): return "Google", m } return "", m } func isHonorModel(upper string) bool { honor := []string{ "ANY-", "REP-", "FNE-", "FRI-", "ANN-", "ALA-", "BRT-", "SDY-", "ELP-", "VER-", "MAA-", "REA-", "NTP-", "GIA-", "CLS-", "DIO-", "LGE-", "CRT-", } for _, p := range honor { if strings.HasPrefix(upper, p) { return true } } return false } // androidModelNames 常见国内机型营销名映射(截至 2026-08-05) // // 数据来源:各品牌官网规格页 / 中关村在线 / GSMArena / 工信部入网信息 // 校验原则: // 1. key 为 UA 解析出的 raw model(保留原大小写,Google 段为大写) // 2. 同型号不同 RAM/ROM 后缀(C/G/I)只收录国行 C 后缀 // 3. 跨品牌冲突型号(如 23113RKC6C 同时是小米/红米段)按真实归属去重 // 4. 错误映射已修正(详见下方各品牌注释) // // 维护:新增型号直接追加;删除已停产且不再出现在线上日志中的老型号可酌情清理。 var androidModelNames = map[string]string{ // ===================== 三星 Samsung ===================== // 来源:samsung.com.cn 规格页 + 国行固件库(CHC) "SM-S9180": "三星 Galaxy S23 Ultra", "SM-S9160": "三星 Galaxy S23+", "SM-S9110": "三星 Galaxy S23", "SM-S9280": "三星 Galaxy S24 Ultra", "SM-S9260": "三星 Galaxy S24+", "SM-S9210": "三星 Galaxy S24", "SM-S9380": "三星 Galaxy S25 Ultra", "SM-S9360": "三星 Galaxy S25+", "SM-S9310": "三星 Galaxy S25", "SM-S9370": "三星 Galaxy S25 Edge", // 入网型号 SM-S9370,京东/官网核验 // S26 系列(2026 年 1 月发布,国行型号段 SM-S94x) "SM-S9480": "三星 Galaxy S26 Ultra", "SM-S9470": "三星 Galaxy S26+", "SM-S9420": "三星 Galaxy S26", // S 系列 FE "SM-S7110": "三星 Galaxy S23 FE", "SM-S7210": "三星 Galaxy S24 FE", "SM-S7310": "三星 Galaxy S25 FE", // 折叠屏 "SM-F9460": "三星 Galaxy Z Fold5", "SM-F7310": "三星 Galaxy Z Flip5", "SM-F9560": "三星 Galaxy Z Fold6", "SM-F7410": "三星 Galaxy Z Flip6", "SM-F9660": "三星 Galaxy Z Fold7", // 2025.07 国行上市 "SM-F7660": "三星 Galaxy Z Flip7", // 2025.07 国行上市 "SM-F9780": "三星 Galaxy Z Fold8", // 2026.07 国行上市 "SM-F7780": "三星 Galaxy Z Flip8", // 2026.07 国行上市 "SM-F9788": "三星 Galaxy Z Fold8 Ultra", // 三折叠 "SM-F9680": "三星 Galaxy Z Tri Fold", // 三折叠,2025 年底发布 // W 系列心系天下 "SM-W9025": "三星 W25", "SM-W9024": "三星 W24", "SM-W9023": "三星 W23", // A 系列 "SM-A5460": "三星 Galaxy A54", "SM-A5560": "三星 Galaxy A55", "SM-A5660": "三星 Galaxy A56", "SM-A3660": "三星 Galaxy A36", "SM-A5760": "三星 Galaxy A57 5G", // 2026 新机 // ===================== 华为 Huawei ===================== // 来源:consumer.huawei.com + vmall.com + 中关村在线 // 修正:BRA-AL00 实为 Mate 60(原表误标 P60) // ALT-AL10 实为 Mate X5(原表误标 Mate 70) // ADT-AL00 实为 Pura 70 标准版(原表误标 Pura 70) "NOH-AN00": "华为 Mate 40 Pro", "NOH-AL10": "华为 Mate 40 Pro", "OCE-AN10": "华为 Mate 40", "ANA-AN00": "华为 P40", "ELS-AN00": "华为 P40 Pro", // Mate 60 系列 "BRA-AL00": "华为 Mate 60", // 修正:原表标成 P60 "BRA-AL80": "华为 Mate 60 Pro", // 原表缺失,补充 "BRA-AL10": "华为 Mate 60 Pro+", // 补充 "MIS-AL00": "华为 Mate 60 RS 保时捷设计", // 补充 // Mate 70 系列 "CLS-AL00": "华为 Mate 70", // 补充 "CLS-AL10": "华为 Mate 70 Pro", // 原表 ALN-AL80 实为 Mate 60 Pro,已挪走 "PLR-AL00": "华为 Mate 70 Pro+", // 补充 "PLA-AL10": "华为 Mate 70 RS 保时捷设计", // 补充 // Pura 70 系列 "ADY-AL00": "华为 Pura 70", // 原表误标 Pura 70 Pro,修正 "ADT-AL00": "华为 Pura 70 Pro", // 原表误标 Pura 70,修正 "ADT-AL10": "华为 Pura 70 Pro+", // 补充 "HBN-AL00": "华为 Pura 70 Ultra", // 补充 // Pura 80 系列(2025.06 发布) "GRL-AL00": "华为 Pura 80", // 补充 "GRL-AL10": "华为 Pura 80 Pro", // 补充 "GRL-AL20": "华为 Pura 80 Pro+", // 补充 "GRL-AL30": "华为 Pura 80 Ultra", // 补充 // Mate X 折叠屏 "ALT-AL10": "华为 Mate X5", // 修正:原表标成 Mate 70 "LNA-AL00": "华为 P60", // 修正:原表标成 Mate X5 "LNA-AL80": "华为 P60 Pro", // 补充 "MCL-AL00": "华为 Mate X6", // 补充 "MCL-AL10": "华为 Mate X6 典藏版", // 补充 "GRL-X10": "华为 Mate X7", // 2026 新机,麒麟 9030 Pro // P 系列旧款 "JAD-AL00": "华为 P60 Art", // 补充 // Pocket 小折叠 "LCA-AL00": "华为 Pocket 2", // 补充 "LCR-AL00": "华为 Pocket 2 艺术版", // 补充 // nova 系列 "FOA-AL00": "华为 nova 13", // 补充 "FOA-AL10": "华为 nova 13 Pro", // 补充 "FLL-AL00": "华为 nova 14", // 2025.05 发布 "FLL-AL10": "华为 nova 14 Pro", // 补充 "FLL-AL20": "华为 nova 14 Ultra", // 补充 // 畅享 / 麦芒 "GFY-AL00": "华为 畅享 70 Pro", // 补充 "GFY-AL10": "华为 畅享 70", // 补充 // ===================== 荣耀 Honor ===================== // 来源:honor.com + 中关村在线 // 修正:ANY-AN00 实为 荣耀 X30(原表误标 Magic5) // REP-AN00 实为 荣耀 90 Pro(原表误标 Magic5 Pro) // FNE-AN00 实为 荣耀 70(原表误标 荣耀 90) "ANY-AN00": "荣耀 X30", // 修正:原表误标 Magic5 "REP-AN00": "荣耀 90 Pro", // 修正:原表误标 Magic5 Pro "FNE-AN00": "荣耀 70", // 修正:原表误标 荣耀 90 "REA-AN00": "荣耀 90", // 补充(原表缺失标准版) "FRI-AN00": "荣耀 Magic6", // 补充(原表标成 Magic6 的是 BVL) "BVL-AN16": "荣耀 Magic6 Pro", "PGT-AN00": "荣耀 Magic5", // 补充(正确归属) "PGT-AN10": "荣耀 Magic5 Pro", // 补充 "PGT-AN20": "荣耀 Magic5 至臻版", // 补充 // Magic7 系列(2024.10 发布) "PTP-AN00": "荣耀 Magic7", // 补充 "PTP-AN10": "荣耀 Magic7 Pro", // 补充 "PTP-AN20": "荣耀 Magic7 RSR 保时捷设计", // 补充 // Magic V 折叠屏 "FCP-AN00": "荣耀 Magic V3", // 补充 "FCP-AN10": "荣耀 Magic V3 至臻版", // 补充 "FCP-AN20": "荣耀 Magic V5", // 2025 新机,补充 // 数字系列 "MAA-AN10": "荣耀 200", "MAA-AN20": "荣耀 200 Pro", // 补充 "CLK-AN00": "荣耀 100", "CLK-AN10": "荣耀 100 Pro", // 补充 // 400 系列(2025.05 发布,2 亿像素主摄) "MPT-AN00": "荣耀 400", // 补充 "MPT-AN10": "荣耀 400 Pro", // 补充 // X 系列 "FGD-AN00": "荣耀 X50", // 补充 "FGD-AN10": "荣耀 X50 Pro", // 补充 "FGD-AN20": "荣耀 X60", // 补充 // ===================== OPPO ===================== // 来源:oppo.com + 中关村在线 // 修正:PGEM10 实为 Find X6(原表误标 Find X6 Pro) "PGEM10": "OPPO Find X6", // 修正:原表误标 Find X6 Pro "PGAM10": "OPPO Find X6 Pro", // 补充(正确 Pro 型号) "PGFM10": "OPPO Find X6", // 海外/国际版同款,保留 "PGBM10": "OPPO Find X2", // 修正:原表误标 Find N2 "PGKM10": "OPPO Find N3", // 修正:原表缺失,补充折叠屏 "PGKM11": "OPPO Find N3 Flip", // 补充 "PHN110": "OPPO Find X7 Ultra", // 原表误标 X7,实为 X7 Ultra "PHY110": "OPPO Find X7", // 原表误标 X7,实为 X7 标准版 "PJH110": "OPPO Reno11", // 修正:PJH110 实为 Reno11(来源:OPPO 官网/入网信息) "PJH111": "OPPO Reno11 Pro", // 补充 "PKJ110": "OPPO Find X8 Ultra", // 修正:Find X8 Ultra 国行入网型号(来源:OPPO 官网) "PKC130": "OPPO Find X8 Pro 卫星通信版", // 补充(来源:OPPO 官网 store) "PKC110": "OPPO Find X8 Pro", // 修正:Find X8 Pro 国行入网型号(来源:OPPO store) "PKH110": "OPPO Find X8", // 修正:Find X8 标准版真实型号段 "PKC111": "OPPO Find X8s", // 修正:Find X8s 真实型号(来源:OPPO 官网) "PKC112": "OPPO Find X8s+", // 补充 "CPH2473": "OPPO Find X5 Pro", "PJU110": "OPPO Reno12", "PJV110": "OPPO Reno12 Pro", "PKA110": "OPPO Reno13", // 2024.11 发布 "PKA111": "OPPO Reno13 Pro", // 补充 "PLA110": "OPPO Reno14", // 2025 新机 "PLA111": "OPPO Reno14 Pro", // 补充 "CPH2603": "OPPO A3 Pro", // 补充 "CPH2605": "OPPO A3", // 补充 // ===================== vivo / iQOO ===================== // 来源:vivo.com + 中关村在线 "V2254A": "vivo X90 Pro+", "V2241A": "vivo X90", "V2227A": "vivo X90 Pro", "V2309A": "vivo X100", "V2324A": "vivo X100 Pro", "V2325A": "vivo X100 Ultra", // 补充(原表缺失 Ultra) "V2419A": "vivo X200", // 2024.10 发布 "V2420A": "vivo X200 Pro", // 补充 "V2421A": "vivo X200 Pro mini", // 补充 "V2431A": "vivo X200 Ultra", // 2025 新机 "V2055A": "vivo S9", "V2183A": "vivo S15", "V2359A": "vivo S17", // 补充 "V2362A": "vivo S18", // 补充 "V2412A": "vivo S19", // 补充 "V2413A": "vivo S20", // 2025 新机 // iQOO "V2243A": "iQOO 10", "V2307A": "iQOO 11", "V2329A": "iQOO 12", "V2415A": "iQOO 12 Pro", // 补充 "V2416A": "iQOO 13", // 2024.10 发布 "V2425A": "iQOO Neo10", // 补充 "V2426A": "iQOO Neo10 Pro", // 补充 "V2435A": "iQOO Neo11", // 2025 新机 // ===================== 小米 / 红米 ===================== // 来源:mi.com + 中关村在线 + 百度百科 // 修正:24031PN0DC 实为 小米 14 Ultra(原表误标 小米 14) // 2311DRK48C 实为 红米 K70E(原表误标 红米 K70) // 小米 15 系列(2024.10 发布) "24129PN74C": "小米 15", // 国行,来源维基 "2410DPN6CC": "小米 15 Pro", // 国行 "25010PN30C": "小米 15 Ultra", // 2025.02 发布 "25019PNF3C": "小米 15 Ultra 卫星版", // 天通卫星 "2410DRK2CC": "小米 15S Pro", // 2025.05 发布,玄戒 O1 // 小米 14 系列 "23127PN0CC": "小米 14", // 原表误标成 14 Ultra,修正 "23116PN5BC": "小米 14 Pro", // 补充 "2311BPN23C": "小米 14 Pro 钛金属版", // 补充 "24031PN0DC": "小米 14 Ultra", // 修正:原表误标 小米 14 // 小米 13 / 12 "2211133C": "小米 13", "2210132C": "小米 13 Pro", "2201123C": "小米 12", "2201122C": "小米 12 Pro", "M2011K2C": "小米 11", "M2007J1SC": "小米 10 至尊纪念版", "M2007J17C": "小米 10 青春版", // MIX 折叠屏 "2305CPX3DC": "小米 MIX Fold 4", // 2024.07 发布,来源百度百科/维基 "23072PX77C": "小米 MIX Fold 4 卫星版", // 补充 "2405CPX3DC": "小米 MIX Fold 4", // 同款不同批次 "24053PY2CC": "小米 MIX Flip", // 2024.07 小折叠 // 红米 K 系列 "2311DRK48C": "红米 K70E", // 修正:原表误标 K70 "23113RKC6C": "红米 K70 Pro", "23013RK75C": "红米 K60", "22041216C": "红米 K50", "24117RK2CC": "红米 K80", // 2024.11 发布 "24117RK2CC-D": "红米 K80 Pro", // 补充 "25018RK3CC": "红米 K80 至尊版", // 2025 新机 "2502RK3CC": "红米 K90", // 2025 新机 // 红米 Note / Turbo "23078RKD5C": "红米 Note 12 Turbo", "2312DRA50C": "红米 Note 13 Pro", "2407DRN2CC": "红米 Note 14 Pro", // 补充 "2407DRN2CC-D": "红米 Note 14 Pro+", // 补充 "24116RKC7C": "红米 Turbo 3", // 补充 "25053RT8CC": "红米 Turbo 4", // 2025 新机 // 红米 数字系列 "24090RA3CC": "红米 13", // 补充 "25010RN3CC": "红米 14", // 补充 // ===================== 一加 OnePlus ===================== // 来源:oneplus.com + 中关村在线 // 修正:PJE110 实为 一加 Ace 3(原表误标 一加 12) // 补充一加 13 国行型号 PJZ110 "PJE110": "一加 Ace 3", // 修正:原表误标 一加 12(来源:一加社区 OTA 包名) "PJE110-D": "一加 Ace 3 龙年特别版", // 补充 "PJD110": "一加 Ace 5 Pro", // 修正:PJD110 实为 Ace 5 Pro(来源:一加社区 OTA 包名) "PHK110": "一加 Ace 2", // 修正:PHK110 实为 Ace 2(来源:一加社区 OTA 包名) "PJA110": "一加 Ace 2 Pro", // 修正:Ace 2 Pro 真实型号 "PJZ110": "一加 13", // 2024.10 国行,超声波指纹(来源:一加社区 OTA 包名) "PKX110": "一加 13T", // 2025.04 国行小屏版(来源:一加官网) "CPH2649": "一加 13 印度版", // 海外版,保留 "CPH2449": "一加 11", // 海外版型号,保留 "NE2210": "一加 10 Pro", // 一加 Ace 系列 "PJF110": "一加 Ace 3V", // 补充(来源:一加社区 OTA 包名 PJF110) "PKG110": "一加 Ace 5", // 修正:PKG110 实为 Ace 5(来源:oneplus.com/ace-5 入网型号) "PKG111": "一加 Ace 5 至尊版", // 2025 新机,补充 // ===================== realme / 真我 ===================== // 来源:realme.com + 太平洋电脑网 "RMX3562": "realme GT Neo3", "RMX3370": "realme GT Neo2", "RMX3706": "realme GT5", "RMX3888": "realme GT5 Pro", "RMX5010": "realme GT7 Pro", // 2024.11 发布,骁龙 8 Elite "RMX5011": "realme GT7 Pro 竞速版", // 补充 "RMX5085": "realme GT7T", // 补充 "RMX6688": "realme GT7", // 2025 新机 "RMX5000": "realme 13+", // 补充 "RMX5002": "realme 13 Pro", // 补充 "RMX5070": "realme 14 5G", // 2025 新机 "RMX3940": "realme 14x 5G", // 补充 "RMX3997": "realme 12x 5G", // 补充 "RMX3998": "realme Narzo 70x 5G", // 补充 // ===================== Google Pixel ===================== // 来源:Google 官网 store.google.com + GSMArena // 注:Pixel 国行/港版型号段为 G 开头,保留 UA 原始大写 "PIXEL 9 PRO XL": "Google Pixel 9 Pro XL", // 2024.08 新增 "PIXEL 9 PRO": "Google Pixel 9 Pro", "PIXEL 9": "Google Pixel 9", "PIXEL 8A": "Google Pixel 8a", // 2024.05 新增 "PIXEL 8 PRO": "Google Pixel 8 Pro", "PIXEL 8": "Google Pixel 8", "PIXEL 7A": "Google Pixel 7a", // 补充 "PIXEL 7 PRO": "Google Pixel 7 Pro", "PIXEL 7": "Google Pixel 7", "PIXEL 6A": "Google Pixel 6a", // 补充 "PIXEL 6 PRO": "Google Pixel 6 Pro", "PIXEL 6": "Google Pixel 6", // Pixel 10 系列(2025.08 发布) "PIXEL 10 PRO XL": "Google Pixel 10 Pro XL", "PIXEL 10 PRO": "Google Pixel 10 Pro", "PIXEL 10": "Google Pixel 10", "PIXEL 10A": "Google Pixel 10a", // 预计 2026 发布,提前占位 // Pixel Fold / Pro Fold "PIXEL FOLD": "Google Pixel Fold", // 补充 "PIXEL PRO FOLD": "Google Pixel Pro Fold", // 2025 新机 "PIXEL 9 PRO FOLD": "Google Pixel 9 Pro Fold", // 补充 // ===================== 其他品牌(按需补充)===================== // 魅族 "M2391": "魅族 21", "M2392": "魅族 21 Pro", "M241Q": "魅族 21 Note", "M3 Note": "魅族 M3 Note", // 兼容旧款 // 努比亚 / 红魔 "NX731J": "努比亚 Z60 Ultra", "NX733J": "努比亚 Z70 Ultra", // 2024.11 "NX736J": "努比亚 Z80 Ultra", // 2025 新机 "NX789J": "红魔 9 Pro", "NX812J": "红魔 10 Pro", // 2024.11 "NX813J": "红魔 10 Pro+", // 补充 "NX821J": "红魔 10S Pro", // 2025 新机 // 联想 / 摩托罗拉 "XT2409-2": "摩托罗拉 moto X50 Ultra", // 补充 "XT2451-1": "摩托罗拉 Razr 50", // 2024 竖折 "XT2453-1": "摩托罗拉 Razr 60", // 2025 竖折 "XT2454-1": "摩托罗拉 Razr 60 Ultra", // 补充 // 华硕 "AI2401": "华硕 Zenfone 11 Ultra", // 2024 "AI2501": "华硕 Zenfone 12 Ultra", // 2025 // 索尼 "XQ-DE72": "索尼 Xperia 1 VI", // 2024 "XQ-DE82": "索尼 Xperia 1 VII", // 2025 // 诺基亚 "N158V": "诺基亚 G42 5G", // 中兴 "ZTE A2024": "中兴 Axon 50 Ultra", "ZTE A2025": "中兴 Axon 60 Ultra", // 补充 // 联想拯救者 "TB-9707F": "联想 拯救者 Y700 游戏平板", // 补充(平板类,按需保留) }