59 lines
1.5 KiB
Python
59 lines
1.5 KiB
Python
from fastapi import Request
|
|
|
|
from models.blog import BlogVisit
|
|
|
|
|
|
def get_client_ip(request):
|
|
"""从请求中获取客户端IP地址"""
|
|
x_forwarded_for = request.headers.get("X-Forwarded-For")
|
|
if x_forwarded_for:
|
|
return x_forwarded_for.split(',')[0]
|
|
return request.client.host
|
|
|
|
|
|
def get_user_agent_info(user_agent: str):
|
|
"""解析User-Agent获取操作系统和浏览器信息"""
|
|
# 使用正则表达式进行更精确的解析
|
|
os = "Unknown"
|
|
browser = "Unknown"
|
|
|
|
# 操作系统检测
|
|
if "Windows NT" in user_agent:
|
|
os = "Windows"
|
|
elif "Macintosh" in user_agent:
|
|
os = "Mac OS"
|
|
elif "Linux" in user_agent:
|
|
os = "Linux"
|
|
elif "Android" in user_agent:
|
|
os = "Android"
|
|
elif "iPhone" in user_agent or "iPad" in user_agent:
|
|
os = "iOS"
|
|
|
|
# 浏览器检测
|
|
if "Chrome" in user_agent:
|
|
browser = "Chrome"
|
|
elif "Firefox" in user_agent:
|
|
browser = "Firefox"
|
|
elif "Safari" in user_agent and "Chrome" not in user_agent:
|
|
browser = "Safari"
|
|
elif "Edge" in user_agent:
|
|
browser = "Edge"
|
|
elif "MSIE" in user_agent or "Trident" in user_agent:
|
|
browser = "Internet Explorer"
|
|
|
|
return os, browser
|
|
|
|
|
|
def get_blog_visit(request: Request, blog_id: int) -> BlogVisit:
|
|
ip = get_client_ip(request)
|
|
user_agent = request.headers.get("User-Agent", "")
|
|
os, browser = get_user_agent_info(user_agent)
|
|
|
|
return BlogVisit(
|
|
ip=ip,
|
|
os=os,
|
|
browser=browser,
|
|
uri=request.url.path,
|
|
blog_id=blog_id
|
|
)
|