chore: 基线提交(重构前代码快照)
- 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>
This commit is contained in:
@@ -0,0 +1,75 @@
|
||||
"""
|
||||
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
|
||||
Reference in New Issue
Block a user