feat: publish privacy policy page
This commit is contained in:
67
privacy.html
Normal file
67
privacy.html
Normal file
@@ -0,0 +1,67 @@
|
|||||||
|
<!doctype html>
|
||||||
|
<html lang="zh-CN">
|
||||||
|
<head>
|
||||||
|
<meta charset="utf-8" />
|
||||||
|
<meta name="viewport" content="width=device-width,initial-scale=1" />
|
||||||
|
<title>Bot 隐私政策 / Privacy Policy</title>
|
||||||
|
<style>
|
||||||
|
body { font-family: system-ui, -apple-system, Segoe UI, Roboto, Helvetica, Arial, "PingFang SC", "Noto Sans CJK SC", "Microsoft YaHei", sans-serif; line-height: 1.6; margin: 0; padding: 24px; color: #111; }
|
||||||
|
main { max-width: 860px; margin: 0 auto; }
|
||||||
|
h1,h2 { line-height: 1.25; }
|
||||||
|
code { background: #f6f8fa; padding: 2px 6px; border-radius: 6px; }
|
||||||
|
.muted { color: #555; }
|
||||||
|
ul { padding-left: 18px; }
|
||||||
|
hr { border: 0; border-top: 1px solid #eee; margin: 20px 0; }
|
||||||
|
</style>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<main>
|
||||||
|
<h1>Bot 隐私政策 / Privacy Policy</h1>
|
||||||
|
<p class="muted">最后更新:2026-03-10</p>
|
||||||
|
|
||||||
|
<h2>1. 我们是谁</h2>
|
||||||
|
<p>本隐私政策适用于与本 Telegram Bot(以下简称“Bot”)的交互。本 Bot 用于提供个人助理与技术学习/排障相关的对话服务。</p>
|
||||||
|
|
||||||
|
<h2>2. 我们收集哪些数据</h2>
|
||||||
|
<ul>
|
||||||
|
<li><b>你发送的消息内容</b>(文本、命令、你主动提供的上下文)。</li>
|
||||||
|
<li><b>基础元数据</b>(如 Telegram 提供的 chat_id、消息时间戳、用户名/昵称等,用于路由回复与防滥用)。</li>
|
||||||
|
<li><b>运行日志</b>:为排障与稳定性,系统可能记录错误日志与请求失败信息(可能包含部分消息片段或上下文)。</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<h2>3. 数据如何被使用</h2>
|
||||||
|
<ul>
|
||||||
|
<li>用于生成回复、执行你请求的任务(例如课程内容生成、命令模拟、排障建议)。</li>
|
||||||
|
<li>用于安全控制与反滥用(例如鉴权、速率限制)。</li>
|
||||||
|
<li>用于系统稳定性与问题定位(例如网络错误、API 调用失败)。</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<h2>4. 数据共享与第三方</h2>
|
||||||
|
<p>Bot 运行依赖以下第三方服务,数据会按功能需要流转:</p>
|
||||||
|
<ul>
|
||||||
|
<li><b>Telegram</b>:消息收发与基础元数据由 Telegram 处理。</li>
|
||||||
|
<li><b>模型/推理服务提供商</b>:为生成回复,消息内容可能会被发送到大模型推理服务(以完成你的请求)。</li>
|
||||||
|
<li><b>托管/网络服务</b>:用于运行 Bot 与相关服务的基础设施提供商可能处理网络请求与日志。</li>
|
||||||
|
</ul>
|
||||||
|
<p>我们不会将你的个人数据出售给任何第三方。</p>
|
||||||
|
|
||||||
|
<h2>5. 数据保留</h2>
|
||||||
|
<p>我们会在实现功能与保障稳定性的必要范围内保留数据(例如对话上下文、课程数据、运行日志)。保留时间可能因用途不同而不同。</p>
|
||||||
|
|
||||||
|
<h2>6. 你的权利</h2>
|
||||||
|
<ul>
|
||||||
|
<li>你可以随时停止使用 Bot。</li>
|
||||||
|
<li>你可以请求导出或删除与你相关的本地存储数据(在技术可行范围内)。</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<h2>7. 安全</h2>
|
||||||
|
<p>我们采取合理的技术措施保护数据(例如服务访问控制、最小权限原则)。但任何系统都无法保证绝对安全。</p>
|
||||||
|
|
||||||
|
<h2>8. 联系方式</h2>
|
||||||
|
<p>如需数据删除/导出或有隐私问题,请通过你与 Bot 的对话渠道联系管理员。</p>
|
||||||
|
|
||||||
|
<hr />
|
||||||
|
<p class="muted">English summary: We process the messages you send to provide replies and task automation. Basic Telegram metadata and operational logs may be stored for reliability and debugging. Data may be transmitted to Telegram and model providers as needed to generate responses. We do not sell personal data. You may request deletion/export where feasible.</p>
|
||||||
|
</main>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
@@ -22,6 +22,7 @@ USERS = {
|
|||||||
|
|
||||||
TASKS_FILE = os.path.join(os.path.dirname(__file__), "COURSE_TASKS.json")
|
TASKS_FILE = os.path.join(os.path.dirname(__file__), "COURSE_TASKS.json")
|
||||||
HTML_FILE = os.path.join(os.path.dirname(__file__), "index.html")
|
HTML_FILE = os.path.join(os.path.dirname(__file__), "index.html")
|
||||||
|
PRIVACY_FILE = os.path.join(os.path.dirname(__file__), "privacy.html")
|
||||||
SANDBOX = LinuxSandbox()
|
SANDBOX = LinuxSandbox()
|
||||||
|
|
||||||
|
|
||||||
@@ -94,7 +95,7 @@ class LinuxLearningHandler(http.server.BaseHTTPRequestHandler):
|
|||||||
parsed = urllib.parse.urlparse(self.path)
|
parsed = urllib.parse.urlparse(self.path)
|
||||||
path = parsed.path
|
path = parsed.path
|
||||||
|
|
||||||
if path not in ["/", "/api/login", "/api/logout", "/api/course", "/api/health"]:
|
if path not in ["/", "/privacy", "/privacy.html", "/api/login", "/api/logout", "/api/course", "/api/health"]:
|
||||||
auth_header = self.headers.get("Authorization", "")
|
auth_header = self.headers.get("Authorization", "")
|
||||||
token = self.headers.get("X-Token", "")
|
token = self.headers.get("X-Token", "")
|
||||||
if not self.check_auth(auth_header, token) and "xiaoxiaoluohao.indevs.in" in self.headers.get("Host", ""):
|
if not self.check_auth(auth_header, token) and "xiaoxiaoluohao.indevs.in" in self.headers.get("Host", ""):
|
||||||
@@ -105,6 +106,10 @@ class LinuxLearningHandler(http.server.BaseHTTPRequestHandler):
|
|||||||
self.send_file(HTML_FILE, "text/html; charset=utf-8")
|
self.send_file(HTML_FILE, "text/html; charset=utf-8")
|
||||||
return
|
return
|
||||||
|
|
||||||
|
if path in {"/privacy", "/privacy.html"}:
|
||||||
|
self.send_file(PRIVACY_FILE, "text/html; charset=utf-8")
|
||||||
|
return
|
||||||
|
|
||||||
if path == "/api/health":
|
if path == "/api/health":
|
||||||
self.send_json({"ok": True, "cwd": SANDBOX.cwd, "user": SANDBOX.user, "modules": len(COURSE.get("modules", []))})
|
self.send_json({"ok": True, "cwd": SANDBOX.cwd, "user": SANDBOX.user, "modules": len(COURSE.get("modules", []))})
|
||||||
return
|
return
|
||||||
|
|||||||
Reference in New Issue
Block a user