前言¶
在 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。
典型用法:首次登錄飛書¶
- 讓模型調用
dsh_iab_open,URL 填https://<你的租戶>.feishu.cn/。 - 右側欄面板應自動彈出(自動喚出機制);不必手動找標籤。
- 在面板裏掃碼或輸入賬號登錄;登錄態寫入 profile 目錄。
- 之後可用
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