用 dsh-group-photo 给 DeepSeek Harness 内测收官留一面拍立得合影墙

前言

DeepSeek Harness(命令名 dsh)是 DeepSeek AI 开源的智能体运行时,目前仍是开发者预览。它的核心理念是「一切皆插件」:模型、工具、技能、会话、沙箱和界面都可以用插件替换或组合。社区里还有一份独立的插件目录站点 deepseek-harness-plugin.com,它和 DeepSeek / 幻方没有官方从属关系,收录的是带 dsh-plugin 话题的社区仓库。

内测收官时,参与者往往想做一件很具体的事:证明「我当时在场」,再留下一句短留言。公开仓库不能把真实名单摊开,现役组织成员表也会随公开化和人员进出而变化。SenmuuuuW 维护的 dsh-group-photo 就是为这个场景做的拍立得合影墙:用零权限 GitHub OAuth 证明身份,用冻结白名单决定谁能入镜。

dsh-group-photo 是什么

dsh-group-photo 是一款面向 DeepSeek Harness 的趣味插件,由 SenmuuuuW 维护,仓库地址是 SenmuuuuW/dsh-group-photo。社区目录把它归在「趣味」分类,许可证为 MIT,主要语言是 HTML。仓库 package.json 里的版本号是 1.0.0,要求 Node.js ≥ 20。截至 2026-08-17,GitHub 显示 17 颗星;目录页当时仍标注 15 颗,以仓库页面为准。

它解决的问题很窄:给 dsh-external 内测成员做一面拍立得墙。成员用 GitHub 登录(授权页不申请任何 scope),只有命中冻结白名单的身份才能浏览合影、入镜并留下一句话。仓库自带的 skill/SKILL.md 写得很明确:本体是零依赖的独立 Node 站点,不是 Cordis 插件;目录页仍按 DSH 插件收录,并提供 dsh plugin add 安装命令,仓库里另有一份 DSH Skill 包装,方便智能体按文档启动、冻结白名单或导出纪念版。

核心功能

按仓库 README 与 skill/SKILL.md 交叉核对,已经落地的能力如下。

1、拍立得合影墙。前端是纯 HTML/CSS/JS(public/index.html):头像卡片、NO.xxx 编号、留言、入镜时间,带实时更新、彩带和移动端适配。留言上限 140 字,按 GitHub 用户 id 去重,作者可以改自己的那一句。

2、零权限 OAuth。授权 URL 不带 scope 参数,登录只用来证明「你是这个 GitHub 用户」,不申请仓库或组织权限。Skill 文档还写明不走 Device Flow。

3、冻结白名单。资格名单是内测私有期的快照(whitelist.json),运行时不会再去查现役组织成员。匹配顺序是 GitHub 用户 id 优先,用户名(大小写不敏感)其次。组织后来公开、成员进出,都不会改写这面墙的入场资格。

4、浏览同样上锁。GET /api/members 没有会话 cookie 就返回 401,未登录只能看到人数。会话令牌是 48 位随机十六进制,Cookie 带 HttpOnly。

5、Fail-closed。白名单缺失或读失败时,所有登录都被拒绝(gate_error),不会放行。

6、零 npm 依赖。服务端是 server.js,只用 Node 内置模块;启动命令是 npm start(等价于 node server.js),默认端口 8808。

7、静态纪念版。node export-archive.js 会生成单文件 archive/index.html,可双击打开,也可以放到 GitHub Pages 等静态托管。导出后不再依赖服务端登录。

8、代表作映射。成员卡会展示该用户在 dsh-external 组织里的代表作仓库,数据来自 works.json(按仓库首笔 commit 作者映射)。

公开仓库是「安全演示版」:members.jsonwhitelist.jsonworks.jsonarchive/index.html 都是虚构成员。真实名单和留言放在私有数据层(README 举例为 SenmuuuuW/dsh-group-photo-data),用文件挂载或环境变量注入,不进入公开 Git 历史。

安装与启用

社区目录页给出的安装命令如下,在 DeepSeek Harness 终端里运行即可:

dsh plugin add github:SenmuuuuW/dsh-group-photo

需要可复现安装时,按目录页说明固定 commit 哈希:

dsh plugin add github:SenmuuuuW/dsh-group-photo#commit

#commit 换成实际的 commit SHA。目录页同时提醒:插件以当前 dsh 进程的权限运行,安装时可能执行代码;安装前应检查源码仓库和许可证。

把合影墙真正跑起来,以仓库 README 为准。前置是 Node.js ≥ 20,没有 npm 依赖需要安装。README 的 clone 示例写的是 https://github.com/dsh-external/dsh-group-photo.git,目前会转到同一仓库 SenmuuuuW/dsh-group-photo

