LINE DevelopersではLINEを活用した様々なサービスが提供されています。


その中でもポピュラーなのがLINE Messaging APIです。LINEでメッセージを送信したり、Webサイトへのリンクを表示したりなど、ビジネスシーンでLINEを使った例は数多くあります。
今回はLaravelでLINE Messaging APIを活用したボット機能を作成していきます。

バージョン
Laravel 8.60.0
line-bot-sdk ^7.2

APIを使用するにはLINE Developerへの登録が必要です。

また、実際にWebhookを受け取るために何かしらのサーバーにデプロイしておく必要があります。
とりあえずデプロイするなら無料で使えるHerokuがおすすめです。

Heroku スターターガイド (Laravel)
【Laravel】Herokuでのデプロイ

プロバイダーとチャネルの作成

LINEにチャネルを作成していきます。

まずはプロバイダーを作成します(すでにプロバイダーをお持ちの場合はそちらをお使い頂いても大丈夫です)。

LINE Developerのトップページにアクセスし、プロバイダーの「作成」ボタンを押下してください。

任意のプロバイダー名を入力します。

これでプロバイダーの作成は完了です。

プロバイダーには様々なLINEのサービスを利用したチャネルを作成することができます。
今回はLINE Messaging APIを利用します。

チャネル名やチャネル説明など必須項目を入力していきます。

入力したら「作成」ボタンを押下し、各モーダルを確認しチャネルを作成してください。

では作成したチャネルに実際にLINEアプリでアカウントを開いてみましょう。
Messaging API設定タブを開くとそこにQRコードがあるのでそちらを読み取ってください。
友だち追加するとTLが開きます。

このTL上でボットを作成していきます。

次回はLaravel側の設定をしていきます。

env設定

Laravel側ではまずLINEのアクセストークンとチャネルシークレットを.envに設定します。

アクセストークンはMessaging APIタブの一番下にあるチャネルアクセストークンとなります。

チャネルシークレットはチャネル基本設定タブにあります。

それぞれ.envに記載します。

#LINE Messaging API
LINE_ACCESS_TOKEN= #こちらにアクセストークン
LINE_CHANNEL_SECRET= #こちらにチャネルシークレット

envを設定したのでconfigファイルも作成します。
config/line.phpを作成し、以下のように記述してください。

<?php

return [
    'access_token'   => env('LINE_ACCESS_TOKEN'),
    'channel_secret' => env('LINE_CHANNEL_SECRET'),
];

これで設定が完了です。

次回はサーバーの処理を記述していきます。

処理の実装

LINE Messaging APIにはSDKが用意されています。以下のコマンドでSDKをプロジェクトに導入してください。

composer require linecorp/line-bot-sdk

ではまずはコントローラーを作成していきます。
App\Http\Controllers\LineMessageController.phpを作成してください。

namespace App\Http\Controllers;

use Illuminate\Http\Request;

class LineMessageController extends Controller
{

}

Messaging APIの処理はサービスに切り出して利用します。
app/Services/LineMessagingApiService.phpを作成して以下のように記述してください。

<?php

namespace App\Services;

class LineMessagingApiService
{

}

APIの利用にはアクセストークンとチャネルシークレットが必要になります。
今回はAppServiceProviderでLineMessagingApiServiceのインスタンス生成時に.envに設定したアクセストークンとチャネルシークレットが注入されるように設定します。

<?php

namespace App\Providers;

use App\Services\LineMessagingApiService;
use Illuminate\Support\ServiceProvider;

class AppServiceProvider extends ServiceProvider
{
    public function register()
    {
        // インスタンス生成時、access_tokenやchannel_secretを設定
        $this->app->bind(LineMessagingApiService::class, function () {
            return new LineMessagingApiService(
                config('line.access_token'), config('line.channel_secret')
            );
        });
    }
}

このように外部から依存関係を注入することによってクラス内にハードコーディングする必要がなくなり、いざenvのものとは別の値を使いたい場合にも対応できます。

ではLineMessagingApiServiceに記述していきます。以下のように記述してください。

<?php

namespace App\Services;

class LineMessagingApiService
{
    private $accessToken;
    private $channelSecret;
    private $httpClient;
    private $bot;

