Clash 訂閱格式比較:YAML 設定、Base64 訂閱與 URI 連結轉換教學
比較三種常見訂閱格式的結構與適用用戶端,說明欄位對應、轉換時可能遺失的資訊,以及自架轉換服務的注意事項。
先辨識內容,再選擇匯入方式
優先使用服務提供者明確標示的 Clash 或 mihomo 訂閱入口。若取得的是完整 YAML 設定,通常可直接加入用戶端的設定檔清單;若是 Base64 文字或一組協定 URI,請先確認用戶端是否支援匯入這些格式。不要只改副檔名,也別把「訂閱下載成功」當成「核心已接受設定」。
先釐清兩個容易混淆的項目:訂閱網址是取得內容的入口,訂閱格式則是入口實際傳回的資料結構。同一個 HTTPS 網址可能依查詢參數或要求標頭傳回不同內容。網址以 .yaml 結尾,不代表回應一定是 YAML;沒有副檔名也不影響它傳回完整設定。
| 格式 | 常見內容特徵 | 通常包含的資訊 | 匯入前檢查 |
|---|---|---|---|
| Clash YAML | 出現 proxies、proxy-groups、rules 等鍵 | 節點、策略群組、規則,也可能包含 DNS 與連接埠設定 | 分辨完整設定與節點片段 |
| Base64 訂閱 | 一長串編碼文字,解碼後通常是多行 URI | 視原始內容而定;常見情況只包含節點資訊 | 先解碼,再辨識內部格式 |
| URI 連結 | 以 ss://、vmess://、trojan:// 等開頭 | 單一節點的協定、位址、驗證資訊與傳輸參數 | 確認匯入工具支援相應協定與參數 |
YAML 設定:分辨完整設定與節點清單
先查看頂層欄位。YAML 只是資料表示格式,並非 Clash 專用格式。能由 YAML 解析器讀取,不代表符合 Clash 設定結構;符合某個核心的結構,也不代表其他核心支援其中所有協定與選項。
辨識三種常見的 YAML 內容
- 完整設定:通常會同時包含
proxies、proxy-groups、rules,也可能設定監聽連接埠、DNS、TUN 等項目。 - 節點集合:只包含
proxies。可供相容的代理集合提供者使用,但不能因此推斷策略群組與分流規則已設定完成。 - 規則集合:常見的頂層欄位是
payload。這類內容供rule-providers引用,不是節點訂閱,也不能當作代理清單匯入。
以下設定僅用來說明結構。edge.example.com 和 demo-password 都是示範值,無法用於實際連線。範例將本機混合連接埠設為 7890,僅監聽迴路位址,並以手動選擇群組承接所有符合條件的流量。
mixed-port: 7890
allow-lan: false
bind-address: 127.0.0.1
mode: rule
proxies:
- name: DemoTLS
type: trojan
server: edge.example.com
port: 443
password: "demo-password"
sni: edge.example.com
udp: true
proxy-groups:
- name: Manual
type: select
proxies:
- DemoTLS
- DIRECT
rules:
- MATCH,Manual
此處的 443 是遠端代理伺服器的連接埠,7890 則是本機應用程式連線到用戶端代理服務的連接埠,兩者不可互換。將 YAML 轉成節點 URI 時,必須保留遠端連接埠;本機監聽連接埠、策略群組與預設規則通常不會出現在節點連結中。
選擇與實際核心相容的設定
先在用戶端的「關於」或核心資訊頁面確認核心名稱,再查看該核心支援的協定。介面支援貼上連結,不代表執行中的核心支援連結使用的協定。Clash Meta 延續發展的 mihomo 與較早期的 Clash 核心,在協定與欄位支援方面有所不同,不能只憑檔名決定轉換目標。
Base64 訂閱:解碼不等於轉換
先在本機解碼並查看結果。Base64 是編碼方式,不是代理協定,也不是加密機制。常見訂閱會將多條節點 URI 逐行排列,再把整段文字編碼;也有服務會編碼其他資料結構,因此不能預設解碼後就能直接匯入 Clash。
留意兩層編碼:訂閱外層可能使用 Base64,內部的某條 vmess:// 連結也可能將 JSON 編碼成 Base64;部分 ss:// 連結也會編碼驗證資訊。正確順序是先還原訂閱外層,再交由能解析該協定的工具處理單一連結,而不是反覆解碼每一段字串。
使用 Python 在本機檢查編碼內容
將收到的編碼內容存成 subscription.txt,再使用 Python 3 執行以下程式碼。此腳本支援常見的 Base64 與 URL 安全字元集,會忽略空白並補齊末尾填充;輸出會寫入 decoded.txt,不會主動連線至網路。若輸入實際上是 YAML、網頁或一般 URI,應先依其實際格式處理。
from pathlib import Path
import base64
import binascii
source = Path("subscription.txt").read_text(encoding="utf-8")
compact = "".join(source.split())
compact += "=" * (-len(compact) % 4)
try:
raw = base64.b64decode(compact, altchars=b"-_", validate=True)
text = raw.decode("utf-8")
except (ValueError, binascii.Error, UnicodeDecodeError) as exc:
raise SystemExit("無法將內容解碼為 Base64 UTF-8 文字,請檢查原始資料。") from exc
Path("decoded.txt").write_text(text, encoding="utf-8")
print("已寫入 decoded.txt;請在本機查看內容類型。")
- 若看到逐行排列的
ss://、trojan://等內容:進入 URI 與設定欄位的對應步驟。 - 若看到
proxies::先確認內容是否已是 YAML,不要再執行一次「節點轉換」。 - 若看到 HTML 登入頁、錯誤提示或 JSON 錯誤物件:先排除訂閱請求問題,轉換器無法補出不存在的節點資料。
反過來說,將多行 URI 編碼成 Base64,只是重新包裝同一組連結。它不會自動產生 rules 或 proxy-groups,也無法補上遺漏的 TLS、WebSocket 或驗證參數。
URI 轉 YAML:逐項對應連線參數
先用一個節點核對欄位,再進行批次轉換。以下的 Trojan URI 對應前面的 YAML 節點。連結中的片段 #DemoTLS 是顯示名稱,不是驗證資訊;查詢參數 sni 用來指定 TLS 伺服器名稱。
trojan://[email protected]:443?sni=edge.example.com#DemoTLS
| URI 部分 | YAML 欄位 | 處理要點 |
|---|---|---|
| trojan:// | type: trojan | 依協定對應,不要改成其他代理類型 |
| demo-password | password | 依 URI 規則還原百分比編碼 |
| edge.example.com | server | 保留連線位址,不要用備註取代 |
| 443 | port | 填入連接埠數值,不要填本機代理連接埠 |
| sni=edge.example.com | sni | 與 server 分開儲存,兩者可能不同 |
| #DemoTLS | name | 還原名稱後,檢查是否重複及群組引用 |
這條 URI 沒有明確包含前述範例中的 udp: true,因此不能宣稱還原後可逐字重現原設定。轉換器可能使用自己的預設值;正式使用前,應依服務能力與目標核心的要求,明確確認 UDP 設定。
分別處理協定與傳輸層
- Shadowsocks:保留加密方式、密碼、伺服器與連接埠;若連結包含外掛程式,也要檢查外掛程式名稱與選項。只儲存主機與密碼可能無法建立連線。
- VMess:常見分享連結內含編碼後的 JSON,需要解析 UUID、連接埠、傳輸類型、TLS 等欄位;不能把整段解碼結果當成 YAML。
- VLESS 與其他協定:先確認目標核心與轉換器都支援,再核對 flow、TLS、Reality 等協定相關參數,不要只因欄位名稱相近就直接替換。
- WebSocket 或 gRPC:也要保留路徑、Host 要求標頭或服務名稱等參數。即使代理協定相同,傳輸設定不同也可能完全無法連線。
不要用「依冒號切割字串」的方式手寫通用解析器。IPv6 位址本身就含有冒號,密碼可能含有跳脫字元,節點名稱也可能包含中文。應使用 URI 解析工具,並依各協定規範處理編碼,避免重複解碼而改動密碼中的字面內容。
YAML 轉 URI:釐清哪些資訊會遺失
URI 只適合作為單一節點的交換格式。完整 YAML 涵蓋的內容更廣,匯出節點連結通常無法攜帶整套執行環境。若要更換用戶端並保留分流邏輯,應優先遷移相容的完整設定,而非先匯出 URI 再重新匯入。
檢查四類無法完整隨節點遷移的設定
- 策略群組:
select、url-test、fallback的群組成員、探測網址與切換邏輯,通常不屬於節點 URI。 - 分流規則:
DOMAIN-SUFFIX、GEOIP、MATCH與規則提供者引用,不會因為匯出節點而自動保留。 - 本機環境:監聽連接埠、系統代理、TUN、DNS、外部控制介面等設定,都需要在新設定或新用戶端中另行安排。
- 擴充參數:特殊傳輸、憑證處理、多工及核心擴充欄位可能沒有通用的 URI 表示方式,或只有部分匯入工具能辨識。
即使兩端都支援相同協定,分享連結的參數名稱也可能因實作而異。轉換後應逐項比對伺服器、連接埠、驗證資訊、TLS 名稱與傳輸設定。不要為了成功匯入就刪除無法辨識的參數,更不要把略過憑證驗證當成通用修復方式。
自架轉換:限制入口並固定輸出範本
優先在本機執行,或部署於僅自己能存取的環境。自架轉換的重點不只在產生 YAML,還包括保護來源訂閱憑證、限制遠端擷取範圍,以及固定可供檢查的轉換範本。
- 選擇實作:確認轉換器明確支援來源協定、目標核心與所需擴充欄位。記錄部署版本與範本修訂,更新前保留一份可正常運作的輸出。
- 限制監聽:本機服務可只監聽
127.0.0.1。例如使用本機連接埠25500時,不要直接將該連接埠開放至公網;實際連接埠請以所選實作的設定為準。 - 固定範本:審核範本中的策略群組、規則與遠端資源網址。轉換時只替換節點,不要讓來源不明的範本順帶變更 DNS、控制介面或流量出口。
- 處理遠端 URL:為來源訂閱與遠端範本設定允許清單,限制重新導向、回應大小與請求逾時,避免服務被用來存取內網或雲端執行個體的中繼資料網址。
- 控管記錄:避免記錄完整查詢字串、驗證標頭與訂閱內容。需要分享記錄時,先遮蔽權杖,並定期清除產生的檔案與快取。
透過 URL 參數傳遞來源訂閱時,應將完整來源網址正確進行一次百分比編碼。例如來源網址本身帶有 ?token= 和 &type=,未編碼就嵌入另一個 URL,參數可能會被外層請求截斷。優先使用轉換器文件支援的本機檔案或要求本文入口,減少憑證出現在瀏覽器歷史記錄與存取記錄中的機會。
也要區分靜態轉換與持續訂閱:下載並產生檔案一次,只會取得當下的快照。若要自動更新,必須保留可靠的更新入口,或在設定中使用核心支援的代理集合機制。遠端更新是否會覆蓋本機修改,取決於用戶端的合併與覆寫方式,不能只看「已開啟自動更新」的開關。
轉換後驗證:依序檢查結構、連線與分流
先檢查設定,再切換目前使用的設定。保留原本可用的訂閱,避免批次轉換後失去比對依據。使用 mihomo 時,可對產生的檔案執行設定測試;以下命令中的檔名是本機儲存的輸出檔案。
mihomo -t -f ./converted.yaml
測試通過表示設定符合該核心的檢查要求,不代表遠端節點可用。引用遠端資源的設定也可能受本機檔案、網路連線與執行目錄影響,測試環境應盡量與正式執行環境一致。
| 狀況 | 優先檢查項目 | 後續處理 |
|---|---|---|
| 訂閱下載成功,卻沒有節點 | 回應是否為網頁、錯誤物件或不支援的編碼 | 在本機查看回應內容,確認格式後再匯入 |
| 顯示未知的代理類型 | 核心是否支援該協定 | 確認核心支援能力與轉換目標,別只改副檔名 |
| 看得到節點,但連線失敗 | 密碼、SNI、傳輸路徑與服務名稱 | 逐項比對原始節點,先測試單一節點 |
| 連線正常,但分流方式改變 | 策略群組、規則順序與 MATCH 目標 | 查看連線記錄中的命中規則與實際策略 |
| 更新後本機規則消失 | 本機修改是否直接寫入遠端設定副本 | 使用用戶端支援的覆寫或獨立設定方式 |
完成基本驗證
- 確認轉換前後的節點數量與名稱,檢查是否有過濾、重新命名或解析失敗。
- 只選擇一個已知可用的節點,確認 TLS 與傳輸參數完整後,再擴大至整份清單。
- 若沿用範例的
7890混合連接埠,請先確認監聽成功,再讓應用程式連線至該連接埠。 - 分別檢查一般網頁瀏覽、DNS 解析與需要 UDP 的應用程式;一次網頁瀏覽成功,無法涵蓋所有使用情境。
最後保留一份轉換紀錄:來源格式、目標核心、轉換器與範本版本,以及手動補上的欄位。日後訂閱更新失效時,就能判斷問題出在來源資料、解析過程或本機執行設定,不必反覆嘗試不同的線上轉換入口。