Line Messaging API
收費
方案
- 輕用量: 免費, 500則訊息, 超過額度不可加購
- 中用量: 月費800NTD, 4000則免費, 超過免費額度每則0.2元
- 高用量: 月費4000NTD, 25000則免費, 超過免費額度每則約0.15元
費用計算方式
參考說明: https://tw.linebiz.com/column/budget-auto-count/
- 不列入計費
- 加入好友歡迎訊息
- 一對一聊天訊息(人工回應)
- 自動回應訊息與關鍵字回覆訊息, 如果是好友觸發的情況下不需計費
- Messaging API回覆(Reply Message)
- 需要計費
- Messaging API主動推播(Push Message)
收費訊息計算方式
參考說明: https://tw.linebiz.com/faq/oa-price#how-to-calculate-message-expense
Provider設定
首先前往Line Developer Console設定頁面
建立Provider或是開啟原有的Provider
建立Messaging API類型的Channel
設定好一些Bot的基本資料
像是名稱、大頭貼、Channel名稱、敘述等
設定webhook
因為Webhook URL必須是對外網址
而且是HTTPS 如果在local開發可使用ngrok
保留介接資料
最後將Line Developer Console的Channel Access Token及Channel Secret保留下來
Webhook
透過Webhook可讓Line在指定的Line@帳號收到事件時
直接帶相關資料通知系統
驗證訊息
相關文件:https://developers.line.biz/en/docs/messaging-api/receiving-messages/#verifying-signatures
到目前為止
這隻接收webhook的api只要成功發佈出去
已經人讓任何人來call了
因此我們必須依照文件的signature validation建議來驗證所有來的請求
上面也有各種語言的範例
不過因為我是使用Line官方的PHP SDK line-bot-sdk-php
SDK驗證的部份都包好而且還有範例
所以可以很簡單的來做驗證
<?php
namespace Modules\Line\Http\Controllers;
use Illuminate\Http\Request;
use LINE\LINEBot;
use Modules\Base\Http\Controllers\BaseController;
use LINE\LINEBot\HTTPClient\CurlHTTPClient;
use Modules\Line\Constant\LineHookHttpResponse;
class LineHookController extends BaseController
{
public function hooks(Request $request)
{
$httpClient = new CurlHTTPClient(env('LINE_CHANNEL_ACCESS_TOKEN'));
$bot = new LINEBot($httpClient, [
'channelSecret' => env('LINE_CHANNEL_SECRET')
]);
$signature = $request->header(LINEBot\Constant\HTTPHeader::LINE_SIGNATURE);
if(!$signature) {
return $this->http403(LineHookHttpResponse::SIGNATURE_INVALID);
}
try {
$bot->parseEventRequest($request->getContent(), $signature);
} catch (LINEBot\Exception\InvalidSignatureException $exception) {
return $this->http403(LineHookHttpResponse::SIGNATURE_INVALID);
} catch (LINEBot\Exception\InvalidEventRequestException $exception) {
return $this->http403(LineHookHttpResponse::EVENTS_INVALID);
}
$events = $request->events;
foreach ($events as $event) {
logger(json_encode($event));
}
return $this->http200();
}
}
驗證這段寫完之後
要再點選Webhook Verify按鈕確認Code是否有問題
測試Webhook
可以先開一支api回傳http status code 200
並從Line Developer Console上點選Webhook Verify按鈕
確認此api是否能通
Webhook event type
相關文件
主要分為一對一、群組/多人聊天
包含
- 訊息類型(限群組)
- 訊息發送失敗追蹤(限一對一)
- 取消追蹤(限一對一)
- line@被加入群組/多人聊天(限群組)
- line@被離開群組/多人聊天(限群組)
- 某會員加入群組/多人聊天(限群組)
- 某會員離開群組/多人聊天(限群組)
- postback
- 影片觀看結束(限一對一)
發送、回覆訊息
發送訊息:使用Line Bot物件的pushMessage method,帶$messageBuilder及userId
回覆訊息:使用Line Bot物件的replyMessage method,帶$messageBuilder及webhook中帶的replayToken
另外Line的PHP SDK雖然有各種message類型的builder
但我還是偏好直接用RawMessageBuilder
只要依照文件帶入原始的message object格式即可
不需要額外查專屬的builder底下的各種method用法
<?php
namespace Modules\Line\Console;
use LINE\LINEBot;
use LINE\LINEBot\HTTPClient\CurlHTTPClient;
class MessageTest
{
protected $bot;
public function start()
{
$httpClient = new CurlHTTPClient(env('LINE_CHANNEL_ACCESS_TOKEN'));
$this->bot = new LINEBot($httpClient, [
'channelSecret' => env('LINE_CHANNEL_SECRET')
]);
$messageBuilder = new \LINE\LINEBot\MessageBuilder\RawMessageBuilder([
'type' => 'text',
'text' => 'foobar',
]);
$this->bot->pushMessage($userId, $messageBuilder); // 直接發送訊息
$this->bot->replyMessage($replyToken, $messageBuilder); // 回覆訊息(webhook)
}
}
訊息類型
- message: 純文字
- location: 位置訊息
- carousel: 輪播
- flex message
- button
- video
- sticker
- image
- voice
- file
Rich Menu(圖文選單)
Line@可設定Rich Menu
概念為使用一個底圖
並設定多個Rich Menu Area
每個Area可設定邊界(bounds)的座標、寬、高
並設定每個Area被按下的action
透過這些Area設定來模擬按鈕的動作
圖片設計規範
可前往Line官方帳號主控台 > 主頁 > Sidebar圖文選單 > 建立/開啟圖文選單
點擊"設計規範"按鈕
開啟Popup後將會出現一個下載範本壓縮檔
可直接參考這些範本的大小
建立Rich Menu流程
- 建立全新的Rich Menu(Rich menu create API)
- 上傳Rich Menu圖片(Rich menu upload image API)
- 將該Rich Menu設定為預設Rich Menu(Set default rich menu)
上傳圖片的部份如果用guzzlehttp要注意
body要用fopen method來指向Rich Menu底圖的絕對路徑
<?php
$response = $this->client->request('POST', "https://api-data.line.me/v2/bot/richmenu/{$richMenuId}/content", [
'headers' => [
'Authorization' => "Bearer {$accessToken}",
'Content-Type' => 'image/png',
],
'body' => fopen($richMenuImagePath, "r")
]);
設定指定user的Rich Menu
若需要指定的user給予不同的Rich Menu
可用這兩隻API來設定
顯示優先權
顯示優先權由高至低為
- 指定user的rich menu
- 由Messaging API設定的預設Rich Menu
- 由官方帳號後台設定的預設Rich Menu
限制
userID
userID是基於provider建立的
也就是說即使同個Line user
當使用不同provider的時候
該user的ID將會不同
rich menu
- 圖片寬度必須介於800px - 2500px
- 圖片高度必須大於250
- 圖片寬高比必須大於1.45
- 圖片檔案大小最大為1MB
- 最多20個area
- 設定的Action Object不可使用以下類型(以下類型僅限使用Messaging API回覆或發送訊息使用)
- Location
- Camera
- CameraRoll
回應模式
Bot模式、聊天模式只能擇一