V2Ray 訂閱格式解析:Base64、原生 JSON 與分享連結轉換

解析 Base64 訂閱、原生 JSON 設定檔與 vmess://、vless:// 分享連結的差異,並說明手動或透過用戶端互相轉換的方法。

本文重點

訂閱網址用來取得內容,Base64 用來編碼文字,分享連結描述單一節點,原生 JSON 則描述核心執行設定。本文適合遇到「訂閱有內容卻無法匯入」、「JSON 不能轉成連結」等問題的使用者:先辨識輸入格式,再離線解碼,最後透過用戶端產生設定並核對欄位,避免轉換時遺漏路由、DNS 或安全性參數。

一、先分清訂閱網址、訂閱內容與節點設定

以 https:// 開頭的訂閱網址只是取得內容的入口,不代表回應一定採用特定格式。伺服器可能回傳 Base64 文字、逐行排列的分享連結,也可能回傳特定用戶端專用的設定。要判斷能否匯入,應查看下載的內容,而不是網址副檔名是否為 .txt 或 .json。

常見的 Base64 訂閱會將「多個節點分享連結以換行符號串接後的全文」編碼。內容通常有兩層編碼:外層編碼整份清單,內層則可能是每條 vmess:// 後方的節點 JSON。解開外層不會自動得到完整的核心設定。Base64 是可逆編碼,不具備保密功能。

項目常見形式包含內容處理方式
訂閱網址以 https:// 開頭遠端資源位置,可能包含存取權杖訂閱群組設定
Base64 訂閱內容較長的編碼文字通常是編碼後、逐行排列的分享連結更新訂閱或先離線解碼
分享連結清單vmess://、vless://一個或多個節點的連線參數從剪貼簿匯入
原生 JSON包含 inbounds、outbounds 等鍵入站、出站,以及選用的 DNS、路由設定自訂設定入口

判斷方式:先看內容,再選匯入入口

內容若已是逐行排列的分享連結,就不要再次解碼;若包含完整的入站與出站結構,就不要當成訂閱網址新增。若回傳的是登入頁面或錯誤頁面,應先排除訂閱存取問題,而非繼續轉換。

二、VMess 與 VLESS 分享連結如何表示參數

常見的 vmess:// 分享格式會將描述單一節點的 JSON 編碼後,接在協定標頭後方。解碼後常見欄位包括 add、port、id、net、host、path 和 tls。這裡的 JSON 屬於分享格式,並非可直接交由核心執行的原生 JSON。

以下是用來說明結構的 VMess 節點描述。位址與 UUID 都是文件範例,並不對應可連線的服務;v: "2" 是這類分享格式的版本標記,不是用戶端版本。現代 VMess 節點通常使用 aid: "0",實際值仍應以伺服器設定為準。

{
  "v": "2",
  "ps": "範例-VMess-WS",
  "add": "example.com",
  "port": "443",
  "id": "123e4567-e89b-42d3-a456-426614174000",
  "aid": "0",
  "scy": "auto",
  "net": "ws",
  "type": "none",
  "host": "example.com",
  "path": "/proxy",
  "tls": "tls",
  "sni": "example.com"
}

VLESS 分享連結通常採用 URI 格式。使用者名稱欄位存放 UUID,主機與連接埠代表連線目標,查詢參數描述傳輸與安全性設定,井字號後方則是節點備註。以下範例使用 WebSocket 與 TLS,不包含額外的流控參數。

vless://[email protected]:443?encryption=none&security=tls&type=ws&host=example.com&path=%2Fproxy&sni=example.com#範例-VLESS-WS

三、離線解碼與重新編碼 Base64 訂閱

處理實際訂閱時,應將訂閱網址、UUID 和解碼後的內容都視為敏感資料。不要將它們提交至不熟悉的線上轉換網站。可以在本機空白頁面的瀏覽器開發者工具中執行檢查過的程式碼;操作前請確認頁面沒有其他指令碼讀取輸入內容,並留意開發者工具可能保留操作紀錄。

以下函式只會在本機轉換字串,不會發出網路請求。解碼函式相容常見的標準 Base64 與 URL 安全字元,可處理編碼文字中的換行,並補上缺少的尾端等號。若輸入內容本身不是 Base64,仍應檢查來源,不要靠反覆編碼、解碼碰運氣。

function decodeBase64Utf8(input) {
  const normalized = input.trim()
    .replace(/\s+/g, "")
    .replace(/-/g, "+")
    .replace(/_/g, "/");
  if (normalized.length % 4 === 1) {
    throw new Error("Base64 長度不合法");
  }
  const padded = normalized.padEnd(
    Math.ceil(normalized.length / 4) * 4, "="
  );
  const bytes = Uint8Array.from(atob(padded), c => c.charCodeAt(0));
  return new TextDecoder("utf-8", { fatal: true }).decode(bytes);
}

