三亩地 三亩地SAN MU DI · CODE DIARY
ARTICLE DETAIL

日记详情

真实记录编程学习的某一天,欢迎挑你感兴趣的翻一翻。

常用App User-Agent大全:从原理到实战的完整指南

常用App User-Agent大全:从原理到实战的完整指南

1. 项目概述:为什么我们需要一份“常用App User-Agent大全”?

在移动互联网和Web开发的世界里,User-Agent(用户代理)字符串是一个看似不起眼,却至关重要的“身份证”。它是一串由浏览器或App发送给服务器的文本,告诉服务器:“我是谁,我来自哪里,我能做什么”。对于开发者、数据分析师、爬虫工程师乃至安全研究员来说,一份详实可靠的常用App User-Agent大全,就像一本随时可以查阅的“通讯录”,能解决大量实际问题。

我最初整理这份大全,源于一次线上故障排查。我们的服务端日志突然出现大量异常请求,响应码飙升。通过日志分析,发现这些请求都来自一个陌生的User-Agent,里面包含了某个小众视频App的标识。如果没有预先知道这个App的UA特征,我们可能需要花费数小时去猜测、搜索,甚至联系用户确认。而手头有一份大全,我们瞬间就定位到了问题源头:该App的新版本采用了非标准的协议实现,触发了我们服务端的兼容性逻辑。这次经历让我意识到,User-Agent不仅仅是技术参数,更是连接客户端与服务端、理解用户行为的第一手情报。

这份大全能做什么?首先,对于后端开发者,它是进行设备识别、流量统计、兼容性适配和反爬虫策略制定的基础数据。比如,你可以根据UA判断用户来自微信内置浏览器、抖音App还是原生Safari,从而提供差异化的页面样式或功能。其次,对于爬虫与数据采集工作者,正确的UA是模拟真实用户请求、绕过基础反爬机制的“敲门砖”。再者,对于产品与运营同学,分析不同客户端的UA分布,能清晰勾勒出用户画像和渠道来源。简单来说,无论你是想“认识”你的用户,还是想“伪装”成一个普通用户,都离不开对User-Agent的深刻理解。

2. User-Agent的核心结构与解析逻辑

一个完整的User-Agent字符串并非随意拼凑,它遵循着一定的结构和约定,虽然各家实现略有差异,但万变不离其宗。理解这个结构,是有效使用和整理UA大全的前提。

2.1 标准格式拆解

一个典型的现代User-Agent通常包含以下部分,以空格分隔:

Mozilla/5.0 (平台信息; 加密信息; 操作系统信息; 语言) 核心引擎信息 浏览器/App信息

