前言¶
DeepSeek Harness (DSH) 的設計理念之一是“一切皆插件”。在本地運行 dsh web 進程時,我們可以通過插件擴展界面能力。針對 bbs.dsher.cn 論壇,開發了一個 bundle 插件,旨在將論壇的瀏覽、搜索、發帖等功能集成到 DSH 的 Web 面板中,避免在瀏覽器標籤頁和 DSH 界面之間頻繁切換。
插件介紹¶
這是一個 DeepSeek Harness Web 的 bundle 插件,由 kimirong 維護。安裝後,它在 dsh web 界面右下角生成一個常駐的懸浮按鈕(“dsher 社區”),點擊即可打開面板,直接與 bbs.dsher.cn 交互。
安裝與啓用¶
前提:機器上已安裝 DeepSeek Harness(帶 dsh 命令),並已啓動 dsh web。
1. 安裝插件¶
從 GitHub 倉庫直接安裝,無需先發布到 npm:
# 將插件加入 web profile bundles
dsh plugin --profile web add github:kimirong/dsher-bbs-plugin
2. 重啓服務¶
安裝完成後,必須完全重啓 dsh web 進程(不是刷新瀏覽器頁面),插件纔會生效。
dsh web
重啓後,頁面右下角會出現一個藍色的膠囊按鈕,點擊即可進入社區面板。
3. 常見問題¶
如果安裝時遇到 ERR_PNPM_ADDING_TO_ROOT 錯誤,這是因爲 pnpm 8+ 對 workspace 根目錄的 add 操作進行了校驗。可以在 ~/.dsh/profiles/web/.npmrc 中添加一行配置解決:
echo 'ignore-workspace-root-check=true' >> ~/.dsh/profiles/web/.npmrc
dsh plugin --profile web add github:kimirong/dsher-bbs-plugin
4. 更新與卸載¶
dsh plugin --profile web update @kimirong/dsher-bbs-plugin # 更新到新版本
dsh plugin --profile web remove @kimirong/dsher-bbs-plugin # 卸載(自動從 bundles 剔除)
功能特性¶
- 右下角懸浮入口:藍色膠囊按鈕常駐頁面右下角,不佔用側欄空間,隨時可點。
- 瀏覽與搜索:支持版塊分類瀏覽、帖子列表(分頁)、帖子詳情查看。搜索框直接集成在瀏覽頁頂部。
- 發帖與互動:面板內支持發帖、回帖和點贊,正文支持 Markdown 渲染。
- 圖片上傳:支持在正文或回覆框直接粘貼截圖(自動轉碼上傳),或點擊“🖼 上傳圖片”按鈕。
- 一鍵登錄:通過彈窗走論壇的 GitHub / Google OAuth 流程,會話自動接入,無需手動複製 Cookie。
典型用法¶
安裝並重啓 dsh web 後,直接點擊右下角的懸浮按鈕即可使用。典型操作流如下:
- 點擊懸浮按鈕,瀏覽或搜索帖子。
- 點擊“發帖”或回覆框,輸入 Markdown 內容。
- 粘貼截圖或點擊上傳按鈕發佈內容。
- 點擊“一鍵登錄”按鈕,完成 OAuth 認證。
架構與技術實現¶
該插件採用 Host/Client 分離架構,通過 HTTP 路由實現通信,而非 DSH 官方的 @Remote 機制。
Host 半(服務端)¶
負責與論壇交互,暴露 JSON RPC 接口。
- 文件位置:src/host/index.ts、src/host/forum.ts
- 職責:
- src/host/index.ts:註冊 ctx.webServer 路由 /api/dsher-bbs/*,將論壇能力暴露爲本機 JSON RPC。
- src/host/forum.ts:使用 Node 全局 fetch 訪問論壇,通過 HTML 正則解析帖子列表和詳情(論壇爲 Hono + htmx 服務端渲染,無公開 JSON API)。
Client 半(瀏覽器端)¶
負責 UI 渲染與用戶交互。
- 文件位置:src/client/index.ts、src/client/Panel.tsx、src/client/rpc.ts
- 職責:
- src/client/index.ts:插件入口,通過 ctx.inject(['slots']) 註冊 shell.overlay 槽位。
- src/client/Panel.tsx:React 組件,渲染懸浮按鈕和麪板 UI,通過同源 fetch('/api/dsher-bbs/<method>') 調用 Host。
- src/client/rpc.ts:對 fetch 進行封裝。
通信模式¶
不使用 @deepseek-ai/dsh-api-remotes 的 @Remote 機制,原因在於官方的客戶端裝配是靜態白名單(只 import 官方包的 /remote),第三方獨立包的 remote 不會被自動掛載。因此本包採用自建 HTTP 路由:Host 半註冊 webserver 前綴路由,Client 半同源 fetch,這是獨立 bundle 插件的通用可交付模式。
限制與注意事項¶
- 限流規則:論壇對寫操作有限流限制,請注意:
- 5 帖/小時
- 30 回帖/小時
- 60 點贊/小時
- 20 上傳/小時 - HTML 解析脆弱性:論壇正文用
marked渲染且未 sanitize,存在 XSS 風險。雖然forum.ts做了基礎淨化,但渲染第三方內容仍有風險。且論壇改版後,正則解析邏輯可能失效,需同步更新。 - 鑑權與安全:
-/api/dsher-bbs路由無鑑權,與 DSH 頁面同源同權限。任何能訪問該 DSH 頁面的人都能調用。
- 會話 Cookie 僅存在於 Host 進程內存,不落盤、不外發。
- 一鍵登錄依賴論壇側部署src/routes/dsh-login.tsx,且該頁只接受localhost/127.0.0.1來源。 - 開發構建:
- 運行npm install安裝依賴。
- 執行npm run build編譯(產物爲lib/index.mjs和lib/client.js)。
- 執行npm run typecheck進行類型檢查。
許可證¶
MIT。