Line Messaging API

2022/06/11

收費

參考文件

方案

  • 輕用量: 免費, 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

Screenshot_20220612_162041.png

設定好一些Bot的基本資料

像是名稱、大頭貼、Channel名稱、敘述等

 

 

設定webhook

因為Webhook URL必須是對外網址

而且是HTTPS 如果在local開發可使用ngrok

 

保留介接資料

最後將Line Developer Console的Channel Access TokenChannel 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圖文選單 > 建立/開啟圖文選單

點擊"設計規範"按鈕

Screenshot_20220613_121210.png

 

開啟Popup後將會出現一個下載範本壓縮檔

可直接參考這些範本的大小

rich-menu-.png

 

建立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來設定

 

顯示優先權

參考Rich Menu display priority

顯示優先權由高至低為

  1. 指定user的rich menu
  2. 由Messaging API設定的預設Rich Menu
  3. 由官方帳號後台設定的預設Rich Menu

 

限制

 

userID

userID是基於provider建立的

也就是說即使同個Line user

當使用不同provider的時候

該user的ID將會不同

Screenshot_20220613_003648.png

 

rich menu

  • 圖片寬度必須介於800px - 2500px
  • 圖片高度必須大於250
  • 圖片寬高比必須大於1.45
  • 圖片檔案大小最大為1MB
  • 最多20個area
  • 設定的Action Object不可使用以下類型(以下類型僅限使用Messaging API回覆或發送訊息使用)
    • Location
    • Camera
    • CameraRoll

 

回應模式

Bot模式、聊天模式只能擇一