dsh-proxy-switch:讓 DSH 的 web_fetch 在代理環境下正常抓網頁

前言

DSH 的 web_fetch 在直連環境裏工作正常,但一旦開着 Clash、Surge、v2rayN 這類軟件,抓取就很容易失敗。排查下來通常是兩類問題:TUN 模式把域名解析成 198.18.x.x 這樣的假地址,直連安全檢查直接拒絕;或者只開了「系統代理」、沒開 TUN,DSH 不讀系統代理,需要代理的網站打不開。把 HTTP_PROXY 寫死進 ~/.dsh/.env 確實能連上,可代理一關,模型對話也跟着斷。

下面介紹 dsh-proxy-switch,它就是爲這種場景寫的插件。

這是什麼

  • 維護者:lightrivers
  • 包名:@lightrivers/dsh-proxy-switch,版本 0.4.4,許可證 MIT
  • GitHub:https://github.com/lightrivers/dsh-proxy-switch
  • 目錄頁:https://www.skillhub.cn/plugins/lightrivers/dsh-proxy-switch,分類「聯網工具」,目錄頁標註星標 0

一句話定位:自動找到本機 HTTP 代理,代理開着時讓 web_fetch 走代理,代理關掉後自動改直連,給 web_fetch 單獨開一條可切換的線路。默認作用範圍是「僅 web_fetch」,不修改全局網絡設置、進程環境變量和子進程環境,模型對話和其它工具不受影響。

它解決什麼問題

README 列出的適用情況:

  • web_fetch 報 non-public IP address,或域名被解析到 198.18.x.x
  • 代理開了 TUN / 增強模式 / fake-IP,web_fetch 失敗
  • 只開了系統代理、沒開 TUN,DSH 讀不到系統代理,打不開需要代理的網站
  • 寫死 HTTP_PROXY 後代理一關,連模型對話都斷了
  • 每次開關代理都要手動改配置

原因是 TUN 模式會把域名解析到 198.18.0.0/15 段的假地址,web_fetch 直連時的安全檢查不允許訪問內網地址;而一旦代理地址寫死,代理關閉後什麼都連不上。插件在這兩條路徑之外給 web_fetch 一條可切換的線路。

需要說明的是,README 明確指出:DeepSeek Harness 0.2.2 起,web_fetch 不再拒絕 fake-IP 和內網地址,只用 TUN 的話新版不裝插件也能抓網頁。插件仍然適合只開系統代理的用戶、需要根據代理開關自動切換的用戶;另外直連時插件仍只允許公網地址,可以擋住對本機和內網服務的訪問。

環境要求

項目 要求
DeepSeek Harness 桌面版 0.2.1、0.2.2(0.2.2-rc.1 已測)
系統 macOS(已完整驗證);Windows、Linux(代碼已支持,尚未在真機完整驗證)
代理 本機 HTTP 代理或「混合端口」(Clash / mihomo / Clash Verge、Surge、v2rayN 等),不支持 SOCKS、PAC

核心功能

1、自動檢測代理。優先讀取系統代理設置(macOS 網絡設置、Windows Internet 選項、Linux GNOME/KDE 代理設置),找不到再讀 DSH 啓動時的 HTTPS_PROXY 等環境變量,最後掃描常見端口 7890、7897、6152、1087、10809 等。每個候選地址都會做實際握手驗證,確認真的是 HTTP 代理才使用。

2、三種線路:auto(跟隨檢測結果)、forward(固定走代理)、direct(固定直連)。默認 auto。每次 web_fetch 之前插件會先在本機測一下代理端口,約 1 毫秒,代理剛關也不會走錯線路;代理找不到時一律直連,直連的安全檢查照常進行。

3、作用範圍可切換。默認 web_fetch_only,只有主動選擇 global 時其它模塊纔跟着走這條線路。

4、代理需要賬號密碼時可手動填寫 http://user:pass@地址:端口。密碼只保存在本機,權限爲 600,界面、日誌和提示裏一律顯示爲 ***。

5、web_fetch 的結果裏會附上當前狀態提示,模型能看到並告訴你。

安裝與啓用

在 DeepSeek Harness 裏對模型說下面這句話,然後完全退出並重新打開 DSH:

用 plugin_manager 安裝插件 @lightrivers/dsh-proxy-switch

重啓後側欄底部右邊會多出一個小按鈕,顯示當前線路和狀態圓點(例如「走代理 ●」)。

如果以前在 ~/.dsh/.env 裏寫過 HTTP_PROXY / HTTPS_PROXY,先刪掉它們再重啓。否則插件關掉後,DSH 還會回到寫死的代理。

README 另給出了從源碼安裝的步驟:下載源碼到 ~/dsh-proxy-switch,然後對模型說「用 plugin_manager 安裝插件 ~/dsh-proxy-switch」(它會執行 plugin_manager action=install_bundle target=<絕對路徑>),再完全退出並重新打開 DSH。升級時在源碼目錄 git pull,再執行一次安裝步驟。本文只轉述 README 原文,實際安裝請使用上面的官方安裝方式。

從 0.4.1 及更早版本升級時(0.4.2 起包名改爲 @lightrivers/dsh-proxy-switch),先讓模型用 plugin_manager 卸載舊的 dsh-proxy-switch,再按上面的方法安裝新版,設置和狀態會保留。

典型用法

大多數人裝好後什麼都不用做。默認是「自動」:插件讀取系統代理設置,找到代理端口,代理運行時 web_fetch 走代理,代理關掉後自動改直連。

