LaravelでMessage APIを用いたLINE BOTを開発する
2022-04-10
2022-04-10
6 min read
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設定例
なお、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開発と比べるとスムーズにいかない部分もあり、工数などは少しかかる気がしました。