LIFF 開發教學 2026:Next.js 與 TypeScript 實作
2026 年版 LIFF(LINE Front-end Framework)應用開發教學:頻道與 Endpoint URL 設定、liff.init 規則、伺服器端驗證 ID Token、sendMessages、shareTargetPicker、深層連結、用 LIFF CLI 測試,以及 v2.31.1 安全性更新。

#什麼是 LIFF?
LIFF(LINE Front-end Framework)是 LY Corporation 提供、讓網頁應用在 LINE 裡執行的平台。LIFF 應用其實就是載入 LIFF SDK 的一般 HTTPS 網頁:使用者在 LINE 中點開 LIFF URL 後,不必填登入表單就能取得 LINE 身分,還能把訊息傳到開啟它的聊天室,並叫出 LINE 的分享目標選擇器(share target picker)。本文用 Next.js 與 TypeScript 從頭實作,所有規則都依 2026 年 10 月的 LINE Developers 文件確認過。
#LIFF 應用在哪裡執行
| 環境 | 使用者怎麼進來 | 能用的功能 |
|---|---|---|
| LIFF 瀏覽器 | 在 LINE 中點 LIFF URL(https://liff.line.me/{liffId}) | 全部:自動登入、指定畫面大小、sendMessages、分享目標選擇器、2D 條碼掃描、LIFF 之間切換 |
| LINE 內建瀏覽器 | 在聊天室直接點 Endpoint URL 本身 | 視同外部瀏覽器:不能指定畫面大小,也沒有 sendMessages 與分享目標選擇器 |
| 外部瀏覽器(Chrome、Safari、Edge、Firefox) | 在 LINE 以外開啟網址 | 透過 liff.login() 使用 LINE Login,LINE 專屬功能有限 |
只有在 LIFF 瀏覽器中,liff.isInClient() 才會回傳 true,所以請一律分享 LIFF URL,不要分享 Endpoint URL。
#要做 LIFF 還是 LINE MINI App?
LINE MINI App 使用同一套 LIFF SDK,但放在 LINE MINI App 頻道裡,通過 LINE 的認證審查後還能使用更多功能(認證標章、自訂路徑、加到主畫面捷徑、簡化頻道同意流程)。LINE 已宣布將把 LIFF 整合進 LINE MINI App,並建議新的 LIFF 應用直接建立成 LINE MINI App(2025 年 2 月 12 日公告)。自 2026 年 3 月 11 日起,符合 LINE MINI App Policy 的業者也都能在台灣與泰國發布未認證的 MINI App;在這兩地只有認證供應商(provider)底下的頻道能申請認證審查(LINE Developers 2026 年公告)。以下內容兩者皆適用。
#LIFF 能做與不能做的事
- 能做: 取得使用者的個人資料與 ID Token、在目前聊天室傳送最多 5 則訊息、分享訊息給好友與群組、掃描 2D 條碼、確認並邀請使用者把你的 LINE 官方帳號加為好友、建立永久連結。
- 不能做: 取代你的後端。聊天機器人、推播訊息與群發仍要透過 Messaging API。此外,LIFF 瀏覽器不支援 Service Worker、
download屬性、theme-color meta 標籤,也不能加到主畫面(與外部瀏覽器的差異)。
如果想交給專人開發,我們的 LINE 應用開發服務以客製開發的方式承接 LIFF 與 LINE MINI App 專案。
#設定頻道與新增 LIFF 應用
#1. 選對頻道
LIFF 應用只能放在 LINE Login 頻道或 LINE MINI App 頻道。Messaging API 頻道已不能再新增 LIFF 應用(2020 年 2 月 5 日起)。如果應用要搭配 LINE 官方帳號,請把 LINE Login 頻道建在與 Messaging API 頻道相同的供應商底下,並把官方帳號連結到頻道,加好友選項與好友狀態相關方法才能運作。
#2. 新增 LIFF 應用
在 LINE Developers Console 開啟頻道,切到 LIFF 分頁並點 Add。每個頻道最多可新增 30 個 LIFF 應用(新增 LIFF 應用)。
| 設定項目 | 要填什麼 |
|---|---|
| LIFF app name | 應用名稱,不能包含「LINE」或類似字串 |
| Size | Compact、Tall 或 Full,也就是 LIFF 瀏覽器的畫面高度。liff.requestFriendship() 與模組模式需要 Full |
| Endpoint URL | 應用的網址,必須是 https,且不能包含 URL 片段(#...) |
| Scopes | openid(ID Token)、email(頻道已取得電子郵件權限時)、profile(getProfile、getFriendship)、chat_message.write(sendMessages) |
| Add friend option | Off、On (normal) 或 On (aggressive),在同意畫面邀請使用者加官方帳號好友 |
| Scan QR | 要使用 liff.scanCodeV2() 時開啟 |
| Module mode | 隱藏標頭的動作按鈕(僅限 Full) |
儲存後會得到 LIFF ID(例如 1234567890-AbcdEfgh)與 LIFF URL(https://liff.line.me/1234567890-AbcdEfgh)。
#3. 建立專案
# 用 LINE 的產生器建立新專案(範本中有 Next.js)
npx @line/create-liff-app
# 或在既有的 Next.js 專案中加入 SDK
npm install @line/liff@^2.31.2
# .env.local
NEXT_PUBLIC_LIFF_ID=1234567890-AbcdEfgh
LINE_LOGIN_CHANNEL_ID=1234567890
2026 年 9 月 30 日安全性更新: LINE 發現可能影響安全性的問題,已將 LIFF SDK v2.20.0 至 v2.31.0 列為不建議使用(deprecated),並請所有人更新到 v2.31.1 以上。載入
https://static.line-scdn.net/liff/edge/2/sdk.js的應用已自動更新;透過 npm 安裝或在 CDN 固定版本(.../liff/edge/versions/2.x.y/sdk.js)的應用則要自行更新。目前最新版是 v2.31.2(2026 年 10 月 7 日),詳見 LIFF 版本資訊。
#初始化 LIFF 並辨識使用者
#liff.init() 的規則
以下整理自 Developing a LIFF app:
- 每次開啟頁面都要呼叫
liff.init(),同一個應用內的其他頁面也一樣。 - 只能在 Endpoint URL 或其底下的網址執行。若 Endpoint 是
https://example.com/app/,在https://example.com/初始化不保證能運作(LIFF v2.27.2 起會在主控台顯示警告)。 - Promise 解析前不要變更網址(路由轉址、
history.replaceState、改寫網址的指令碼),因為 LIFF 會把liff.state與憑證放在查詢字串裡。 - 在外部瀏覽器中使用者尚未登入,請設定
withLoginOnExternalBrowser: true或自行呼叫liff.login()。不要從 LIFF 應用送出 LINE Login 的授權請求。
#給 Next.js App Router 用的 LiffProvider
SDK 需要 window,所以只在瀏覽器端、於 useEffect 中 import:
// components/liff-provider.tsx
"use client"
import { createContext, useContext, useEffect, useState, type ReactNode } from "react"
import type { Liff } from "@line/liff"
type Profile = Awaited<ReturnType<Liff["getProfile"]>>
type LiffState = {
liff: Liff | null
profile: Profile | null
error: string | null
ready: boolean
}
const initialState: LiffState = { liff: null, profile: null, error: null, ready: false }
const LiffContext = createContext<LiffState>(initialState)
// 每次載入頁面只初始化一次,即使 React 在開發模式下執行兩次 effect
let liffPromise: Promise<Liff> | null = null
function loadLiff(liffId: string): Promise<Liff> {
liffPromise ??= import("@line/liff").then(async ({ default: liff }) => {
await liff.init({ liffId, withLoginOnExternalBrowser: true })
return liff
})
return liffPromise
}
export function LiffProvider({ liffId, children }: { liffId: string; children: ReactNode }) {
const [state, setState] = useState<LiffState>(initialState)
useEffect(() => {
let cancelled = false
loadLiff(liffId)
.then(async (liff) => {
const profile = liff.isLoggedIn() ? await liff.getProfile() : null
if (!cancelled) setState({ liff, profile, error: null, ready: true })
})
.catch((err: unknown) => {
const message = err instanceof Error ? err.message : String(err)
if (!cancelled) setState({ ...initialState, error: message, ready: true })
})
return () => {
cancelled = true
}
}, [liffId])
return <LiffContext.Provider value={state}>{children}</LiffContext.Provider>
}
export const useLiff = () => useContext(LiffContext)
用它包住需要 LIFF 的路由:
// app/(liff)/layout.tsx
import type { ReactNode } from "react"
import { LiffProvider } from "@/components/liff-provider"
export default function LiffLayout({ children }: { children: ReactNode }) {
return <LiffProvider liffId={process.env.NEXT_PUBLIC_LIFF_ID!}>{children}</LiffProvider>
}
#顯示個人資料
// components/profile-card.tsx
"use client"
import { useLiff } from "./liff-provider"
export function ProfileCard() {
const { ready, error, profile } = useLiff()
if (!ready) return <p>載入中…</p>
if (error) return <p>LIFF 錯誤:{error}</p>
if (!profile) return null
return (
<div className="flex items-center gap-3">
{profile.pictureUrl && (
<img src={profile.pictureUrl} alt="" width={48} height={48} className="rounded-full" />
)}
<p className="font-semibold">{profile.displayName}</p>
</div>
)
}
liff.getProfile() 需要 profile 權限範圍,會回傳 userId 與 displayName,使用者有設定時也會回傳 pictureUrl 與 statusMessage。userId 依供應商而不同:同一個人在另一個供應商底下會是不同的使用者 ID。
#在伺服器端辨識使用者
不要把個人資料,或在瀏覽器讀到的使用者 ID,直接送到你的 API,因為任何人都能偽造。請送出 ID Token 或 Access Token,由伺服器向 LINE 驗證(Using user data in LIFF apps and servers)。
// lib/verify-user.ts(瀏覽器端)
import type { Liff } from "@line/liff"
// 送出 ID Token 而不是個人資料,由伺服器向 LINE 驗證
export async function getVerifiedUserId(liff: Liff): Promise<string> {
const idToken = liff.getIDToken() // 需要 openid 權限範圍
if (!idToken) throw new Error("沒有 ID Token:請確認 openid 權限範圍與登入狀態")
const res = await fetch("/api/liff/verify", {
method: "POST",
headers: { Authorization: `Bearer ${idToken}` },
})
if (!res.ok) throw new Error(`驗證失敗:${res.status}`)
const { userId } = (await res.json()) as { userId: string }
return userId
}
// app/api/liff/verify/route.ts
export async function POST(request: Request) {
const idToken = request.headers.get("authorization")?.replace(/^Bearer /, "")
if (!idToken) return Response.json({ error: "Missing ID token" }, { status: 401 })
const res = await fetch("https://api.line.me/oauth2/v2.1/verify", {
method: "POST",
headers: { "Content-Type": "application/x-www-form-urlencoded" },
body: new URLSearchParams({
id_token: idToken,
// 放置這個 LIFF 應用的 LINE Login 頻道的 Channel ID
client_id: process.env.LINE_LOGIN_CHANNEL_ID ?? "",
}),
})
if (!res.ok) return Response.json({ error: "Invalid ID token" }, { status: 401 })
const payload = (await res.json()) as { sub: string; name?: string; exp: number }
// payload.sub 就是驗證過的 LINE 使用者 ID,用它查詢或建立你的會員
return Response.json({ userId: payload.sub })
}
ID Token 驗證端點會拒絕格式錯誤、已過期、由其他網站核發或核發給其他頻道(client_id)的 Token,並回傳 payload,其中 sub 就是使用者 ID。若想改用 liff.getAccessToken() 取得的 Access Token,請呼叫 GET https://api.line.me/oauth2/v2.1/verify?access_token=...,確認 client_id 等於你的 Channel ID、expires_in 大於 0,再用它呼叫 GET https://api.line.me/v2/profile。使用者關閉 LIFF 應用時,Access Token 會被撤銷。
#傳送訊息、分享與加好友
#傳訊息到目前的聊天室
liff.sendMessages() 會以使用者的身分,在開啟 LIFF 應用的聊天室傳送最多 5 則訊息。只有在下列條件都成立時才能使用:
- 應用在 LIFF 瀏覽器中執行,且是從一對一聊天、群組或多人聊天室開啟;
- 已啟用
chat_message.write權限範圍,且使用者已同意; - 應用不是從「最近使用的服務」重新載入。
否則 Promise 會以 403 錯誤("user doesn't grant required permissions yet")reject。從 Keep 筆記開啟,或經由網站轉址開啟也會失敗。
import type { Liff } from "@line/liff"
export async function sendToChat(liff: Liff, text: string) {
if (!liff.isInClient()) {
alert("請從 LINE 聊天室開啟此頁面再傳送訊息。")
return
}
try {
await liff.sendMessages([{ type: "text", text }])
} catch (err) {
// 403:不是從聊天室開啟、使用者未同意 chat_message.write,
// 或應用是從「最近使用的服務」重新載入
console.error("sendMessages failed", err)
}
}
#用分享目標選擇器分享
分享目標選擇器讓使用者挑選好友、群組與聊天室(不含 OpenChat),用自己的帳號送出你的訊息。使用前要先啟用:在 LIFF 分頁點 shareTargetPicker,同意「Agreement Regarding Use of Information」後按 Enable。
export async function shareProduct(liff: Liff) {
if (!liff.isApiAvailable("shareTargetPicker")) return
const result = await liff.shareTargetPicker(
[
{
type: "flex",
altText: "雞腿便當 NT$120",
contents: {
type: "bubble",
hero: {
type: "image",
url: "https://example.com/images/chicken-set.jpg",
size: "full",
aspectRatio: "20:13",
aspectMode: "cover",
},
body: {
type: "box",
layout: "vertical",
contents: [
{ type: "text", text: "雞腿便當", weight: "bold", size: "lg" },
{ type: "text", text: "NT$120", color: "#06C755" },
],
},
footer: {
type: "box",
layout: "vertical",
contents: [
{
type: "button",
style: "primary",
color: "#06C755",
// 透過分享目標選擇器傳送的訊息只能使用 URI 動作
action: { type: "uri", label: "立即訂購", uri: "https://liff.line.me/1234567890-AbcdEfgh/menu/42" },
},
],
},
},
},
],
{ isMultiple: true },
)
if (result) console.log(`[${result.status}] 已分享`)
else console.log("使用者關閉了選擇器")
}
API 參考文件的重點:
- 最多 5 則訊息;Flex Message 與範本訊息只能使用 URI 動作。
- 送出時 Promise 會以
{ status: "success" }解析,使用者關閉選擇器時則解析為 falsy 值;送出前發生錯誤會 reject。 - 在手機的外部瀏覽器中,選擇器需要 LINE 的單一登入(SSO)工作階段,使用者可能會看到電子郵件登入畫面。
- LINE 不會告訴你分享的訊息有多少人收到。
isMultiple: false只限制每次挑選一位好友,無法阻止使用者重複分享。
#好友狀態與 2D 條碼掃描
export async function askToAddFriend(liff: Liff) {
const { friendFlag } = await liff.getFriendship() // 需要 profile 權限範圍
if (!friendFlag) await liff.requestFriendship() // LIFF v2.28.0 以上,僅限 Full 大小
}
export async function scanTableQr(liff: Liff) {
const { value } = await liff.scanCodeV2() // 先在 Console 開啟「Scan QR」
return value
}
liff.getFriendship() 確認的是連結到頻道的官方帳號。liff.requestFriendship()(v2.28.0,2026 年 3 月)會開啟子視窗,邀請使用者把該帳號加為好友或解除封鎖;回傳值不會告訴你使用者做了什麼,所以之後要再呼叫一次 getFriendship()。liff.scanCodeV2() 可在 iOS 14.3 以上與 Android 的 LIFF 瀏覽器,以及支援 WebRTC 的外部瀏覽器中使用。
#最佳實務
#同時照顧三種瀏覽器
// components/app-shell.tsx
"use client"
import type { ReactNode } from "react"
import { useLiff } from "./liff-provider"
export function AppShell({ children }: { children: ReactNode }) {
const { liff, ready } = useLiff()
if (!ready || !liff) return <p>載入中…</p>
// 在外部瀏覽器中,withLoginOnExternalBrowser 已把使用者導向 LINE Login
// 這裡只負責隱藏需要 LIFF 瀏覽器的功能
const inLine = liff.isInClient()
return (
<main style={{ paddingBottom: "env(safe-area-inset-bottom)" }}>
{children}
{!inLine && <p>在 LINE 中開啟此頁面,才能分享或傳到聊天室。</p>}
</main>
)
}
呼叫選擇器前先用 liff.isApiAvailable("shareTargetPicker") 確認。liff.getContext() 可得知應用從哪裡開啟:utou(一對一聊天)、group、room、external 或 none。
#用正確的方式開啟連結
liff.openWindow({ url, external }) 會在 LINE 內建瀏覽器(預設 external: false)或 LINE 以外開啟網址。LINE 15.20.0 以上,支援 Universal Links 或 App Links 的網址也會留在 LINE 內建瀏覽器,除非設定 external: true 才會交給對應的 App;LINE 14.20.0 至 15.19.x 則一律跳轉到 App(liff.openWindow())。不要假設只有一種行為。
#路由、深層連結與 LIFF 之間切換
- 單頁應用請用 History API 實作;LIFF 對片段(
#)路由的支援有限。 - LIFF URL 可以帶路徑與查詢字串:
https://liff.line.me/1234567890-AbcdEfgh/menu/42?table=7在liff.init()後會導向{Endpoint URL}/menu/42?table=7,可用在圖文選單、Flex Message 按鈕與 QR Code。liff.permanentLink.createUrlBy()能為目前頁面產生連結:
export async function shareCurrentPage(liff: Liff) {
// https://liff.line.me/{liffId}/{path} 會開啟 Endpoint URL 底下相同的路徑
const url = await liff.permanentLink.createUrlBy(window.location.href)
await navigator.clipboard.writeText(url)
}
- 從 LIFF 應用開啟另一個 LIFF 應用(LIFF-to-LIFF)只能在 LIFF 瀏覽器中進行,切換後
chat_message.write權限範圍可能會失效。 - 自 LIFF v2.31.2(2026 年 10 月 7 日)起,LIFF 瀏覽器不再把查詢值中的
?換成&。會用查詢參數接收網址的頁面請重新測試。
#版面、版本與限制
- 依用途選擇畫面大小:多步驟流程用
Full,浮在聊天室上方的簡短表單用Compact或Tall。不要寫死高度,並用env(safe-area-inset-bottom)留出安全區域。 - LINE 26.7.0 起,LIFF 瀏覽器標頭改成直排的三個點,點開是選單(所有分頁、重新整理、縮小、分享等),取代原本的多分頁按鈕。
- CDN 的 edge 路徑會自動跟上新的小版本與修正版;npm 與固定版本要手動更新。LINE 已在 2025 年 12 月停止公布 LIFF 路線圖,請追蹤 LINE Developers 公告。
- 不要透過
https://liff.line.me/做壓力測試,也不要大量呼叫 LIFF API,LINE 的開發準則明文禁止。 - 未經同意,不要用 Cookie 或 localStorage 追蹤使用者,也不要把 LINE 資料和其他工作階段資料綁在一起。使用者在你的服務刪除帳號時,請用 LINE Login API 解除應用授權。
#部署與測試
- 部署到任何 HTTPS 主機(Vercel、Cloud Run 或自有伺服器),並設定
NEXT_PUBLIC_LIFF_ID與LINE_LOGIN_CHANNEL_ID。 - 把 LIFF 應用的 Endpoint URL 改成部署後的網址,或應用所在的子路徑。
- 在 iOS 與 Android 上,從聊天室開啟 LIFF URL 測試。
#用 LIFF CLI 在本機開發
LINE 的 LIFF CLI 會在本機伺服器前面架一個 HTTPS 代理,並把 LIFF 應用的 Endpoint URL 指向它:
npm install -g @line/liff-cli
liff-cli channel add 1234567890 # 會要求輸入 Channel secret
liff-cli serve --liff-id 1234567890-AbcdEfgh --url http://localhost:3000/
# 要在手機上開啟時,改用 ngrok 公開,而不是本機代理
NGROK_AUTHTOKEN=your-token liff-cli serve --liff-id 1234567890-AbcdEfgh --url http://localhost:3000/ --proxy-type ngrok
serve 會改寫 Endpoint URL,請只在另外建立的開發用 LIFF 應用上執行,絕對不要用在已上線的應用。加上 --inspect 可用 LIFF Inspector 除錯,也可以在 LIFF Playground 不寫程式碼就試用 SDK 方法。
#測試清單
- 在 iOS 與 Android 上,從一對一聊天與群組開啟 LIFF URL
- 在 LINE 內建瀏覽器開啟 Endpoint URL:LIFF 專屬功能被隱藏,其他功能正常
- 外部瀏覽器:登入後回到同一頁
- 從聊天室執行
sendMessages,以及沒有權限時的 403 處理 - 分享目標選擇器:送出成功,以及使用者關閉選擇器
- 帶路徑與查詢字串的深層連結,包括值是網址的查詢參數
- 伺服器會拒絕被竄改或過期的 ID Token
- LIFF SDK 為 2.31.1 以上
#LIFF 應用與 LineBot.pro
LineBot.pro 不開發、不代管 LIFF 應用,也沒有 LIFF 範本,更沒有 LIFF SDK 或公開 API。不過有兩項工具可以用在 LIFF 專案裡:
- 從應用送出的訊息: AI 圖文訊息產生器會產生 Flex 泡泡(主圖、文字與按鈕),可下載或複製成 JSON,放進
liff.sendMessages()或liff.shareTargetPicker()。用在選擇器時,請只保留開啟連結的按鈕(URI 動作),傳送文字的按鈕不能使用。每則圖文訊息花費 8 點。 - 應用的入口: 圖文選單產生器以 10 點產生 1 到 6 個按鈕的選單圖片與 JSON。LineBot.pro 不會幫你發布到 LINE:請在 LINE Official Account Manager 上傳圖片,並把按鈕連結設成你的 LIFF URL,或用 Messaging API 送出 JSON。
新註冊送 50 點;點數以一次性點數包購買,不會過期,也沒有月費(價格)。如果你需要的是 LIFF 應用本身、LINE MINI App,或串接 Messaging API 的後端,那屬於依專案報價的客製開發。
#常見問題
Q: LIFF 是什麼的縮寫?
LINE Front-end Framework,是 LY Corporation 提供、讓網頁應用在 LINE 中開啟並使用使用者 LINE 身分的平台。SDK 是 npm 套件 @line/liff,或指令碼 https://static.line-scdn.net/liff/edge/2/sdk.js。
Q: 為什麼 LIFF 的 Endpoint URL 一定要是 HTTPS?
LINE 只接受不含 # 片段的 https Endpoint URL。如果應用或它開啟的內容使用 http,LINE 會改用內建瀏覽器顯示,應用就不再以 LIFF 運作。開發時可使用 LIFF CLI 的代理或 ngrok。
Q: liff.getProfile() 會回傳使用者 ID 嗎?
會。只要使用者同意 profile 權限範圍,就會回傳 userId 與 displayName,有設定時還有 pictureUrl 與 statusMessage。但這只適合用來顯示;要寫進資料庫,請把 liff.getIDToken() 送到伺服器,使用驗證後 Token 中的 sub。不同供應商的使用者 ID 也不同。
Q: 該做 LIFF 應用還是 LINE MINI App? LINE 正把 LIFF 整合進 LINE MINI App,因此建議新應用直接做成 LINE MINI App。兩者使用同一套 LIFF SDK,MINI App 頻道多了認證審查與認證後才能用的功能。自 2026 年 3 月 11 日起,台灣與泰國也能發布未認證的 MINI App。
Q: 為什麼 liff.sendMessages() 會出現 403 錯誤?
這個方法只能在 LIFF 瀏覽器、從聊天室開啟的應用中使用,且使用者已同意 chat_message.write,也不是從「最近使用的服務」重新載入。直接開啟 Endpoint URL、從 Keep 筆記開啟,或經過網站轉址後也會失敗。
Q: 應該使用哪個版本的 LIFF SDK? v2.31.1 以上,2026 年 10 月的最新版是 v2.31.2。LINE 在 2026 年 9 月 30 日因可能的安全性問題,將 v2.20.0 至 v2.31.0 列為不建議使用。CDN 的 edge 路徑會自動更新,npm 與固定版本的 CDN 網址不會。
下一步:
- 想交給專人開發?請看 LIFF 與 LINE MINI App 的 LINE 應用開發服務
- 用 LINE API 串接教學連接你的後端
- 在 LINE Messaging API 2026 更新掌握最近的平台變更
- 想在應用背後加上機器人,請看 LINE Bot 開發教學
關於 LineBot.pro
LineBot.pro 是專為 LINE 官方帳號打造的 AI 工具,可製作圖文選單、圖文訊息與橫幅,群發行銷活動,並依關鍵字自動回覆。這些指南由我們的團隊根據 LINE Messaging API 的實務經驗撰寫。
聯絡我們相關文章

@line/bot-sdk Express 中介軟體實作範例(v11)
@line/bot-sdk v11 的 Express + TypeScript Webhook 完整範例:middleware() 該放哪裡、validateSignature 在 Node.js、Python、PHP 的用法、搭配 Flex Message 的 replyMessage、sentMessages 與引用 token,以及實際會遇到的錯誤。
閱讀更多
LINE Messaging API 2026 更新總整理:開發者必看變更
整理 2025 年到 2026 年 10 月,LINE Messaging API、LIFF 與 LINE MINI App 會影響現有機器人的所有變更:新端點、調降的速率限制、LIFF v2.31.1 安全性更新、Node.js SDK v11、台灣與泰國的 MINI App,以及各國每月免費訊息則數。
閱讀更多
LINE Bot 開發教學 2026:Node.js 與 Python 實作
用 Messaging API 一步步開發 LINE Bot:啟用 Channel、驗證 Webhook 簽章、用 Flex Message 與快速回覆回應、以 postback 完成預約流程、加入只根據 FAQ 回答的 AI,最後部署上線。附 Node.js(@line/bot-sdk v11)與 Python(line-bot-sdk v3)程式碼。
閱讀更多