點側欄底部的按鈕打開面板,主要區域:

  • 最上面一大塊:當前走的是哪條線路。線條在流動表示通暢,出問題時符號標在出問題的地方(✕ 表示那裏斷了,🔒 表示代理要登錄,❗ 表示不穩定)。右上角的小標籤是作用範圍:「僅 web_fetch」或「所有工具」。
  • 自動 / 走代理 / 直連:選線路。
  • 代理那一行:找到的代理地址、怎麼找到的(系統代理、環境變量或端口掃描),以及延遲;右邊按鈕可以重新檢測。
  • 更多設置:手動填寫代理地址、作用範圍、按鈕放在哪裏。

按鈕上的圓點:🟢 正常,🟠 需要處理,🔴 出現問題,⚪ 正在檢測。

左側欄底部可能擠着好幾個插件按鈕,可以在「更多設置 → 按鈕位置」裏改成對話頂欄(適合側欄常收起的人,Windows 上側欄收起時默認那一行會被隱藏)或不顯示。選「不顯示」後設置仍在「插件 → 代理開關」頁面裏。

線路和代理狀態對不上時,面板會給一句話說明和一個修復按鈕,按按鈕上的說明操作即可:固定直連但代理開着時點「改爲自動」;代理在運行但找不到端口時點「手動填寫地址」,只填端口號(例如 7890)就行。

配置與狀態

面板裏能改的設置保存在 ~/.dsh/storages/dsh-proxy-switch/state.json(目錄權限 0700、文件權限 0600),一般不需要手動編輯。

字段 默認 說明
mode auto auto / forward(固定走代理)/ direct(固定直連)
upstreamSource auto auto 時代理地址由檢測結果更新;manual 時只使用手動填寫的地址
upstream http://127.0.0.1:1082 代理地址,只接受 http://host:port,可帶 user:pass@
scope web_fetch_only web_fetch_only(僅 web_fetch)/ global(所有工具)
listenPort 7899 僅「所有工具」模式使用的本地端口
probeIntervalMs 15000 後臺檢測代理的間隔(3000–600000 毫秒),界面裏不提供修改

按鈕位置是瀏覽器端偏好,保存在 localStorage 的 dsh-proxy-switch.placement 裏。

插件另提供本機狀態接口:

GET  /dsh-proxy-switch/state
POST /dsh-proxy-switch/mode      { "mode": "auto" | "forward" | "direct" }
POST /dsh-proxy-switch/settings  { "scope"?, "upstream"?, "upstreamSource"?, "listenPort"?, "probeIntervalMs"? }
POST /dsh-proxy-switch/probe     立即檢測一次當前代理
POST /dsh-proxy-switch/detect    立即重新查找代理

接口只接受本機請求,Host 必須是 DSH 自己的地址,並校驗 Origin、Sec-Fetch-Site;POST 還要求 Content-Type: application/json 和請求頭 x-dsh-proxy-switch-request: 1。

工作原理

插件只替換 web_fetch 的「發請求」這一步:請求先進入插件自己的 web_fetch 提供者,再經本機私有通道(隨機端口,只監聽 127.0.0.1),之後分流到 HTTP 代理或直連目標網站。重定向、超時、大小限制、編碼處理仍沿用 DSH 原來的實現。

  • 直連時整組 DNS 結果都必須是公網地址,fake-IP、內網、迴環、NAT64 內嵌私網地址等一律拒絕。
  • 走代理時,localhost、.local、.lan 這類本地名字和在本機解析出內網地址的目標會被拒絕,但最終由代理解析,所以只是緩解。
  • 私有通道每次啓動生成隨機令牌,本機其它程序無法借用它(以及保存的代理賬號密碼);每個請求使用新連接,切換線路後不會沿用舊的代理隧道。

適用場景與注意

適合:TUN / fake-IP 環境下 DSH web_fetch 失敗、只開系統代理沒開 TUN、希望代理開關時自動切換線路、希望 web_fetch 結果帶狀態提示的用戶。

需要注意:

  • 只支持 HTTP 代理(或混合端口),不支持 SOCKS、PAC。需要賬號密碼時用 http://user:pass@host:port 形式手動填寫。
  • 目前只在 macOS 上完整驗證過,Windows、Linux 代碼已支持但尚未真機驗證。
  • 插件以當前 DSH 進程的權限運行,安裝前建議先讀一遍源碼和 LICENSE(MIT),確認來源可信。
  • 走代理時的內網訪問攔截只能緩解,不能保證百分之百。開着 TUN 時本機只能解析到假地址,插件判斷不了真實目標;如果 DNS 被污染把正常網站解析成內網地址,走代理時該網站會被誤拒,提示爲「轉發模式拒絕請求」,打開 TUN 或換可信 DNS 可恢復。
  • README 提醒:插件依賴必須寫在 peerDependencies 裏,不能寫進 dependencies,否則會裝出第二份 @deepseek-ai/dsh-http-proxy,「所有工具」模式會靜默失效。
  • README 另給出測試命令:npm test(單元測試)、DSH_RUNTIME_MODULES=/path/to/dsh/node_modules node scripts/e2e-host.mjs(真實 Cordis/WebRuntime 集成測試)、node scripts/e2e-real.mjs(可選,經過本機真實 HTTP 代理)、node scripts/e2e-web-fetch-warning.mjs(web_fetch 結果附帶的警告文本)。

結尾

dsh-proxy-switch 的價值不在於新增能力,而是把 web_fetch 在代理環境下的線路選擇從「手寫 HTTP_PROXY 賭一把」變成「自動檢測、可一鍵切換、默認不波及其它工具」。是否安裝取決於你平時是否開着 TUN 或只開系統代理。插件目錄頁:https://www.skillhub.cn/plugins/lightrivers/dsh-proxy-switch ,源碼:https://github.com/lightrivers/dsh-proxy-switch 。

羽毛球分组比赛记分
小程序二维码

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

小夜