logo
Home
About
Works
Blog
Contact

LaravelでMessage APIを用いたLINE BOTを開発する

2022-04-10

2022-04-10

7 min read

LINE BOT

Laravel

目次


  1. Message APIとは
  2. Message APIをLaravelで使用する下準備
  3. 自動返信処理を追加してみる
  4. おまけ
  5. まとめ

Message APIとは

Message APIとは、LINEが公式で提供しているAPIで、ユーザー個人に合わせた体験を提供できるLINE BOTを作成することができます。

例えば、ユーザーが送信したメッセージの内容から、適した返信を自動で行うといった感じです。 また送信されたメッセージからは、LINEのLogin情報を用いて、ユーザーの情報(LINEで付与されているidやユーザー名など)を受け取ることができます。これをDBで持っている情報と連携したりすると、より高度なLINE BOTを作ることもできます。

Message APIをLaravelで使用する下準備

1.LINE Developerへログインして、ProviderやChannelを作成する

まずは「こちら(LINE Developers)」からログインを行います。 (※ログインにはLINEのアカウントが必要になります。

ログイン後、コンソール画面からProviderを作成し、Provider内にMessage APIのChannelを作成します。作成したChannelのアクセストークンチャンネルシークレットは、一旦控えておきます。Webhook URLには、開発を行うAPIのエンドポイントを設定します。

※Webhook URL設定例 Webhook URL設定例

なお、LINE BOTで使用する公式LINEアカウントの設定は、こちら「LINE Official Account Manage」から行えます。

2.line-bot-sdk-phpをインストールして、Channelとの設定を行う

今回はLaravel(PHP)でLINE BOTを開発していくので、line-bot-sdk-phpを使ってインストールします。

envファイルには、控えておいたアクセストークンチャンネルシークレットを記述します。

ChannelのWebhook URLに指定したエンドポイントにルーティングを設定したら、いよいよコントローラーに処理を記述します。

連携周り
/**
 * callback from LINE Message API(webhook)
 * @param Request $request
 * @throws \LINE\LINEBot\Exception\InvalidSignatureException
 */
public function callback(Request $request)
{
    // アクセストークンを使いCurlHTTPClientをインスタンス化
    $httpClient = new \LINE\LINEBot\HTTPClient\CurlHTTPClient(config('const.line_access_token'));
    // CurlHTTPClientとチャンネルシークレットを使いLINEBotをインスタンス化
    $bot = new \LINE\LINEBot($httpClient, ['channelSecret' => config('const.line_channel_secret')]);

    // LINE Messaging APIがリクエストに付与した署名を取得
    $signature = $request->headers->get(HTTPHeader::LINE_SIGNATURE);
    if(!$signature){
        abort(400);
    }
    //ラインプラットフォーム以外
    if(!SignatureValidator::validateSignature($request->getContent(), config('const.line_channel_secret'), $signature){
        abort(400);
    }
}

これでLaravelでLINE Message APIを使う準備は完了です。

自動返信処理を追加してみる

Message APIが使えるようになったので、実際にユーザーから送信されたメッセージに自動返信する機能を入れていきます。

自動返信処理
$events = $bot->parseEventRequest($request->getContent(), $signature);
foreach ($events as $event) {
    // 返信先Token
    $replyToken = $event->getReplyToken();

    switch($event){
        // フォローイベント(友達登録時/ブロック解除時)
        case($event instanceof FollowEvent):
            // 例えばDBにユーザーIDを格納したりする
            $user_id = $event->getUserId();
            User::AddDate($user_id)

            $message = '友達登録ありがとう!';
            $response = $bot->replyText($replyToken, $message);
            return $response->getHTTPStatus();

        // フォロー解除イベント(ブロック時)
        case($event instanceof UnfollowEvent):
            // 例えばDBからユーザー削除したりする
            $user_id = $event->getUserId();
            User::DeleteData($user_id)
            return;

        // おうむ返しする
        case($event instanceof TextMessage):
            $send_Text = $event->getText(); // 送信されたメッセージ
            $response = $bot->replyText($replyToken, $send_Text);
            return $response->getHTTPStatus();

        // スタンプメッセージ
        case($event instanceof StickerMessage):
            $message = 'スタンプありがとう';
            $response = $bot->replyText($replyToken, $message);
            return $response->getHTTPStatus();

        default:
            return;
    }
}

イベント毎に行いたい処理を記述し、ユーザーへのメッセージを自動返信するようにしました。

テキストメッセージでは、ユーザーのメッセージをおうむ返しするような形にしています。

他にも拾えるイベントはあるので、詳しくはドキュメントを参照してみてください!

おまけ

DBでuser_idを紐づけているような場合に、システム側の任意のトリガーでプッシュメッセージを送れる関数を作ります。

プッシュメッセージを送る
/**
* プッシュメッセージ
*
* @param [type] $user_id
* @param [type] $text
* @return integer
*/
public static function sendTextMessageByUserId($user_id, $text){
    // アクセストークンを使いCurlHTTPClientをインスタンス化
    $httpClient = new \LINE\LINEBot\HTTPClient\CurlHTTPClient(config('const.line_access_token'));
    // CurlHTTPClientとチャンネルシークレットを使いLINEBotをインスタンス化
    $bot = new \LINE\LINEBot($httpClient, ['channelSecret' => config('const.line_channel_secret')]);

    $textMessageBuilder = new TextMessageBuilder($text);
    $response = $bot->pushMessage("{$user_id}", $textMessageBuilder);
    return $response->getHTTPStatus();
}

メッセージの送信は、文字だけでなく

  • FlexMessage(リッチメッセージ)
  • クイックボタン(選択肢)

などでも返せます。

FlexMessageはFlex Message Simulatorを使う簡単にレイアウトを確認できます。 simulatorで組んだレイアウトはjsonでコピーすることも可能です。

まとめ

今回は簡単なメッセージを返すボットを作成しました。 ロジックを入れることで、メッセージでやりとりした流れから適した返答を返すなど、より高度なBOTにすることもできます。

またLINEでは、LIFF(LINE Front-end Framework)を用いて、LINEで動くWebアプリケーションを作ることができます。 LIFFについてはまた別の記事にしようと思いますが、LIFFやLINE BOTを連携することで、もっと複雑なシステムも構築できます。 ただ個人的には、普通のWeb開発と比べるとスムーズにいかない部分もあり、工数などは少しかかる気がしました。