我们来拆解一个实例:Mozilla/5.0 (iPhone; CPU iPhone OS 15_4 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148 MicroMessenger/8.0.20(0x1800142f)

  1. Mozilla/5.0:这是一个历史遗留的兼容性标识,几乎所有现代浏览器和WebView都以此开头,用于向那些只认识Netscape(Mozilla)的古老网站表明身份。它本身已不包含实际浏览器信息。
  2. (平台信息; ...):括号内的部分提供了设备的核心环境信息。
    • iPhone:设备类型。
    • CPU iPhone OS 15_4 like Mac OS X:操作系统详情。CPU iPhone OS 15_4表示iOS 15.4,like Mac OS X是历史兼容表述。
    • 还可能包含iPadLinux armv7l(安卓设备)、Windows NT 10.0(Windows 10)等。
  3. AppleWebKit/605.1.15:这是渲染引擎(WebKit)及其版本号。WebKit是Safari、Chrome(早期)、以及绝大多数iOS和安卓内置WebView的渲染核心。
  4. (KHTML, like Gecko):另一个历史兼容性声明,表示兼容KHTML和Gecko(Firefox的渲染引擎)引擎的网站。
  5. Mobile/15E148:移动设备标识及版本,常见于iOS设备。
  6. MicroMessenger/8.0.20(0x1800142f)这是最关键的部分——客户端标识MicroMessenger明确指示这是微信内置浏览器,8.0.20是微信版本号,括号内是构建号。

注意:许多App的WebView会将自己的标识放在最后,但也有一些会修改中间部分(如渲染引擎版本)。因此,识别App的关键在于寻找其独特的品牌名,如MicroMessenger(微信)、DingTalk(钉钉)、ToutiaoMicroApp(今日头条小程序)等。

2.2 移动端App UA的特殊性

与PC浏览器相对规范的UA不同,移动端App的User-Agent更加多样化且“狡猾”:

  • 信息嵌套:App内嵌的WebView(如微信、抖音)的UA,会在系统WebView的UA基础上,追加自己的标识。这导致了UA字符串可能非常长。
  • 动态变化:同一款App,不同版本、不同厂商定制的系统(如小米、华为),其UA细节可能不同。例如,安卓端微信的UA会包含设备型号信息。
  • 可伪造性:开发者可以完全自定义WebView发送的UA字符串。因此,一些App出于隐私或统一化考虑,会发送简化或修改后的UA。
  • 关键标识位置不固定:虽然大多在末尾,但务必以搜索关键品牌词为准,而不是机械地截取最后一段。

理解这些特性,我们在使用UA大全时就不能生搬硬套,而应掌握其核心模式,进行模糊匹配或正则表达式匹配。

3. 常用App User-Agent大全实录与使用指南

以下是我在多年开发和排查中积累、验证并持续更新的一部分常用App User-Agent。我将它们分类列出,并附上关键特征说明和典型使用场景。

3.1 社交与通讯类

这类App的流量极大,且其内置浏览器行为与标准浏览器有显著差异。

  • 微信(iOS)Mozilla/5.0 (iPhone; CPU iPhone OS 16_5 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148 MicroMessenger/8.0.39(0x1800272f) NetType/WIFI Language/zh_CN

    • 关键特征MicroMessenger。包含NetType(网络类型)和Language(语言)信息。
    • 场景:适配微信H5页面、处理JSSDK授权、识别微信内分享来源。
  • 微信(Android)Mozilla/5.0 (Linux; Android 12; SM-G988B Build/SP1A.210812.016; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/105.0.5195.136 Mobile Safari/537.36 MicroMessenger/8.0.25.2200(0x2800195d) WeChat/arm64 Weixin NetType/4G Language/zh_CN ABI/arm64

    • 关键特征:同样包含MicroMessenger,但前缀是标准的安卓WebView格式(含AndroidBuildwvChrome/... Safari/...),后面还跟了WeChatWeixinABI(应用二进制接口)等丰富信息。
    • 场景:更精细的设备与网络环境判断。
  • QQ(内置浏览器)Mozilla/5.0 (iPhone; CPU iPhone OS 16_5 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/16.5 Mobile/15E148 Safari/604.1 QQ/8.9.50.1000

    • 关键特征:末尾的QQ/版本号。注意,它可能非常像Safari,直到最后才出现QQ标识。
    • 场景:识别QQ系流量,处理QQ空间或聊天窗口内打开的链接。
  • 钉钉Mozilla/5.0 (Linux; Android 12; SM-G981B Build/SP1A.210812.016; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/105.0.5195.136 Mobile Safari/537.36 DingTalk/6.5.50.10 Channel/1002000001

    • 关键特征DingTalk。常带有Channel参数,可能用于区分组织或渠道。
    • 场景:企业应用、OA系统在钉钉内的适配。

3.2 内容与娱乐类

这类App是短视频、资讯消费的主要入口,其WebView特性需要重点关注。

  • 抖音(iOS)Mozilla/5.0 (iPhone; CPU iPhone OS 16_5 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148 BytedanceWebview/douyin

    • 关键特征BytedanceWebview/douyinaweme。抖音的UA相对简洁,直接表明字节跳动WebView和抖音。
    • 场景:适配抖音内嵌H5、小游戏,分析来自抖音的引流。
  • 抖音(Android)Mozilla/5.0 (Linux; Android 10; KSA-AL10 Build/HONORKSA-AL10; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/105.0.5195.136 Mobile Safari/537.36 Aweme/12.0.0

    • 关键特征Aweme(抖音国际版名)。
  • 今日头条Mozilla/5.0 (Linux; Android 10; MI 8 Build/QKQ1.190828.002; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/105.0.5195.136 Mobile Safari/537.36 NewsArticle/8.9.5 tt-android

    • 关键特征NewsArticleToutiaott-android也是明显标识。
    • 场景:资讯类页面在头条内的展示优化。
  • 微博(Weibo)Mozilla/5.0 (iPhone; CPU iPhone OS 16_5 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148 Weibo (iPhone13,3__weibo__12.10.2__iphone__os16.5)

    • 关键特征Weibo以及括号内详细的设备、版本、系统信息。格式非常独特。
    • 场景:处理微博卡片分享、微博登录授权回调。
  • 小红书Mozilla/5.0 (iPhone; CPU iPhone OS 16_5 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148 xhs/5.55.2 (iPhone 13 Pro; iOS 16.5; Scale/3.00)

    • 关键特征xhs(小红书缩写)。同样包含非常详细的设备描述。
    • 场景:社区内容、电商链接在小红书内的打开适配。

3.3 工具与浏览器类

这类包括系统浏览器和常用工具App。

  • Safari (iOS)Mozilla/5.0 (iPhone; CPU iPhone OS 16_5 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/16.5 Mobile/15E148 Safari/604.1

    • 关键特征:标准的iOS Safari格式,包含VersionSafari标识,没有其他App附加信息。
    • 场景:作为iOS端标准浏览器的基准。
  • Chrome (Android)Mozilla/5.0 (Linux; Android 12; SM-G998B) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/105.0.0.0 Mobile Safari/537.36

    • 关键特征Chrome/版本号。这是安卓端最标准的移动Chrome浏览器。
    • 场景:作为安卓端标准浏览器的基准。
  • 支付宝(Alipay)Mozilla/5.0 (Linux; Android 12; SM-G998B Build/SP1A.210812.016; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/105.0.5195.136 Mobile Safari/537.36 AlipayDefined(nt:4G,ws:720|1280|2.0) AliApp(AP/10.3.80.8000) AlipayClient/10.3.80.8000 Language/zh-Hans

    • 关键特征AliAppAlipayClient。信息极其丰富,包含网络、屏幕尺寸、像素密度等。
    • 场景:支付场景、生活号、小程序后端识别。
  • UC浏览器Mozilla/5.0 (Linux; U; Android 12; zh-CN; SM-G998B Build/SP1A.210812.016) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/105.0.5195.136 UCBrowser/13.5.5.1185 Mobile Safari/537.36

    • 关键特征UCBrowser。注意其格式在Chrome/...之后插入了自己的标识。
    • 场景:识别仍有相当市场份额的第三方浏览器。

3.4 如何使用这份大全:匹配策略与代码示例

拥有大全只是第一步,关键在于如何高效、准确地在代码中使用。我强烈建议使用正则表达式进行模糊匹配,而不是简单的字符串相等判断。

核心策略:匹配App的唯一性关键词,并忽略版本号等变动部分。

Python示例(用于服务端识别或爬虫)

import re def detect_app_from_ua(user_agent): ua = user_agent or '' ua_lower = ua.lower() # 定义App关键词映射(关键词:App名称) app_patterns = { r'micromessenger': '微信', r'wechat': '微信', r'dingtalk': '钉钉', r'qq/': 'QQ', r'bytedancewebview.*douyin|aweme/': '抖音', r'newsarticle|toutiao': '今日头条', r'weibo': '微博', r'xhs/': '小红书', r'alipayclient|aliapp\(ap': '支付宝', r'ucbrowser': 'UC浏览器', # 浏览器类 r'mobile.*safari.*version/': 'iOS Safari', # 需排除其他App r'chrome/.*mobile.*safari/537.36$': 'Android Chrome', # 注意结尾匹配,排除WebView } detected_app = '未知浏览器' for pattern, app_name in app_patterns.items(): if re.search(pattern, ua_lower, re.IGNORECASE): # 需要排除一些误判:如果匹配到微信,但UA里也有Safari,那还是微信。 # 此处简化处理,顺序匹配,更复杂的逻辑可以优化优先级。 detected_app = app_name break # 高级判断:区分安卓WebView和纯Chrome浏览器 # 一个简单规则:如果包含“wv”且包含“Chrome”,但末尾不是简单的 Safari/537.36,很可能是App WebView if 'android' in ua_lower and 'wv' in ua_lower and 'chrome' in ua_lower: # 如果已经匹配到具体App(如微信),则不变。否则标记为“安卓App WebView” if detected_app == 'Android Chrome': detected_app = '安卓App WebView (未知)' return detected_app # 测试 test_ua = "Mozilla/5.0 (iPhone; CPU iPhone OS 16_5 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148 MicroMessenger/8.0.39(0x1800272f) NetType/WIFI Language/zh_CN" print(detect_app_from_ua(test_ua)) # 输出:微信

实操心得:在实际的后端日志分析中,我通常会先将UA字段通过上述函数处理,生成一个app_source字段,再存入数据库或日志系统。这样在做数据统计、问题排查时,可以直接按app_source分组查询,效率远高于在海量原始UA文本中LIKE '%MicroMessenger%'

4. 服务端适配与反爬虫中的UA实战

User-Agent在服务端开发中扮演着双重角色:既是适配指引,也是安全防线。

4.1 基于UA的差异化服务

根据不同的UA,服务端可以返回最合适的内容,提升用户体验。

  • 样式适配:向微信、QQ等内置浏览器返回更紧凑的页面布局(因为顶部有导航栏),而向Safari/Chrome返回标准布局。
  • 功能开关:某些高级HTML5功能可能在老版本WebView中支持不佳。通过UA判断内核版本(如AppleWebKit/537.36中的版本号,或Chrome/105),决定是否启用这些功能。
  • 下载引导:当检测到用户来自移动端浏览器访问你的App下载页时,可以自动弹出应用商店跳转提示;而当来自微信内时,则提示“点击右上角在浏览器打开”,因为微信内通常无法直接下载安装包。

Nginx配置片段示例(重定向到浏览器打开)

# 如果UA包含微信,且访问的是下载页,则重定向到一个引导页 location /download/app { if ($http_user_agent ~* "micromessenger") { return 302 /guide/open-in-browser.html; } # 否则正常返回下载页 try_files $uri $uri/ =404; }

4.2 UA在反爬虫策略中的应用与反制

这是UA最“斗智斗勇”的战场。初级爬虫会使用默认的库UA(如Python-urllib/3.10),这很容易被服务器识别并拒绝。

  • 服务端策略

    1. 缺失或异常UA拦截:直接拒绝没有User-Agent头,或UA为明显爬虫库标识的请求。
    2. 频率限制结合UA:对同一个UA在短时间内的高频请求进行限流。但要注意,很多正常用户可能共享同一个出口IP(如公司网络),所以需结合IP、会话ID等多维度判断。
    3. 验证常见浏览器指纹:真正的浏览器,其UA字符串的格式、字段顺序是符合规范的。可以检查UA是否包含合理的平台、引擎、浏览器信息组合。一个胡乱拼凑的UA很容易被识别。
  • 爬虫端对策(合规前提下)

    1. 轮换UA池:准备一个包含上述大全中各种真实UA的列表,每次请求随机选取一个。这是最基本也是最有效的方法之一。
    2. 匹配上下文:如果你在模拟抖音App的请求,那么你的UA就应该用抖音的,并且其他请求头(如AcceptAccept-Language)也应尽量模仿移动端App。
    3. 注意版本更新:定期更新你的UA池。App会升级,其UA版本号也会变。使用一个过于陈旧的UA(如MicroMessenger/6.0)可能本身就会引起怀疑。

Python爬虫使用UA池示例

import random import requests USER_AGENTS = [ # iOS 微信 "Mozilla/5.0 (iPhone; CPU iPhone OS 16_5 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148 MicroMessenger/8.0.39(0x1800272f) NetType/WIFI Language/zh_CN", # Android 抖音 "Mozilla/5.0 (Linux; Android 10; KSA-AL10 Build/HONORKSA-AL10; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/105.0.5195.136 Mobile Safari/537.36 Aweme/12.0.0", # iOS Safari "Mozilla/5.0 (iPhone; CPU iPhone OS 16_5 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/16.5 Mobile/15E148 Safari/604.1", # Android Chrome "Mozilla/5.0 (Linux; Android 12; SM-G998B) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/105.0.0.0 Mobile Safari/537.36", ] def make_request(url): headers = { 'User-Agent': random.choice(USER_AGENTS), 'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8', 'Accept-Language': 'zh-CN,zh;q=0.9,en;q=0.8', } try: response = requests.get(url, headers=headers, timeout=10) return response except requests.exceptions.RequestException as e: print(f"请求失败: {e}") return None

踩坑记录:我曾遇到一个棘手的反爬策略,服务器不仅检查UA,还会检查Sec-CH-UA(客户端提示)等现代头部。仅更换传统UA无效。后来通过使用seleniumplaywright控制真实浏览器内核,才获取到完整的、被服务器接受的浏览器指纹。这提醒我们,在高安全级别的场景下,UA只是反爬体系中的一环。

5. 常见问题排查与UA收集技巧

在实际工作中,你可能会遇到各种与UA相关的“怪现象”。这里分享一些排查思路和我私藏的UA收集方法。

5.1 典型问题速查表

问题现象可能原因排查步骤与解决方案
页面在某个App内布局错乱,在其他浏览器正常该App的WebView内核版本较旧,或对某些CSS/JS特性支持有差异。1. 从UA中提取WebKit/Chrome版本号。2. 使用此版本号的浏览器进行模拟测试。3. 使用渐进增强或CSS前缀降级方案。
服务端日志出现大量未知UA,导致统计失真。可能是新兴App、小众浏览器,或者是爬虫伪造的UA。1. 将未知UA样本提取出来。2. 搜索关键字段(如品牌名、项目名)。3. 更新本地UA识别规则库。4. 对于明显伪造的(如包含“Spider”、“Bot”但声称是浏览器的),加入过滤规则。
下载功能在微信内失效,提示“请在浏览器打开”。微信等社交App出于安全策略,默认会拦截非用户主动触发的下载链接或某些文件类型。1. 前端提示用户“长按链接复制后到浏览器打开”。2. 服务端检测到微信UA时,返回一个中间引导页,引导用户操作。3. 考虑使用应用宝微下载等平台提供的专用方案。
用户反馈无法登录,但仅限特定手机。可能该手机上的某个App(如定制ROM的浏览器)的UA被你的登录接口误判为非法。1. 让用户提供具体的UA字符串(可引导其访问whatsmyua.org等网站)。2. 分析该UA,调整服务端识别逻辑的宽松度,避免误杀。
爬虫程序刚开始能抓取,很快就被封IP。虽然使用了UA池,但请求频率过高、行为模式过于规律,或被识别出同一IP下使用了过多不同UA。1. 降低请求频率,增加随机延迟。2. 模拟更真实的人类操作间隔。3. 考虑使用高质量的代理IP池,将IP和UA绑定轮换。

5.2 如何持续维护和收集UA

一份静态的UA大全很快就会过时。以下是我保持信息更新的方法:

  1. 主动抓取与分析
    • 在自己的网站或App中,记录并匿名化收集访问日志中的User-Agent(务必遵守隐私政策)。
    • 定期分析日志,找出新出现的、高频的未知UA字符串,进行研究归类。
  2. 利用公开资源
    • WURFLDeviceAtlas:这些是专业的设备识别数据库,包含海量UA信息,但通常是商业服务。
    • GitHub项目:搜索 “user-agent list”、“mobile ua database”,有很多开发者维护的开源列表。
    • 浏览器/设备模拟器:使用开发者工具中的设备模拟功能,可以获取到各种标准设备的最新UA。
  3. 建立自动化更新机制
    • 可以编写一个简单的脚本,定期从可信的公开源(如某个维护良好的GitHub仓库)拉取最新的UA列表,与本地列表合并去重。
    • 在测试环境中,对新收集的UA进行基础验证(如用其发起一个HTTP请求,看服务器是否正常响应)。

一个简单的UA收集脚本思路

# 伪代码:从访问日志中提取并去重存储新UA import re from collections import Counter def extract_new_ua_from_log(log_file_path, known_ua_set): new_ua_list = [] with open(log_file_path, 'r') as f: for line in f: # 假设UA在日志行的特定位置,或用正则匹配 match = re.search(r'"User-Agent":"([^"]+)"', line) if match: ua = match.group(1) if ua not in known_ua_set: new_ua_list.append(ua) known_ua_set.add(ua) # 分析新UA的出现频率 ua_counter = Counter(new_ua_list) return ua_counter.most_common(20) # 返回前20个最常见的新UA # 已知UA集合可以从文件或数据库加载 known_ua = load_known_ua_from_file('known_ua.txt') top_new_uas = extract_new_ua_from_log('/var/log/nginx/access.log', known_ua) for ua, count in top_new_uas: print(f"出现{count}次的新UA: {ua[:100]}...") # 打印前100字符

维护一份活的UA大全,其价值在于它能让你始终对流量来源保持清晰的认知。当下一次再出现“未知”流量冲击时,你就能从容地从自己的知识库中快速找到答案,而不是在互联网上漫无目的地搜索。这份工作看似琐碎,却是构建稳定、可适配、安全的应用服务中不可或缺的一块基石。

← 返回列表