dsh-iab:爲 DSH 提供持久登錄的內置 Chromium 與飛書文檔讀取

前言

在 DeepSeek Harness(DSH)裏讓模型「打開網頁、讀內容、在已登錄站點裏執行腳本」,常見做法是依賴右側欄自帶瀏覽器或外部工具。DSH 默認右側欄瀏覽器使用 session.fromPartition('dsh-sidebar-browser-<uuid>'),且不帶 persist: 前綴,Cookie 與 Web Storage 不會在應用重啓後保留,每次都要重新登錄。對飛書文檔、需要掃碼的企業內網頁,這會直接打斷自動化流程。

下面介紹的 dsh-iab(維護者 alamsir,社區分類:聯網工具)在宿主進程裏啓動獨立的 Chromium,profile 落在磁盤(默認 $DSH_HOME/dsh-iab/chrome-profile),登錄一次可長期有效;同時提供七個 Agent 工具、頁面 JavaScript 求值,以及飛書文檔轉 Markdown,並在右側欄用 screencast 實時鏡像畫面。插件爲純 ESM,無構建步驟、無運行時依賴,當前 npm 版本 0.1.0,許可證 MIT。

這是什麼

dsh-iab 是給 DSH 裝的「自帶瀏覽器」:通過 CDP 驅動 Chromium,不把登錄態綁在 DSH 默認 ephemeral 分區上。模型通過工具開頁、求值、讀正文、截圖;用戶可在右側欄面板裏掃碼登錄,工具首次打開瀏覽器時還會自動把面板喚到前臺,避免 Agent 打開了登錄頁卻看不到的情況。

與日常 Chrome 的隔離(設計約束)

README 寫明這些保證寫在 src/browser.js 裏,屬於硬約束而非文檔約定:

保證 實現要點
不附着到你正在用的 Chrome/Edge 僅 spawn 自啓子進程,不連接已有調試端口
不寫你的瀏覽器 profile isForeignProfile() 命中系統 Chrome/Edge User Data 等目錄會直接拋錯
不殺外來進程 stop() 只作用於插件自己啓動的子進程,優先 CDP Browser.close
默認不搶焦點 headless,畫面經插件 screencast 面板展示,輸入事件回傳頁面
Chromium 來源 優先 Playwright 緩存裏的專用構建,系統 Chrome 僅兜底

啓動參數刻意不帶 --disable-web-security,也不使用共享 profile 標誌。

核心功能

七個 Agent 工具

工具 作用
dsh_iab_status 報告 Chromium 路徑、profile 目錄、是否運行、已開標籤頁
dsh_iab_open 打開 URL,返回 tabId;首次調用時啓動 Chromium
dsh_iab_eval 在頁面執行任意 JS,返回 JSON(帶登錄態,可讀私有內容)
dsh_iab_read 將頁面正文讀成純文本(可用 scrollPasses 觸發懶加載)
dsh_iab_feishu 飛書文檔 → Markdown 落盤(虛擬滾動雙向回掃)
dsh_iab_screenshot 截圖存 PNG
dsh_iab_tabs 列標籤頁 / 關標籤頁

右側欄與自動喚出

  • 通過 sidebar.right.pane.tab 註冊 dsh-iab 類型,keepMounted;SSE 接收 Page.startScreencast 的 JPEG 幀,鼠標/滾輪/鍵盤經 Input.dispatch* 回傳。
  • 工具啓動瀏覽器時,宿主經 /dsh-iab/api/events 廣播 reveal,客戶端調用 ctx.sidebarRight.openTab('dsh-iab') 打開面板;設置頁(settings.section)可查看 Chromium 路徑、profile、運行狀態。
  • 若面板未自動出現,可查 GET /dsh-iab/api/status 的 eventClients(爲 0 時多爲宿主側舊代碼,需重啓 DSH),或 POST /dsh-iab/api/reveal 手動觸發。

配置項

均通過 schemastery .volatile() 暴露到設置頁:

字段 默認 說明
chromePath '' Chromium 可執行文件;留空自動探測
profileDir '' profile 目錄,默認 <dsh home>/dsh-iab/chrome-profile
headed false 是否顯示真實窗口;默認關,頁面在面板裏看
outDir '' 落盤目錄,默認 <cwd>/prd-input

環境變量 DSH_IAB_CHROME 可覆蓋瀏覽器路徑。

安裝與啓用

需要先有一個已初始化的 profile;若從未裝過插件,可先跑一次 dsh web 建好 profile。

從 npm 安裝(發行版):

dsh plugin --profile web add dsh-iab

裝完後必須重啓 DSH:宿主側的七個工具與 HTTP 路由在進程啓動時組裝,只刷新網頁不夠。客戶端面板支持 HMR,之後改前端一般不用重啓。

package.json 要求 Node >=22.5,DSH 引擎範圍爲 >=0.2.0-0 <0.3.0-0 || >=0.2.1-rc.1 <0.3.0-0。

本地源碼安裝、desktop profile 與回滾腳本見 GitHub README;desktop 須用安裝目錄自帶的 dsh.cmd,通用 CLI 會拒絕 desktop profile。

典型用法:首次登錄飛書

  1. 讓模型調用 dsh_iab_open,URL 填 https://<你的租戶>.feishu.cn/。
  2. 右側欄面板應自動彈出(自動喚出機制);不必手動找標籤。
  3. 在面板裏掃碼或輸入賬號登錄;登錄態寫入 profile 目錄。
  4. 之後可用 dsh_iab_feishu 將文檔轉爲 Markdown 落盤;重啓 DSH 一般無需重登。

outDir 留空時,Markdown 等輸出默認落在當前工作目錄下的 prd-input。

適用場景與注意

適合誰:需要在 DSH 對話裏穩定訪問需登錄的 Web(尤其飛書文檔)、讓模型在真實會話裏求值或讀正文、又不想每次重啓 DSH 都重登的開發者。

權限與安全:插件以當前 DSH 進程權限運行;飛書登錄態保存在 profile 目錄,等價於會話憑據,應對 profile 目錄按敏感憑據保管。安裝前建議閱讀源碼與 MIT 許可證,確認行爲符合你的環境策略。

已知限制(README 原文):

  • 畫板/圖片僅有佔位符,canvas 與圖片位圖無法提取爲文本。
  • 飛書採集不包含評論、@ 提醒、右側目錄。
  • 面板是 screencast 鏡像,空閒時可能幾秒一幀,靜態頁看起來像「卡住」,閱讀與點擊不受影響。
  • headless 下部分站點會做 UA/指紋探測;必要時將 headed 設爲 true。
  • 同一 profileDir 只能有一個 Chromium 實例;並行多個 DSH 時需爲各實例配置獨立 profileDir,否則後啓動者可能報 Chromium exited before exposing a DevTools port。

DSH 生態採用「一切皆插件」思路;SkillHub 目錄頁 爲社區收錄站點,與 DeepSeek / 幻方無官方從屬關係。

結尾

dsh-iab 把持久登錄的 Chromium、七個聯網相關工具、飛書 Markdown 導出和右側欄實時面板收在一個 DSH 插件裏,並刻意與日常瀏覽器 profile 隔離。若你在 Harness 裏做文檔採集或登錄態自動化,可按上文命令安裝、重啓後再走飛書登錄流程。

  • 目錄頁:https://www.skillhub.cn/plugins/alamsir/dsh-iab
  • 源碼與完整說明:https://github.com/alamsir/dsh-iab
羽毛球分组比赛记分
小程序二维码

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

小夜