LaravelでMessage APIを用いたLINE BOTを開発する
2022-04-10
2022-04-10
7 min read
LINE BOT
Laravel
Message API
とは、LINEが公式で提供しているAPIで、ユーザー個人に合わせた体験を提供できるLINE BOT
を作成することができます。
例えば、ユーザーが送信したメッセージの内容から、適した返信を自動で行うといった感じです。 また送信されたメッセージからは、LINEのLogin情報を用いて、ユーザーの情報(LINEで付与されているidやユーザー名など)を受け取ることができます。これをDBで持っている情報と連携したりすると、より高度なLINE BOTを作ることもできます。
まずは「こちら(LINE Developers)」からログインを行います。 (※ログインにはLINEのアカウントが必要になります。)
ログイン後、コンソール画面からProvider
を作成し、Provider内にMessage APIのChannel
を作成します。作成したChannelのアクセストークン
とチャンネルシークレット
は、一旦控えておきます。Webhook URL
には、開発を行うAPIのエンドポイントを設定します。
※Webhook URL設定例
なお、LINE BOTで使用する公式LINEアカウントの設定は、こちら「LINE Official Account Manage」から行えます。
今回は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開発と比べるとスムーズにいかない部分もあり、工数などは少しかかる気がしました。