function encodeBase64Utf8(text) {
  const bytes = new TextEncoder().encode(text);
  let binary = "";
  for (const byte of bytes) binary += String.fromCharCode(byte);
  return btoa(binary);
}
3 → 4
Base64 每 3 個位元組轉成 4 個字元
443
本文範例的遠端 TLS 連接埠
10808
本文 JSON 使用的本機 SOCKS 連接埠

將原始訂閱內容作為字串傳入 decodeBase64Utf8,確認解碼結果是否逐行顯示協定標頭。若要產生傳統 Base64 訂閱,應先整理有效的分享連結,再呼叫 encodeBase64Utf8(links.join("\n"))。不要對整份清單執行 URL 解碼,否則節點參數中原本已編碼的分隔符號可能會被提前還原。

  1. 移除文字開頭可能存在的位元組順序標記,依 \r?\n 分行,並刪除空白行。
  2. 逐行確認協定標頭;錯誤頁面、流量說明與公告文字不應混入節點清單。
  3. 只有在需要查看 VMess 節點欄位時,才解碼單條連結中 vmess:// 後方的內容。
  4. 重新編碼後再反向解碼一次,確認節點行數與中文備註沒有變動,再匯入用戶端測試。

四、透過用戶端匯入、匯出與產生設定

日常移轉時,建議先讓用戶端解析分享連結,再由用戶端產生對應的核心設定。這樣能減少手動填寫欄位時出錯,但仍須核對傳輸參數。v2rayN 桌面版在不同版本中的選單文字可能略有差異,以下依常見選單名稱說明;若找不到完全相同的項目,請尋找功能相同的選項,而不是改用無關的自訂設定入口。

  1. 備份群組

    先記下目前使用中的伺服器與訂閱群組,並保存原始訂閱網址。將測試內容放入獨立群組,避免大量匯入後影響原有使用設定。

  2. 新增訂閱

    在 v2rayN 開啟「訂閱群組」→「訂閱群組設定」,新增群組並填入訂閱網址。返回「訂閱群組」後,執行「更新全部訂閱(不透過代理)」;若該網址需要透過代理存取,則選擇對應的代理更新選項。

  3. 匯入單一連結

    複製完整的分享連結,在「伺服器」→「從剪貼簿批次匯入 URL」中執行匯入。此處只貼上節點連結;本機 JSON 檔案應透過自訂設定功能處理。

  4. 匯出後核對

    選取節點並按右鍵,使用目前版本提供的分享 URL 匯出或複製功能。將匯出的結果重新匯入測試群組,開啟編輯視窗,逐一比對位址、連接埠、UUID、傳輸類型、SNI 與路徑。

  5. 驗證連線

    將測試節點設為目前使用的伺服器,查看核心啟動記錄,再驗證實際請求。只有在用戶端提供「匯出完整設定」或類似功能時,才匯出原生 JSON;複製分享連結不等於匯出執行設定。

Android 版 v2rayNG 常見的操作方式是在主畫面點選「+」→「從剪貼簿匯入」;訂閱網址則在「訂閱群組設定」中新增,再執行更新訂閱。v2flyNG 也應依其介面分別使用訂閱管理與單一節點匯入功能。這兩款 Android 用戶端使用的核心家族不同,成功解析 VLESS 連結不代表具備該連結所需的所有傳輸能力,尤其要確認是否支援 REALITY 等功能。

五、分享連結如何對應至原生 JSON

原生 JSON 的結構取決於目標核心,而非檔案副檔名。完整的執行設定除了遠端節點,也需要本機入站設定與必要的出站選擇。以下提供 Xray 格式的 VLESS、WebSocket、TLS 範例,展示如何對應上文 URI 的欄位。範例位址不可用於實際服務;若本機已有程式使用 10808,請改用未占用的連接埠,並同步修改呼叫端。

{
  "log": {
    "loglevel": "warning"
  },
  "inbounds": [
    {
      "tag": "local-socks",
      "listen": "127.0.0.1",
      "port": 10808,
      "protocol": "socks",
      "settings": {
        "auth": "noauth",
        "udp": true
      }
    }
  ],
  "outbounds": [
    {
      "tag": "proxy",
      "protocol": "vless",
      "settings": {
        "vnext": [
          {
            "address": "example.com",
            "port": 443,
            "users": [
              {
                "id": "123e4567-e89b-42d3-a456-426614174000",
                "encryption": "none"
              }
            ]
          }
        ]
      },
      "streamSettings": {
        "network": "ws",
        "security": "tls",
        "tlsSettings": {
          "serverName": "example.com",
          "allowInsecure": false
        },
        "wsSettings": {
          "path": "/proxy",
          "headers": {
            "Host": "example.com"
          }
        }
      }
    }
  ]
}

