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=trueNode.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"綁定與解除(link / unlink)
綁定後,該用戶看到的是你指定的選單,優先於預設選單;解除後會回到預設選單。userId 是 LINE 的用戶 ID(U 開頭)。
綁定
# 綁定單一用戶
curl -X POST https://line-menu-hub.edgedeploy.tw/api/v1/users/U1234567890abcdef/richmenu/richmenu-8a2b... \
-H "Authorization: Bearer $LRM_KEY"
# 批次綁定(userIds 最多 500 個一批,超過會自動分批)
curl -X POST https://line-menu-hub.edgedeploy.tw/api/v1/users/bulk-link \
-H "Authorization: Bearer $LRM_KEY" -H "Content-Type: application/json" \
-d '{"richMenuId":"richmenu-8a2b...","userIds":["U111...","U222..."]}'解除
# 解除單一用戶(該用戶改回使用預設選單)
curl -X DELETE https://line-menu-hub.edgedeploy.tw/api/v1/users/U1234567890abcdef/richmenu \
-H "Authorization: Bearer $LRM_KEY"
# 批次解除
curl -X POST https://line-menu-hub.edgedeploy.tw/api/v1/users/bulk-unlink \
-H "Authorization: Bearer $LRM_KEY" -H "Content-Type: application/json" \
-d '{"userIds":["U111...","U222..."]}'成功回應
單一用戶:{ "ok": true }
批次:{ "ok": true, "count": 2 }- 批次為 LINE 的非同步處理:回
ok代表 LINE 已受理,實際生效可能稍有延遲。 userIds必須是非空字串陣列,重複的 ID 會自動去除;不符合回 400。- 選單需已上傳圖片才能綁定(用本 API 的 POST /richmenus 建立的選單都符合)。
錯誤
錯誤一律回 JSON:
{ "message": "圖片超過 1MB", "details": null }400參數或圖片不合規(LINE 回的驗證錯誤會原樣帶在 details)401沒帶金鑰、金鑰無效或已撤銷404找不到選單 / alias5xx伺服器或 LINE 端錯誤
注意事項
imageUrl僅支援 https;解析到內網 / 保留位址會被拒、不跟隨轉址、10 秒逾時、最大 1 MB。- 建立流程中任一步失敗,已建立的選單與 alias 會自動刪除,不會留下殘缺內容。
- 本服務沒有速率限制,LINE 本身有 API 配額,必要時請在呼叫端節流。
- 刪除選單會一併刪除指向它的 alias。