DeepSeek Harness 的智能体记忆与网关。
60.8/100
综合分
132
GitHub 星标
—
npm 周下载
—/5
用户评分
数据截至 2026/11/3 · 周下载取自 npm 全网(含 CI / 镜像),非本站安装数;综合分由星标、活跃度与兼容性检查合成。
自动兼容检查有告警:未发布到 npm registry,仅可从源码安装。
安装命令 · 需先装 dsh CLI 引擎
dsh plugin --profile web add rlaope/deepseek-bot该包不可直接 npm 安装,改从 GitHub 源安装(明细见下方安装检查)
状态速览
判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态信任档位:仅索引
是什么
dsh 原生插件 · platform
安全吗
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
还在维护吗
活跃:最近一次提交在 0 天前
档位由哪些信号合成
本站实装验证(真实安装 L4 覆盖全站;L5 为运行时冒烟或实机截图,覆盖范围小于 L4) · 验证所用 dsh 版本 · 静态安装检查 · 风险分级 · 仓库维护状态。 下方各区块是它的证据明细。
社区实装还没有人打卡 · 装过的第一个就是你
安装兼容性检查⚠ 装前注意未发布到 npm registry,仅可从源码安装
展开查看检查明细 ↓
以下结论由程序自动检查 npm 包、engines 声明与入口文件得出,未做人工实机验证——能装不等于用着没问题。
✗npm 包deepbot(未发布到 npm,仅可源码安装)
✓Node 引擎要求 >=22 · 基线 Node 22.19 满足
✓dsh CLI 依赖未声明 dsh 版本约束
✓入口文件main/exports/bin 已声明
验证方式:npm registry 存在性 + package.json 静态校验 · 最后检查 2026/10/28 06:40:24
安全扫描自动 · 静态分析源码v2.7.0🔵 扫描:含敏感能力尚无人工评估展开查看扫描说明与证据 ↓
安全扫描自动 · 静态分析源码
v2.7.0静态扫描发现插件具备触达本地系统的能力:执行外部命令、读写/删除本地文件、读取剪贴板或密钥类环境变量(至少其一)。这是能力清单,不是危险判定——具体能力项与证据见下方,安装前请自行判断是否需要。
可执行外部命令读写/删除本地文件读取剪贴板或密钥环境变量发起外部网络请求
查看扫描证据(共 133 处,展示前 83 条)
- 读取本地文件index.ts:386
try { overlay = JSON.parse(readFileSync(cfg.selfTestScript, 'utf8'))?.config ?? null } catch { } - 读取本地文件index.ts:401
return existsSync(script) && existsSync(dependency) ? `${windows ? '& ' : ''}${word(process.execPath)} ${word(script)}` : null - 写入本地文件index.ts:466
mkdirSync(stateDir, { recursive: true }) - 写入本地文件index.ts:475
try { appendFileSync(LOG, line + '\n') } catch { } - 写入本地文件index.ts:501
try { writeFileSync(HEALTH, JSON.stringify(health, null, 1)) } catch { } - 读取本地文件index.ts:519
const seed = JSON.parse(readFileSync(process.env.DEEPBOT_SESSION_SEED, 'utf8')) - 读取本地文件index.ts:526
if (!existsSync(STATE)) return { sessions: {}, seen: {}, standing: {}, history: {}, touched: {}, tenantOf: {}, models: {}, routes: {}, usage: emptyUsa - 读取本地文件index.ts:528
const raw = JSON.parse(readFileSync(STATE, 'utf8')) - 写入本地文件index.ts:618
writeFileSync(STATE, JSON.stringify(state, null, 1)) - 写入本地文件index.ts:628
writeFileSync(STATE, JSON.stringify(state, null, 1)) - 读取本地文件index.ts:738
if (!existsSync(file)) continue - 写入本地文件index.ts:879
mkdirSync(dirname(file), { recursive: true, mode: 0o700 }) - 删除本地文件index.ts:908
else rmSync(file, { force: true }) - 执行外部命令来自配置/变量index.ts:3780
execFile(process.execPath, [script, 'index', '--quiet'], - 执行外部命令来自配置/变量index.ts:3800
execFile(process.execPath, [script, 'index', '--quiet'], - 执行外部命令固定命令index.ts:3942
member = execFileSync('/usr/bin/unzip', ['-p', abs, spec.zipMember], { encoding: 'utf8', maxBuffer: 8 * 1024 * 1024 }) - 读取本地文件recallContext.ts:117
if (!existsSync(options.indexPath)) return [] - 读取本地文件recallContext.ts:119
for (const line of readFileSync(options.indexPath, 'utf8').split('\n')) { - 读取本地文件safeWrite.ts:24
while (!existsSync(at) && dirname(at) !== at) at = dirname(at) - 写入本地文件safeWrite.ts:34
mkdirSync(dir, { recursive: true }) - 写入本地文件safeWrite.ts:39
writeFileSync(temp, data, { flag: 'wx' }) - 写入本地文件safeWrite.ts:40
try { renameSync(temp, target) } catch (e) { rmSync(temp, { force: true }); throw e } - 删除本地文件safeWrite.ts:40
try { renameSync(temp, target) } catch (e) { rmSync(temp, { force: true }); throw e } - 写入本地文件safeWrite.ts:47
mkdirSync(dir, { recursive: true }) - 读取本地文件safeWrite.ts:68
try { entry = lstatSync(marker) } catch { } - 读取本地文件safeWrite.ts:73
if (!strict) { try { statSync(marker); return } catch { } } - 删除本地文件safeWrite.ts:74
rmSync(marker) - 写入本地文件safeWrite.ts:76
mkdirSync(marker) - 删除本地文件safeWrite.ts:80
if (!inside(realRoot, made)) { try { rmdirSync(made) } catch { } throw new Error(`refusing to mark ${dir}: it moved outside ${realRoot}`) } - 读取本地文件service/gateway.ts:434
const target = existsSync(path) ? realpathSync(path) : path - 读取本地文件service/gateway.ts:435
const final = !exact && existsSync(target) ? statSync(target).mode & 0o777 : mode - 读取本地文件service/gateway.ts:435
const final = !exact && existsSync(target) ? statSync(target).mode & 0o777 : mode - 写入本地文件service/gateway.ts:439
writeFileSync(temp, text, { mode: 0o600 }) - 写入本地文件service/gateway.ts:440
chmodSync(temp, final) - 写入本地文件service/gateway.ts:441
renameSync(temp, target) - 删除本地文件service/gateway.ts:443
rmSync(temp, { force: true }) - 读取本地文件service/gateway.ts:448
const readText = (path: string) => (existsSync(path) ? readFileSync(path, 'utf8') : '') - 读取本地文件service/gateway.ts:448
const readText = (path: string) => (existsSync(path) ? readFileSync(path, 'utf8') : '') - 读取本地文件service/gateway.ts:486
try { return JSON.parse(readFileSync(p.health, 'utf8')) } catch { return null } - 发起网络请求service/gateway.ts:575
const r = await fetch(url, { ...init, signal: AbortSignal.timeout(10000) }) - 请求外部主机discord.comservice/gateway.ts:617
const r = await fetch('https://discord.com/api/v10/applications/@me', { method: 'GET', headers: { Authorization: `Bot ${token}` }, signal: AbortSignal - 发起网络请求service/gateway.ts:617
const r = await fetch('https://discord.com/api/v10/applications/@me', { method: 'GET', headers: { Authorization: `Bot ${token}` }, signal: AbortSignal - 执行外部命令来自配置/变量service/gateway.ts:1806
const r = spawnSync(cmd, args, { encoding: 'utf8' }) - 发起网络请求service/gateway.ts:1809
fetch: (url, init) => fetch(url, init), - 执行外部命令固定命令service/gateway.ts:1812
openUrl: (url) => process.platform === 'darwin' && spawnSync('/usr/bin/open', [url], { stdio: 'ignore' }).status === 0, - 读取本地文件service/health-check.ts:39
const script = existsSync(beside) ? beside : fileURLToPath(new URL('../../service/rotate-logs.sh', import.meta.url)) - 读取本地文件service/health-check.ts:43
if (dir !== null && !existsSync(dir)) continue - 执行外部命令来自配置/变量service/health-check.ts:44
const out = spawnSync(script, dir === null ? [] : ['--dir', dir], { encoding: 'utf8' }) - 读取本地文件service/health-check.ts:63
if (!existsSync(HEALTH_FILE)) return { missing: true } - 读取本地文件service/health-check.ts:64
try { return JSON.parse(readFileSync(HEALTH_FILE, 'utf8')) } - 读取本地文件service/health-check.ts:81
try { return JSON.parse(readFileSync(STATE_FILE, 'utf8')) } catch { return { lastAlertAt: 0, lastRestartAt: 0 } } - 写入本地文件service/health-check.ts:84
try { mkdirSync(dirname(STATE_FILE), { recursive: true }); writeFileSync(STATE_FILE, JSON.stringify(state, null, 1)) } - 写入本地文件service/health-check.ts:84
try { mkdirSync(dirname(STATE_FILE), { recursive: true }); writeFileSync(STATE_FILE, JSON.stringify(state, null, 1)) } - 执行外部命令固定命令service/health-check.ts:91
execFileSync('launchctl', ['kickstart', '-k', `gui/${UID}/${LABEL}`], { stdio: 'pipe' }) - 读取本地文件service/health-check.ts:100
const line = readFileSync(CREDENTIALS, 'utf8').split('\n').find((l) => l.startsWith('SLACK_BOT_TOKEN=')) - 读取密钥环境变量service/health-check.ts:111
const token = process.env.SLACK_BOT_TOKEN || envToken() - 请求外部主机slack.comservice/health-check.ts:115
const res = await fetch('https://slack.com/api/chat.postMessage', { - 发起网络请求service/health-check.ts:115
const res = await fetch('https://slack.com/api/chat.postMessage', { - 读取本地文件service/update.ts:49
if (existsSync(join(dsh, 'profiles', 'update', 'package.json'))) { - 读取本地文件service/update.ts:55
if (!existsSync(join(io.checkout, '.git'))) { - 读取本地文件service/update.ts:72
try { finished = readFileSync(join(dsh, 'service', 'deepbot.commit'), 'utf8').trim() } catch { } - 写入本地文件service/update.ts:83
writeFileSync(path, script.stdout, { mode: 0o700 }) - 删除本地文件递归service/update.ts:87
rmSync(dir, { recursive: true, force: true }) - 执行外部命令来自配置/变量service/update.ts:99
const r = spawnSync(cmd, args, { encoding: 'utf8' }) - 执行外部命令固定命令service/update.ts:105
const r = spawnSync('/bin/bash', [script], { stdio: ['ignore', 'inherit', 'inherit'], env: { ...process.env, ...env } }) - 写入本地文件transports/attachments.ts:53
try { mkdirSync(options.dir, { recursive: true }) } catch { } - 读取本地文件transports/discord.ts:157
const data = bytes !== undefined ? Buffer.from(bytes) : readFileSync(filePath) - 读取本地文件transports/local.ts:527
if (!existsSync(path)) return Promise.resolve() - 删除本地文件transports/local.ts:531
probe.once('error', () => { try { unlinkSync(path) } catch { } resolve() }) - 写入本地文件transports/local.ts:554
if (!pipe) mkdirSync(dirname(path), { recursive: true, mode: 0o700 }) - 写入本地文件transports/local.ts:562
if (!pipe) chmodSync(path, 0o600) - 写入本地文件transports/local.ts:568
mkdirSync(dirname(discoveryFile), { recursive: true, mode: 0o700 }) - 写入本地文件transports/local.ts:569
writeFileSync(discoveryFile, JSON.stringify({ socket: path, pid: process.pid, name, startedAt: Date.now(), version: PROTOCOL_VERSION }), { mode: 0o600 - 删除本地文件transports/local.ts:646
if (socketPath !== null) { try { unlinkSync(socketPath) } catch { } } - 读取本地文件transports/local.ts:648
const recorded = JSON.parse(readFileSync(discoveryFile, 'utf8')) - 删除本地文件transports/local.ts:649
if (recorded?.pid === process.pid && recorded?.socket === socketPath) unlinkSync(discoveryFile) - 请求外部主机slack.comtransports/slack.ts:31
const res = await fetch(`https://slack.com/api/${method}`, { - 发起网络请求transports/slack.ts:31
const res = await fetch(`https://slack.com/api/${method}`, { - 发起网络请求transports/slack.ts:41
const res = await fetch(url, { headers: { Authorization: `Bearer ${token}` } }) - 发起网络请求transports/slack.ts:173
const res = await fetch(url, { headers: { Authorization: `Bearer ${botToken}` } }) - 读取本地文件transports/slack.ts:578
const bytes = given !== undefined ? Buffer.from(given) : readFileSync(filePath) - 发起网络请求transports/slack.ts:586
const put = await fetch(started.upload_url, { method: 'POST', body: bytes }) - 读取本地文件transports/telegram.ts:191
const data = bytes !== undefined ? Buffer.from(bytes) : readFileSync(filePath)
扫描于 2026/11/2(1 天前) · 范围 入口闭包 + 发布文件清单 · 来源 GitHub 仓库
涉及外部主机:discord.com、slack.com
静态扫描只反映源码中出现的调用,不构成安全背书;人工评估与自动扫描相互独立、互不覆盖。
给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个
界面预览
1 张 · 点击查看大图功能亮点
- 进程内会话
- 可接记忆的网关配置档
基于 DeepSeek Harness 的常驻独立智能体——Slack Socket Mode 适配器、进程内会话、可接记忆的网关配置档
README
由 DeepSeek 最新模型翻译生成deepseek-bot
DeepSeek Harness 的智能体记忆与网关。
一个常驻智能体,跨对话记住一切,在 Slack、Discord、Telegram 和终端里应答。
赞助商以下是我们的赞助商。他们让 deepseek-bot 这个个人副业项目得以持续。
| | OpenGateway 赞助 deepseek-bot。一个兼容 OpenAI 的网关,把多家模型服务商收在同一个 API 后面。感谢你支持开源。 |
DeepSeek Harness 一次只为一个会话运行智能体。deepseek-bot 是它的插件,补上长期运行的智能体缺的两样东西:
- 记忆。 每段对话都是持久会话,重启后依然存在。人设、智能体给自己记的笔记、以及过去对话的召回索引,都会带进每一轮,所以它能说出上周决定了什么、是哪一天,或者干脆说不知道。
- 网关。 一个智能体,在人们本来就在说话的地方就能找到:Slack、Discord、Telegram,以及全屏终端(dsh)。它作为受监管的 macOS 服务运行,命令在沙箱里执行,任何破坏性操作都要在对话里等到一句同意。
展开完整文档(README 剩余 1 节)
deepseek-bot DeepSeek Harness 的智能体记忆与网关。 一个常驻智能体,跨对话记住一切,在 Slack、Discord、Telegram 和终端里应答。 赞助商以下是我们的赞助商。他们让 deepseek-bot 这个个人副业项目得以持续。 | | OpenGateway 赞助 deepseek-bot。一个兼容 OpenAI 的网关,把多家模型服务商收在同一个 API 后面。感谢你支持开源。 | DeepSeek Harness 一次只为一个会话运行智能体。deepseek-bot 是它的插件,补上长期运行的智能体缺的两样东西: - 记忆。 每段对话都是持久会话,重启后依然存在。人设、智能体给自己记的笔记、以及过去对话的召回索引,都会带进每一轮,所以它能说出上周决定了什么、是哪一天,或者干脆说不知道。 - 网关。 一个智能体,在人们本来就在说话的地方就能找到:Slack、Discord、Telegram,以及全屏终端(dsh)。它作为受监管的 macOS 服务运行,命令在沙箱里执行,任何破坏性操作都要在对话里等到一句同意。 安装 curl -fsSL https://raw.githubusercontent.com/rlaope/deepseek-bot/master/install.sh | bash dsh # talk to it in the terminal dsh gateway setup # connect Slack, Telegram or Discord: ↑↓ and Enter 第一行负责安装,再跑一次就是更新。需要 macOS、Node.js 22+、DeepSeek Harness 应用和 DeepSeek API key —— 如果 harness 里已经有 key,就不会再问。应用缺失时,安装器会提议从 DeepSeek 自己的服务器下载(几百 MB,装进 /Applications),并按该构建公布的哈希校验。DeepSeek 自家 API 是默认选项,不需要别的;OpenGateway 或其他兼容 OpenAI 的端点,是安装器给出的可选项。bot 随终端 dsh 一起启动。 dsh gateway setup 连接一个即时通讯平台:用 ↑↓ 和 Enter 选一个,它会打开生成各个 token 的页面,你粘贴时逐个校验 token,最后提议重启 bot。dsh gateway status 说明它是否在线。dsh update 负责更新。 从智能体或脚本调用 没有终端时,安装程序不会询问任何内容:语言取自 LANG,模型路由用 DeepSeek 自家的,密钥在 harness 已有密钥的地方直接使用(它的 app、~/.dsh/.env),DeepSeek Harness app 只在明确要求时才下载: curl -fsSL https://raw.githubusercontent.com/rlaope/deepseek-bot/master/install.sh | DEEPBOT_INSTALL_HARNESS=1 bash 随后 dsh gateway setup <slack|telegram|discord> 从环境变量读取对应平台的 token。 密钥该先放在哪里、每一步停在哪里意味着什么:无终端安装。 可选:在 OpenGateway 上更快。 它在 OpenAI 兼容端点(https://apis.opengateway.ai/v1)上提供 deepseek/deepseek-v4.1-flash-ultrafast,标称速度是 Fable 级模型的 12 倍、价格是 1/30。本 bot 就是针对它开发的;profile/cordis.patch.yml 里的模型路由展示了端点和模型该填在哪里。 记忆 四层,每层只有一个归属方。智能体读取全部四层;只能写入自己 home 里的那几层。 | 层 | 存什么 | 位置 | 由谁写入 | | 工作记忆 | 当前这段对话 | harness 的会话日志,每个线程或聊天一份 | harness | | 身份 | 智能体是谁、怎么说话、遵守什么规则 | 智能体 home 里的 SOUL.md、AGENTS.md | 你 | | 语义 | 关于你和工作的长期事实,带日期 | USER.md、MEMORY.md、memory/.md | 智能体(你也可以编辑) | | 情景 | 早前对话里说过的话 | ~/.dsh/recall/ 下的召回索引,位于智能体 home 之外 | 宿主侧的索引器 | - 召回按频道隔离。 片段只来自对话所在的频道,所以私密对话的内容绝不会出现在公开频道里。智能体自己不能检索索引;适配器在每轮之前注入片段,并标记为内容,而非指令。 - 召回按词匹配,模型在最新的片段里挑选。 片段按与消息共享的罕见词排序;如果消息指向过去,对话所用的模型还会在该频道最新的 40 条片段里挑选,这样就能找到用别的说法讲过的往事。没有向量索引:用别的说法表述的较早片段仍可能漏掉。 - 找不到就是答案。 问到从未说过的事,它会直接说没说过,而不是猜。 - 人格就是普通 Markdown。 改 SOUL.md,人格就变。npm run persona 会按预算检查这些文件,并标出重复的事实、没写日期的行和密钥。 每一层如何抵达提示词,以及为什么这样做:见 docs/how-it-works.md。 网关 | 平台 | 接入方式 | 状态 | | Slack | Socket Mode;支持话题、流式输出、审批按钮、文件上传 | 已在真实环境使用 | | 终端(dsh) | 本地 socket;流式回答、带差异的工具调用、就地审批与提问 | 已在真实环境使用 | | Discord | 网关 websocket 与 REST;按钮、文件上传 | 已针对模拟 API 测试,未连接真实服务器 | | Telegram | 长轮询;按钮、文件上传、Markdown | 已针对模拟 API 测试,未连接真实机器人 | 终端旁边同时只能挂一个即时通讯工具:终端没有认领的会话都会交给列表里第一个即时通讯工具,所以第二个永远收不到回答,而 dsh gateway setup 是替换而非追加。一轮对话运行期间,平台会显示自己的状态指示:Slack 在话题下显示工作状态,Discord 和 Telegram 显示「typing…」。 怎么跟它说话。 在频道里 @ 它,或直接私信它;它在话题里回复。它工作时你发来的追问会排队等待。stop 结束正在运行的一轮,usage 显示该话题的 token 总量,allow 或 deny(或点按钮)回应审批请求。这些词支持英语、韩语和中文;机器人自己的通知则跟随 language 设置(默认 en,可选 ko、zh)。 一轮对话里它能做什么。 写 docx、xlsx 或 pptx 并上传到会话里;读链接,页面靠脚本渲染时用无头浏览器;看图,前提是所用模型支持图片;使用你添加的 MCP 服务器的工具(dsh gateway mcp add);在后台运行命令,跑完后把结果发出来。它只在被要求时主动开口:「这个变了告诉我」会变成一项监视,「周五提醒我」会变成一条提醒。 隔离。 它的命令运行在 Seatbelt 沙箱里,只能写自己的工作区,读不到部署的 token、其他智能体的文件、已存储的会话,也读不到你的凭据文件。删除或覆盖类的命令会先等发起人确认。话题或附件里试图给它下命令的文字,会在模型看到之前被标记出来。在 Telegram 和 Discord 上,任何人找到机器人都能给它发消息:用 dsh gateway setup telegram --users <your id> 列出允许的人。 保持在线。 它以 launchd 任务运行:断线后自己重连,探针在未连接时重启它,重启后仍未恢复会告警,会话也会被告知某次重启中断了它的一轮对话。 效果如何 三类证据,分量并不等同: | 证据 | 覆盖范围 | 运行位置 | | 单元测试套件(pnpm test) | 适配器、每种传输、沙箱运行器、安装器和 dsh gateway,均针对模拟对象 | CI,每次变更都跑 | | 场景(test/scenarios/.json) | 跨会话召回、审批、读取隔离、租户、注入、浏览器、MCP、后台任务——对着真实模型跑,跑在一次性 home 目录里 | 手动跑,或者等 service/install-scenarios.sh 排好日程后每天跑;不进 CI | | 实际使用 | Slack 和终端 | 开发者自己的部署 | 没有验证的部分,逐条列在 PLAN.md。简要版: - 只支持 macOS。在 Windows 上能构建,测试套件能过,终端也能手动跑,但安装器、服务、沙箱和监视没有移植,所以每条命令都会被拒绝(Windows,手动)。 - Discord 和 Telegram 还没做过真实往返。 - 沙箱是策略边界,不是独立的 OS 用户。MCP 服务器跑在沙箱外,带着网关的权限:只添加你信任的服务器。 - DeepSeek Harness 还是候选发布版,本项目依赖它的内部实现(会话驱动、消息构造)。请锁定版本。 小而精 TypeScript。插件不从 node_modules 导入任何东西;唯一的运行时依赖 playwright-core(已锁定版本),只由 browse 工具加载。召回不需要向量库,也不需要数据库:索引就是一个 JSONL 文件。 更多 - 安装与运维:接入即时通讯工具、在各平台创建机器人、模型服务商、MCP 服务器、智能体的网络、运行服务 - 工作原理:设计,以及每条论断背后的证据 - 限制 · 规范 · 计划 · 更新日志 - 给贡献者和智能体:工作规则 · 词汇表 许可证 MIT。deepseek-bot 是独立项目,与 DeepSeek 无关联,也未获其背书。鲸鱼图案和文字标识属于 DeepSeek 的 logo;DeepSeek 名称和 logo 归其所有者。
预览分享卡片长什么样 ↓
分享 · DeepSeek Harness Hub
rlaope/deepseek-bot
DeepSeek Harness 的智能体记忆与网关。
相关插件 · 平台集成
智能体工程课walkinglabs/learn-harness-engineering
一门项目制课程,教你搭建环境、管理状态、做验证、加控制机制,让 AI 编程智能体稳定干活。
★ 21,155已汉化DSH
71.7
视频翻译配音liuzhao1225/YouDub-webui
开源视频本地化工作台:导入视频,识别、翻译并逐句克隆原声,生成字幕和配音成片。
★ 5,778已汉化Cordis
71.4
失败经验库Ikalus1988/MisakaNet
📚 零依赖、由 git 支撑的微课程库,让 AI 智能体异步分享并检索经过验证的调试经验。| https://misakanet.org
★ 550已汉化DSH
71.2
桌面智能体工作区freestylefly/wesight
WeSight 是开源桌面控制台,面向本地 AI 智能体。它帮你安装或复用 Claude…
★ 933已汉化MCP
71
IM 机器人接入xmanrui/dsh-im
让 DeepSeek Harness 触手可及 Connecting DeepSeek Harness
★ 3,110已汉化DeepSeek 客户端
70.9
中国平台研究引擎Jesseovo/last30days-skill-cn
给 AI Agent 的中文互联网研究 Skill:检索 8 大平台最近 30…
★ 2,031已汉化DSH
70.7