教學

LIFF 開發教學 2026:Next.js 與 TypeScript 實作

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

LineBot.pro Team· 更新 18 分鐘閱讀
LIFF 開發教學 2026:Next.js 與 TypeScript 實作

#什麼是 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」或類似字串
SizeCompact、Tall 或 Full,也就是 LIFF 瀏覽器的畫面高度。liff.requestFriendship() 與模組模式需要 Full
Endpoint URL應用的網址,必須是 https,且不能包含 URL 片段(#...)
Scopesopenid(ID Token)、email(頻道已取得電子郵件權限時)、profile(getProfile、getFriendship)、chat_message.write(sendMessages)
Add friend optionOff、On (normal) 或 On (aggressive),在同意畫面邀請使用者加官方帳號好友
Scan QR要使用 liff.scanCodeV2() 時開啟
Module mode隱藏標頭的動作按鈕(僅限 Full)

儲存後會得到 LIFF ID(例如 1234567890-AbcdEfgh)與 LIFF URL(https://liff.line.me/1234567890-AbcdEfgh)。

#3. 建立專案

bash
# 用 LINE 的產生器建立新專案(範本中有 Next.js)
npx @line/create-liff-app

# 或在既有的 Next.js 專案中加入 SDK
npm install @line/liff@^2.31.2
bash
# .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:

tsx
// 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 的路由:

tsx
// 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>
}

#顯示個人資料

tsx
// 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)。

ts
// 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
}
ts
// 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 筆記開啟,或經由網站轉址開啟也會失敗。

ts
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。

ts
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 條碼掃描

ts
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 的外部瀏覽器中使用。

#最佳實務

#同時照顧三種瀏覽器

tsx
// 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() 能為目前頁面產生連結:
ts
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 解除應用授權。

#部署與測試

  1. 部署到任何 HTTPS 主機(Vercel、Cloud Run 或自有伺服器),並設定 NEXT_PUBLIC_LIFF_ID 與 LINE_LOGIN_CHANNEL_ID。
  2. 把 LIFF 應用的 Endpoint URL 改成部署後的網址,或應用所在的子路徑。
  3. 在 iOS 與 Android 上,從聊天室開啟 LIFF URL 測試。

#用 LIFF CLI 在本機開發

LINE 的 LIFF CLI 會在本機伺服器前面架一個 HTTPS 代理,並把 LIFF 應用的 Endpoint URL 指向它:

bash
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 網址不會。


下一步:

關於 LineBot.pro

LineBot.pro 是專為 LINE 官方帳號打造的 AI 工具,可製作圖文選單、圖文訊息與橫幅,群發行銷活動,並依關鍵字自動回覆。這些指南由我們的團隊根據 LINE Messaging API 的實務經驗撰寫。

聯絡我們
LineBot.pro

準備好讓您的 LINE 官方帳號自動運作了嗎?

立即使用 LineBot.pro,開始自動化您的 LINE 訊息溝通。