git clone https://github.com/SenmuuuuW/dsh-group-photo.git
cd dsh-group-photo

# 1. 在 GitHub 创建 OAuth App,回调地址填:
#    http://localhost:8808/auth/callback

# 2. 环境变量注入密钥(不要写进仓库)
export GH_CLIENT_ID=你的ClientID
export GH_CLIENT_SECRET=你的ClientSecret
export GH_ORG=dsh-external

# 3. 启动(等价于 node server.js)
npm start

浏览器打开 http://localhost:8808/auth/login 会跳到 GitHub,/auth/callback 换 code、查白名单,命中后写入会话 cookie。

密钥也可以写进 config.jsonclientId / clientSecret,仓库里这两项默认是空字符串。支持的环境变量还有 PORT,以及自定义数据路径:GH_DATA_FILEGH_WHITELIST_FILEGH_WORKS_FILEGH_SOCIAL_FILE

GitHub OAuth App 只允许注册一个回调地址,而且必须精确匹配:本地用 http://localhost:8808/auth/callback;走公网隧道则填 https://<隧道地址>/auth/callback,换地址就要改 OAuth App。

典型用法

本地入镜

完成上一节的 OAuth 配置并启动服务后,用白名单里的 GitHub 账号登录。不在快照里的账号过不了门;白名单文件本身不可用时,所有人都进不去。公开仓库自带的是演示名单,要用真实内测数据,需要维护者从私有数据层复制 whitelist.jsonmembers.jsonworks.jsonsocial.json

临时公网访问

README 给出的隧道命令是:

cloudflared tunnel --protocol http2 --url http://localhost:8808

目录页和 README 在活动期间还写过一条 Cloudflare 临时地址:https://rio-palm-cfr-benz.trycloudflare.com/,并标明仅 dsh-external 内测成员可入镜。隧道地址会变,活动结束后应以仓库里的 archive/index.html 为准,不要把临时 URL 当成永久入口。

重新冻结白名单

运行时不读 PAT。只有重新生成快照时,才把带 read:org 的 classic PAT 写进 config.jsonpat 字段(或环境变量 GH_PAT):

node freeze-whitelist.js

生成或更新 whitelist.json 后立刻 revoke 这个 PAT。服务端按文件 mtime 热加载白名单,不用重启。

导出静态纪念版

node export-archive.js

产物是 archive/index.html:单文件、无登录、可静态托管。Skill 文档提醒:members.jsonsessions.json 写在 server.js 旁边,临时磁盘的部署平台在重新发布前要先备份。

交给 DSH Skill

skill/SKILL.md 的触发说明是:用户想启动合影墙、重新冻结白名单、导出纪念版,或解释这套安全模型时使用。它描述的是同一套 Node 站点,不会把合影墙变成 Cordis 里的界面插件。

适用场景与注意事项

适合这几类人:参加过 dsh-external 内测、想在收官之夜入镜的成员;活动维护者,需要把名单和留言与公开仓库拆开;想复用这套「零权限 OAuth + 冻结快照」门禁,给自己的社区做类似纪念页的人。

不适合指望它去增强 DSH 的编码能力。它不提供模型、工具或 Web UI 皮肤,也不会在 dsh web 里挂出一块合影面板。公开仓库里的演示数据不能当成真实内测名单。

使用前还要注意:

  • 插件以当前 dsh 进程权限运行,安装前应阅读源码和 MIT 许可证。
  • 密钥只放环境变量或本机 config.json,不要提交进 Git。
  • 资格只认冻结快照,不认现役组织成员;白名单坏了就全员拒绝。
  • OAuth App 的回调地址只有一个,本地和隧道不能共用同一条配置凑合。
  • 真实成员数据属于隐私,README 要求永不进入公开仓库。

小结

dsh-group-photo 把 DSH 内测收官收成一面拍立得墙:零权限登录证明身份,冻结白名单卡住入场资格,再把结果导出成一张可永久保存的静态页。它不是 Cordis 能力插件,而是带 DSH Skill 包装的独立站点;目录按趣味插件收录,源码和许可证都可以直接核对。

  • 目录页:https://deepseek-harness-plugin.com/zh-CN/plugins/dsh-group-photo/
  • GitHub:https://github.com/SenmuuuuW/dsh-group-photo
  • DeepSeek Harness:https://github.com/deepseek-ai/deepseek-harness
羽毛球分组比赛记分
小程序二维码

欢迎使用《羽毛球分组比赛记分》微信小程序

小夜