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】
protected $except = [
'line/*',
];
LaravelとLINE連携準備
プロジェクトとデータベース作成後、プロジェクト内の.envファイルを開きます。
LINE側で設定してきた 「チャンネルシークレット」 「チャンネルアクセストークン」を入れておきます。
【.env】
LINE_MESSENGER_SECRET=チャンネルシークレット LINE_CHANNEL_TOKEN=チャンネルアクセストークン
次にconfigにも、この設定を反映します。config/servicesの中に下記コードを追加します。
【services.php】
'line' => [
'channel_token'=>env('LINE_CHANNEL_TOKEN'),
'messenger_secret'=>env('LINE_MESSENGER_SECRET')
],
ライブラリのインストール
さらに、LineとLaravelを連携させるためのライブラリをインストールしておきましょう。
composer require linecorp/line-bot-sdk
LINEメッセージ送受信用ルート設定
ルート設定は、こちら。
【web.php】
// LINE メッセージ受信
Route::post('/line/webhook', 'LineMessengerController@webhook')->name('line.webhook');
// LINE メッセージ送信用
Route::get('/line/message', 'LineMessengerController@message');
LINEログイン用コントローラの作成
次にLINEログイン用のコントローラを作成します。
php artisan make:controller LineMessengerControllers
色々と手順がありましたが、ここからいよいよ動きをつけていきます。
①LINEでつながったユーザーにメッセージを返す
まずはLINEでつながったユーザーに、メッセージを返してみましょう。
コントローラに次のように記述します。これによって、メッセージを送ったユーザーに、自動でメッセージが返信されます。
【LineMessangerController.php】
<?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】
// 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】
<?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’ ;のみのコードを書きましょう。
class LineMessengerController extends Controller
{
public function webhook(Request $request) {
return 'ok';
}
}
LINE Developperにて、検証ボタンをおします。

ちゃんと通っていれば、次のように「成功」がでてきます。ダメな場合は、ルート設定など見直してみてください。

コントローラで値が取得できているかチェックして
上記で問題ない場合、コントローラのどこかで、処理がつまづいている可能性があります。
値がちゃんと取れているかチェックして確認しつつ、進めていくと良いですよ。
このとき、file_put_contentsを使うと、可視化できます。
file_put_contentsの使い方は、こちらの記事にまとめています。
さいごに
Laravelを使って、LINEへメッセージを送信してみました。
連携の設定は面倒ですが^^; 運用によって、色々なことができます。
特定のキーワードのメッセージを送ってくれたら動作を変えるとか。
ユーザーが会員制サイト内でボタンを押したり、何かの操作をしたと同時にLINEでメッセージを送るとか。
あなたのサイトにあった運用方法を取り入れてくださいね。

連携させると、可能性が広がっていきますよね♪
わたしも引き続き、色々と楽しんでみます。





コメント
非常に参考になりました!
本当にありがとうございます!
嬉しいコメント、ありがとうございます!