- git 初始化 + .gitignore 补全(根 .env / logs / instance / __pycache__ 等) - 修复 utils/.gitignore 误将整个 utils/ 源码层忽略的问题,补入全部工具源码(含 ip2region.xdb) - 含后端全部代码:application / extensions / utils / config / migrations - 含前端 ui/(后续整体迁走) - 不含根 .env(含密钥,本地保留) Co-Authored-By: Claude <noreply@anthropic.com>
75 lines
2.1 KiB
Python
75 lines
2.1 KiB
Python
"""
|
||
User-Agent解析工具模块
|
||
=============================================================
|
||
|
||
提供HTTP请求User-Agent的解析功能:
|
||
- parse_user_agent: 解析操作系统和浏览器信息
|
||
"""
|
||
|
||
import re
|
||
|
||
|
||
def parse_user_agent():
|
||
"""
|
||
解析User-Agent,获取操作系统和浏览器信息
|
||
|
||
通过正则匹配User-Agent字符串,识别客户端操作系统和浏览器类型。
|
||
支持 Windows、macOS、Linux、Android、iOS 及主流浏览器识别。
|
||
|
||
Returns:
|
||
dict: 包含os和browser的字典
|
||
{
|
||
'os': 'Windows 10', # 操作系统信息
|
||
'browser': 'Chrome' # 浏览器名称
|
||
}
|
||
无法识别时返回 '未知'
|
||
"""
|
||
from flask import request
|
||
|
||
user_agent = request.headers.get('User-Agent', '')
|
||
|
||
result = {
|
||
'os': '未知',
|
||
'browser': '未知'
|
||
}
|
||
|
||
if not user_agent:
|
||
return result
|
||
|
||
ua_lower = user_agent.lower()
|
||
|
||
# 操作系统识别规则(按优先级从高到低排列)
|
||
os_patterns = [
|
||
(r'windows nt 10\.0', 'Windows 10'),
|
||
(r'windows nt 6\.1', 'Windows 7'),
|
||
(r'windows nt 6\.2', 'Windows 8'),
|
||
(r'windows nt 6\.3', 'Windows 8.1'),
|
||
(r'windows nt', 'Windows'),
|
||
(r'mac os x', 'macOS'),
|
||
(r'linux', 'Linux'),
|
||
(r'android', 'Android'),
|
||
(r'iphone', 'iOS'),
|
||
(r'ipad', 'iOS'),
|
||
]
|
||
|
||
for pattern, os_name in os_patterns:
|
||
if re.search(pattern, ua_lower):
|
||
result['os'] = os_name
|
||
break
|
||
|
||
# 浏览器识别规则(按优先级从高到低排列)
|
||
browser_patterns = [
|
||
(r'edg', 'Edge'), # Edge 浏览器(基于Chromium)
|
||
(r'chrome', 'Chrome'), # Chrome 浏览器
|
||
(r'safari', 'Safari'), # Safari 浏览器
|
||
(r'firefox', 'Firefox'),# Firefox 浏览器
|
||
(r'msie', 'IE'), # Internet Explorer
|
||
(r'trident', 'IE'), # IE 11(Trident内核)
|
||
]
|
||
|
||
for pattern, browser_name in browser_patterns:
|
||
if re.search(pattern, ua_lower):
|
||
result['browser'] = browser_name
|
||
break
|
||
|
||
return result |