LaravelとLINEを連携させて、LaravelからLINEにメッセージを送信したり、送信されたメッセージに自動返信したりしてみます。
前回はLaravelにLINEでログインを試してみました。
引き続き、LaravelとLINE連携、楽しんでいきましょう♪
なお、LaravelのバージョンはLaravel8を使ってテストしています。
LINE側の設定
まずはLINE側の設定から。
LINE Developpersを使います。既存のLINEアカウントまたはビジネスアカウントでログインをします。その先の設定は、次のとおりです。
LINE Messaging API チャンネルを作成
LINE DeveloppersのページからLINE Messaging APIを選択。
【今すぐはじめよう】ボタンをクリックして、登録スタート。
下記に入力して、開発者契約同意にチェックを入れ、【作成】ボタンをクリックします。
- プロバイダー:新規プロバイダー作成
- プロバイダー名:お好きなもの
- チャンネルアイコン:お好きなもの
- チャンネル名:お好きなもの
- チャンネル説明:お好きなもの
- 大業種・小業種:選択
- メールアドレス
チャンネルシークレットとチャンネルアクセストークン取得
設定に必要な2つの情報をLINEから取ってきます。
まずはチャンネル作成後、ページ内の「チャンネルシークレット」をコピーします。
【チャンネルシークレット】
さらに隣の 【Messaging API設定】タブに移動。
下のほうの「チャンネルアクセストークン」を発行して、コピーしておきます。
【チャンネルアクセストークン】
LINE側に設定を行う
次に、LINE側の設定を行っておきます。
【Messaging API設定】タブページの真ん中あたりに、Webhook設定があります。
「https://ドメイン/line/webhook」と入れておきます。「ドメイン」はご利用のものに変えてください。さらに下の「Webhookの利用」の部分をクリックして、有効にしておきます。
なお、まだURLを準備していない場合には、NGROKを使って、https://で始まるテスト用URLを簡単に作成できます。詳しくはこちらの記事をご覧ください。
次に【チャンネル基本設定】タブに戻ります。
LINE OFFICIAL ACCOUNT MANAGERへのリンクをクリックします。
Botが使えるよう、応答設定を次のように設定しておきます。
Laravel側の設定
上記までがLINEの設定です。次にLaravelにうつります。
Laravelプロジェクトを準備
前準備として、プロジェクトの作成を行っておきます。前回の「LaravelにLINEログイン搭載」で使った設定をそのまま利用したいと思います。
前回の記事の 「Laravelプロジェクトを準備」の部分をご覧ください。
Laravelのユーザーテーブルの準備
データベースも作っておきます。こちらも前回の設定を使用します。
前回の記事の 「Laravelのユーザーテーブルの準備」の部分をご覧ください。
LaravelのCSRF例外設定
なお今回は、API経由でpostメソッドを使うため、CSRFの例外設定を行う必要があります。
app/Http/Controllers/Middlewareの中のVerifyCsrfToken.phpファイルを開き、次のようにいれておきます。これによって、「ドメイン/line」で始まるルート設定は、CSRFの対象外にできます。
【VerifyCsrfToken.php】
1 2 3 |
protected $except = [ 'line/*', ]; |
LaravelとLINE連携準備
プロジェクトとデータベース作成後、プロジェクト内の.envファイルを開きます。
LINE側で設定してきた 「チャンネルシークレット」 「チャンネルアクセストークン」を入れておきます。
【.env】
1 2 |
LINE_MESSENGER_SECRET=チャンネルシークレット LINE_CHANNEL_TOKEN=チャンネルアクセストークン |
次にconfigにも、この設定を反映します。config/servicesの中に下記コードを追加します。
【services.php】
1 2 3 4 |
'line' => [ 'channel_token'=>env('LINE_CHANNEL_TOKEN'), 'messenger_secret'=>env('LINE_MESSENGER_SECRET') ], |
ライブラリのインストール
さらに、LineとLaravelを連携させるためのライブラリをインストールしておきましょう。
1 |
composer require linecorp/line-bot-sdk |
LINEメッセージ送受信用ルート設定
ルート設定は、こちら。
【web.php】
1 2 3 4 5 |
// LINE メッセージ受信 Route::post('/line/webhook', 'LineMessengerController@webhook')->name('line.webhook'); // LINE メッセージ送信用 Route::get('/line/message', 'LineMessengerController@message'); |
LINEログイン用コントローラの作成
次にLINEログイン用のコントローラを作成します。
1 |
php artisan make:controller LineMessengerControllers |
色々と手順がありましたが、ここからいよいよ動きをつけていきます。
①LINEでつながったユーザーにメッセージを返す
まずはLINEでつながったユーザーに、メッセージを返してみましょう。
コントローラに次のように記述します。これによって、メッセージを送ったユーザーに、自動でメッセージが返信されます。
【LineMessangerController.php】
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 |
<?php namespace App\Http\Controllers; use LINE\LINEBot\HTTPClient\CurlHTTPClient; use LINE\LINEBot; use App\Models\User; use LINE\LINEBot\MessageBuilder\TextMessageBuilder; use Illuminate\Http\Request; class LineMessengerController extends Controller { public function webhook(Request $request) { // LINEから送られた内容を$inputsに代入 $inputs=$request->all(); // そこからtypeをとりだし、$message_typeに代入 $message_type=$inputs['events'][0]['type']; // メッセージが送られた場合、$message_typeは'message'となる。その場合処理実行。 if($message_type=='message') { // replyTokenを取得 $reply_token=$inputs['events'][0]['replyToken']; // LINEBOTSDKの設定 $http_client = new CurlHTTPClient(config('services.line.channel_token')); $bot = new LINEBot($http_client, ['channelSecret' => config('services.line.messenger_secret')]); // 送信するメッセージの設定 $reply_message='メッセージありがとうございます'; // ユーザーにメッセージを返す $reply=$bot->replyText($reply_token, $reply_message); return 'ok'; } } } |
LINEのチャンネル設定ページ/Messenging APIのQRコードをLINEで読み取ってつながった後、LINEからメッセージを送信してみてください。
成功すれば、コントローラで設定したメッセージが返信されます。
②LINEユーザーがデータベースになければ、ユーザーを追加する
ユーザーをデータベースに保存したい場合は、上記の return ‘ok’ の上に、次のようなコードを追加します。
【LineMessangerController.php】
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
// LINEのユーザーIDをuserIdに代入 $userId=$request['events'][0]['source']['userId']; // userIdがあるユーザーを検索 $user=User::where('line_id', $userId)->first(); // もし見つからない場合は、データベースに保存 if($user==NULL) { $profile=$bot->getProfile($userId)->getJSONDecodedBody(); $user=new User(); $user->provider='line'; $user->line_id=$userId; $user->name=$profile['displayName']; $user->save(); } return 'ok'; |
③ユーザーにメッセージを送ってみる
特定のユーザーにメッセージを送るには、次のようにします。
【LineMessangerController.php】
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
<?php namespace App\Http\Controllers; use LINE\LINEBot\HTTPClient\CurlHTTPClient; use LINE\LINEBot; use App\Models\User; use LINE\LINEBot\MessageBuilder\TextMessageBuilder; use Illuminate\Http\Request; class LineMessengerController extends Controller { // メッセージ送信用 public function message() { // LINEBOTSDKの設定 $http_client = new CurlHTTPClient(config('services.line.channel_token')); $bot = new LINEBot($http_client, ['channelSecret' => config('services.line.messenger_secret')]); // LINEユーザーID指定 $userId = "LINEユーザーID"; // メッセージ設定 $message = "こんにちは!"; // メッセージ送信 $textMessageBuilder = new TextMessageBuilder($message); $response = $bot->pushMessage($userId, $textMessageBuilder); } } |
ルート設定でメッセージ送信用に指定したページ【http://ドメイン/line/message】を開きます。
そのあと、指定したLINEユーザーのLINEを確認してください。
コントローラから送信したメッセージが表示されていれば成功!
APIを使って他にどんなことができるか、詳しくはLINEの公式マニュアルをご覧ください。
Laravel・LINE連携がうまくいかない時の対策
最後に、うまくいかない場合の対策をいくつか紹介しますね。
webhookが送られているかチェックして
もし「API連携がうまくいかない!」場合、そもそもwebhookがちゃんと通っていない可能性も。
まずはコントローラに return ‘ok’ ;のみのコードを書きましょう。
1 2 3 4 5 6 |
class LineMessengerController extends Controller { public function webhook(Request $request) { return 'ok'; } } |
LINE Developperにて、検証ボタンをおします。
ちゃんと通っていれば、次のように「成功」がでてきます。ダメな場合は、ルート設定など見直してみてください。
コントローラで値が取得できているかチェックして
上記で問題ない場合、コントローラのどこかで、処理がつまづいている可能性があります。
値がちゃんと取れているかチェックして確認しつつ、進めていくと良いですよ。
このとき、file_put_contentsを使うと、可視化できます。
file_put_contentsの使い方は、こちらの記事にまとめています。
さいごに
Laravelを使って、LINEへメッセージを送信してみました。
連携の設定は面倒ですが^^; 運用によって、色々なことができます。
特定のキーワードのメッセージを送ってくれたら動作を変えるとか。
ユーザーが会員制サイト内でボタンを押したり、何かの操作をしたと同時にLINEでメッセージを送るとか。
あなたのサイトにあった運用方法を取り入れてくださいね。
連携させると、可能性が広がっていきますよね♪
わたしも引き続き、色々と楽しんでみます。
コメント
非常に参考になりました!
本当にありがとうございます!
嬉しいコメント、ありがとうございます!