VMess 的出站協定與使用者欄位必須依照 VMess 結構產生,不能只將上述 protocol 改成 vmess 就算完成。若 VLESS 連結使用 REALITY、特定指紋或流控,也必須採用目標核心支援的對應結構,並保留公鑰、短識別碼等必要參數。JSON 語法正確只代表格式合法,不代表核心支援或伺服器參數正確。

六、哪些轉換能保留資訊,哪些不能

「JSON 轉訂閱」常被誤以為只要將檔案做一次 Base64 編碼。實際上至少需要兩個步驟:先從設定中找出可分享的代理出站,轉成用戶端可識別的 URI,再依訂閱接收端的要求進行包裝。若直接編碼完整 JSON,解碼後仍然是 JSON,不會自動變成節點清單。

由用戶端匯出分享連結

建議

匯出用戶端已辨識為一般節點的項目,減少欄位對應錯誤。匯出後仍須檢查安全層、傳輸參數與目標用戶端的相容性。

適用情境:移轉單一節點、整理個人節點清單

離線轉換節點欄位

只處理明確支援的協定與參數;遇到不認識的欄位時,應停止處理並記錄。不要為了「成功匯入」而悄悄捨棄流控、SNI 或傳輸設定。

適用情境:核對少量節點、排查編碼與 URI 轉義問題

保留完整原生設定

保留入站、DNS、路由與多個出站之間的關係,並在相容的核心中以自訂設定方式執行。跨核心移轉時,需逐項檢查欄位。

適用情境:複雜分流、鏈式出站、依賴完整執行環境的設定

原生設定可能包含直連出站、封鎖出站、負載選擇與依網域分流的規則。這些內容無法透過單一節點 URI 表達。即使已擷取所有代理伺服器,原本「哪些請求要走哪個出站」的規則也不會隨分享連結一併移轉。節點轉換後可以連線,不代表原有路由策略已經還原。

判斷方式:分開移轉節點與設定

若只需連線至同一台伺服器,請匯出分享連結並逐欄核對;若要保留 DNS、路由或多出站關係,請備份完整設定,再於目標用戶端另外還原執行策略。

七、訂閱轉換常見問題與處理順序

訂閱更新成功,為什麼節點清單還是空的?

先查看回應內容是否真的包含節點。若解碼結果以 HTML 標籤開頭,通常表示取得的是登入頁面或存取錯誤頁面;若內容是原生 JSON,則應使用相符的設定入口。接著檢查群組篩選條件,避免節點已匯入卻被目前檢視畫面隱藏。

Base64 解碼後中文備註變成亂碼,該怎麼辦?

使用 UTF-8 位元組解碼,不要直接將 atob 回傳的位元組字串當成中文文字。可以使用本文的 TextDecoder 方法。若只有 URI 的井字號備註仍顯示百分比編碼,只需對備註部分執行 URI 解碼。

JSON 轉出的連結可以匯入,卻無法連線?

先核對位址、連接埠與 UUID,再檢查 TLS 的 SNI、WebSocket 的 Host 與路徑。若原設定使用 REALITY 或其他特定功能,也要確認目標核心是否支援,且參數完整。不要為了掩蓋轉換遺漏而停用憑證驗證。

原本的中國大陸直連規則怎麼不見了?

分享連結通常只包含單一節點資訊,不會包含完整路由。請回到目標用戶端的路由設定還原分流策略,或使用相容的完整原生設定。檢查預設出站,避免將直連出站誤認為需要匯出的代理節點。

把訂閱網址傳給轉換網站後,該怎麼處理?

若無法確認對方如何保存輸入內容,請在服務提供者的管理介面重設訂閱權杖,再到用戶端更新網址。重設權杖不一定會同步更換現有節點憑證;若節點連結也已外洩,還需依服務提供者提供的方式更換相關憑證。

最後依「輸入格式正確 → 解碼文字正確 → 節點欄位完整 → 核心功能相符 → 實際請求成功」的順序驗收。每次只調整一個環節,並保留轉換前的文字備份。如此一來,遇到匯入失敗、TLS 交握錯誤或分流變動時,就能找出具體遺漏的欄位,而不必反覆更換格式。

下載用戶端