    public function __construct($accessToken, $channelSecret)
    {
        $this->accessToken = $accessToken;
        $this->channelSecret = $channelSecret;
        $this->httpClient = new \LINE\LINEBot\HTTPClient\CurlHTTPClient($this->accessToken);
        $this->bot = new \LINE\LINEBot($this->httpClient, ['channelSecret' => $this->channelSecret]);
    }

    /**
     * 応答メッセージを送る
     * @param $replyToken
     * @param string $text
     * @return \LINE\LINEBot\Response
     */
    public function SendReplyMessage($replyToken, string $text): \LINE\LINEBot\Response
    {
        $textMessageBuilder = new \LINE\LINEBot\MessageBuilder\TextMessageBuilder($text);
        return $this->bot->replyMessage($replyToken, $textMessageBuilder);
    }
}

コンストラクタではアクセストークンとチャネルシークレットの設定、CurlHTTPClientとLINEBotのインスタンス化をしています。ボットでは基本的にLINEBotクラスを利用していきます。

SendReplyMessageメソッドはLINEから送られてきたメッセージに対して応答メッセージを返す機能です。
このメソッドをコントローラーで利用します。

では、はじめに作ったLineMessageControllerに以下のように記述していきましょう。

<?php

namespace App\Http\Controllers;

use App\Services\LineMessagingApiService;
use Illuminate\Http\Request;

class LineMessageController extends Controller
{
    private $lineMessagingApiService;

    public function __construct(LineMessagingApiService $lineMessagingApiService)
    {
        $this->lineMessagingApiService = $lineMessagingApiService;
    }

    public function webhook(Request $request)
    {
        $replyToken = $request->events[0]['replyToken'];
        $this->lineMessagingApiService->SendReplyMessage($replyToken, 'サンプルメッセージ');
    }
}

コンストラクタインジェクションでLineMessagingApiServiceのインスタンスを受け取りプロパティに設定しています。

そしてwebhookアクションでは先程作成したSendReplyMessageを呼び出して応答メッセージを送信します。

LINEのタイムライン上でなにかメッセージを送信するとこのWebhookが呼び出され、Requestでユーザー情報やメッセージ情報を受け取ります。$request->events[0][‘replyToken’]でトークンを取得することができ、これをSendReplyMessageメソッドの第一引数に渡し、第2引数に応答メッセージのテキストを渡します。

最後にルートを定義しましょう。

// LINE messaging API
Route::post('line_message/webhook', [LineMessageController::class, 'webhook'])->name('line_message.webhook');

webhookではCSRFは無視したいため、App\Http\Middleware\VerifyCsrfTokenに以下のように記述してください。

<?php

namespace App\Http\Middleware;

use Illuminate\Foundation\Http\Middleware\VerifyCsrfToken as Middleware;

class VerifyCsrfToken extends Middleware
{
    /**
     * The URIs that should be excluded from CSRF verification.
     *
     * @var array
     */
    protected $except = [
        'line_message/webhook'
    ];
}

これでOK…と思いきや、最後にLINE DeveloperコンソールにWebhookURLを設定する必要があります。
ここまで記述できたら一度サーバーにデプロイし、Messaging API設定タブにあるWebhook設定の項目にデプロイしたサイトのURLを入力してください。また、Webhookの利用もONにしてください。

これで完成です。
実際に適当なメッセージをLINEのタイムラインに投稿してみてください。すると、「サンプルメッセージ」というメッセージが返ってきます。

「メッセージありがとうございます!」のメッセージがいらないですね。この辺のOFF設定は、LINE Official Account Managerで設定することができます。

LINE Official Account Managerではアカウントや権限設定、応答設定、それから有料プラン切り替えなど様々な設定をすることができるので覗いてみてください。

まとめ

LINE Messaging APIを使えばLINEアカウントを友だち登録しているユーザーにメッセージを送信したり、ユーザーのメッセージに対して応答メッセージを返すなどコミュニケーションを取ることができます。また、WebサービスでAPIを利用することによって様々な機能を使うことができるのでLINEで何ができるのか一度調べてみると面白い企画ができるかもしれません。

参考URL

Messaging APIリファレンス

【Laravel】Herokuでのデプロイ

この記事をシェアする

Laravel開発のお悩み相談・学習サポートはこちら

じゅのきちメンターサービス

じゅのきちメンターサービス