Line Rich Menu Manager

API 文件

讓其他網站的後端用 API Key 建立、上傳與管理 LINE 圖文選單。由邊境部署提供。

授權

Base URL:https://line-menu-hub.edgedeploy.tw/api/v1

到管理後台 /line 的「API 金鑰」分頁產生金鑰, 每把金鑰綁定一個 LINE 官方帳號,請求會自動作用在該帳號。金鑰明文只顯示一次,撤銷即時生效。

Authorization: Bearer lrm_xxxxxxxxxxxxxxxx

未開放 CORS,請從伺服器端呼叫;金鑰放環境變數,不要放進前端程式碼或公開的版本庫。

端點

  • GET/richmenus列表,回 { richmenus, defaultId, aliases }
  • POST/richmenus建立 → 上傳圖 → alias → 預設,任一步失敗自動回滾,回 { richMenuId }
  • GET/richmenus/:id取得單一選單
  • GET/richmenus/:id/image取得選單圖片
  • DELETE/richmenus/:id刪除選單(一併刪除指向它的 alias)
  • POST/richmenus/validate驗證選單物件 { menu }
  • GET/aliasesAlias 列表
  • POST/aliases新增 { richMenuAliasId, richMenuId }
  • PUT/aliases/:alias改指向 { richMenuId }
  • DELETE/aliases/:alias刪除 alias
  • POST/default/:richMenuId設為預設選單
  • DELETE/default取消預設選單
  • POST/users/:userId/richmenu/:richMenuId綁定單一用戶
  • DELETE/users/:userId/richmenu解除單一用戶
  • POST/users/bulk-link批次綁定 { richMenuId, userIds[] },每批 500 自動分批
  • POST/users/bulk-unlink批次解除 { userIds[] }

建立選單 POST /richmenus

menu 為 LINE 的 rich menu 物件(不含 richMenuId)。圖片限 JPEG / PNG、≤ 1 MB、寬 800~2500、高 ≥ 250、寬高比 ≥ 1.45,格式以檔頭判斷。

multipart/form-data 欄位

  • menu:JSON 字串(必填)
  • image:圖片檔,或改用 imageUrl(https 網址,由本系統下載)
  • aliasId:選填,[a-z0-9_-]{1,32}
  • setDefault:選填,true 設為預設選單

curl

curl -X POST https://line-menu-hub.edgedeploy.tw/api/v1/richmenus \
  -H "Authorization: Bearer $LRM_KEY" \
  -F 'menu={"size":{"width":2500,"height":1686},"selected":true,"name":"main","chatBarText":"選單","areas":[{"bounds":{"x":0,"y":0,"width":2500,"height":1686},"action":{"type":"uri","uri":"https://example.com"}}]}' \
  -F image=@menu.png \
  -F aliasId=main \
  -F setDefault=true

Node.js

// 在你的伺服器端執行(Node 18+),不要放進瀏覽器程式碼
const form = new FormData();
form.set("menu", JSON.stringify(menu));
form.set("image", new Blob([pngBuffer], { type: "image/png" }), "menu.png");
form.set("aliasId", "main");

const res = await fetch("https://line-menu-hub.edgedeploy.tw/api/v1/richmenus", {
  method: "POST",
  headers: { Authorization: `Bearer ${process.env.LRM_KEY}` },
  body: form,
});
const { richMenuId } = await res.json();

JSON + 圖片網址

JSON 本文也可用 image.base64 傳圖。

curl -X POST https://line-menu-hub.edgedeploy.tw/api/v1/richmenus \
  -H "Authorization: Bearer $LRM_KEY" \
  -H "Content-Type: application/json" \
  -d '{"menu":{"size":{"width":2500,"height":1686},"selected":true,"name":"main","chatBarText":"選單","areas":[{"bounds":{"x":0,"y":0,"width":2500,"height":1686},"action":{"type":"uri","uri":"https://example.com"}}]},"image":{"url":"https://cdn.example.com/menu.png"},"setDefault":true}'

成功回應

{ "richMenuId": "richmenu-8a2b..." }

列表 GET /richmenus

一次取得所有選單、目前的預設選單 ID 與全部 alias。

curl https://line-menu-hub.edgedeploy.tw/api/v1/richmenus -H "Authorization: Bearer $LRM_KEY"

# 回應
{
  "richmenus": [
    {
      "richMenuId": "richmenu-8a2b...",
      "size": { "width": 2500, "height": 1686 },
      "selected": true,
      "name": "main",
      "chatBarText": "選單",
      "areas": [ { "bounds": { "x": 0, "y": 0, "width": 2500, "height": 1686 }, "action": { "type": "uri", "uri": "https://example.com" } } ]
    }
  ],
  "defaultId": "richmenu-8a2b...",   // 沒有預設選單時為 null
  "aliases": [ { "richMenuAliasId": "main", "richMenuId": "richmenu-8a2b..." } ]
}

Alias 管理

Alias 用於按鈕動作「切換選單」(richmenuswitch)做分頁。成功皆回 { "ok": true }。 alias 已存在時新增會失敗(LINE 回 400),要換指向請用 PUT。

# 新增 alias(a-z 0-9 _ -,1~32 字元)
curl -X POST https://line-menu-hub.edgedeploy.tw/api/v1/aliases \
  -H "Authorization: Bearer $LRM_KEY" -H "Content-Type: application/json" \
  -d '{"richMenuAliasId":"page2","richMenuId":"richmenu-8a2b..."}'

# 改指向另一張選單
curl -X PUT https://line-menu-hub.edgedeploy.tw/api/v1/aliases/page2 \
  -H "Authorization: Bearer $LRM_KEY" -H "Content-Type: application/json" \
  -d '{"richMenuId":"richmenu-c3d4..."}'

# 刪除
curl -X DELETE https://line-menu-hub.edgedeploy.tw/api/v1/aliases/page2 -H "Authorization: Bearer $LRM_KEY"

錯誤

錯誤一律回 JSON:

{ "message": "圖片超過 1MB", "details": null }
  • 400 參數或圖片不合規(LINE 回的驗證錯誤會原樣帶在 details)
  • 401 沒帶金鑰、金鑰無效或已撤銷
  • 404 找不到選單 / alias
  • 5xx 伺服器或 LINE 端錯誤

注意事項

  • imageUrl 僅支援 https;解析到內網 / 保留位址會被拒、不跟隨轉址、10 秒逾時、最大 1 MB。
  • 建立流程中任一步失敗,已建立的選單與 alias 會自動刪除,不會留下殘缺內容。
  • 本服務沒有速率限制,LINE 本身有 API 配額,必要時請在呼叫端節流。
  • 刪除選單會一併刪除指向它的 alias。