LINE Messaging APIを使用してLINE通知

# 概要

※当記事は所属している[株式会社コンピュータテクノブレイン](https://computer-tb.co.jp/2022/10/23/line-messaging-api%e3%82%92%e4%bd%bf%e7%94%a8%e3%81%97%e3%81%a6line%e9%80%9a%e7%9f%a5/)にて投稿した内容を転載したものです。

株式会社コンピュータテクノブレインのシステム開発部　森岡です。

タイトルの通り`LINE Messaging API`を使用してLINE通知を行う方法を紹介したいと思います。

# `LINE Messaging API`とは？

皆さんがよく使用されているアプリの <strong>LINE</strong> に対してプッシュ通知など様々なことが行えるAPIです。

詳しくは [公式サイト](https://developers.line.biz/ja/services/messaging-api/) を参照してください。

# `LINE Messaging API`を使用した実装

早速`LINE Messaging API`を使用したプログラムの実装を行っていきたいと思います。

使用するプログラム言語は`PHP`、使用するフレームワークは`Laravel`とします。

## １．`LINE Messaging API`を使用するための準備

まず、`LINE Messaging API`を使用するためには [LINE Developers](https://developers.line.biz/ja/) へ登録する必要があります。

登録は簡単で、`LINE Developers`ページの右上のログインボタンをクリックし、表示されたページのアカウントを作成リンクをクリックして指示に従っていくと登録ができます。

登録後に、`LINE Developers`ページの`Messaging API`をクリックし、表示されたページで「今すぐはじめよう」ボタンをクリック

![6c18b71fcb61c070ddfce47075108712-1024x489.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/152063/5853bb89-b807-9df1-5bec-d77e90a1ccdd.png)

表示されたページでチャネルを新規に作成します。

![10b5890c7dafe4b91bff1351a4c1cd83-1024x490.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/152063/4ee886e9-90a2-3a81-3bf4-ee17e1319b05.png)

登録したチャネルから必要な情報（アクセストークン、チャネルシークレット）を取得します。

必要な情報は後々使用するのでメモしておきます。

【チャネルシークレット】

チャネル基本設定タブのチャネルシークレットから取得します。

![e466106ad1c7de053532bf213ca56977-1-1024x489.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/152063/2b43264d-f545-c602-2efe-e0b644e3a5b0.png)

【アクセストークン】

Messaging API設定タブの下部にチャネルアクセストークンという項目があるので発行しておきます。

![554887152a33dce1f53013f84ea13742-1024x490.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/152063/16a23c27-c32f-8d61-be87-683dbb535c6e.png)

【webhook設定】

フォローされた場合、フォロー解除された場合にLINEからアプリ側への通知を受信する場合のためwebhookの設定を行います。

具体的にはLaravel側でAPIエンドポイントを用意しておき、Webhook URLにエンドポイントのURLを設定するといった流れです。

![cfcecca73cf71cd2ca1e62a91dc50b8f-1024x489.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/152063/b80feccb-2a79-553e-0e51-7b334ebbe044.png)

## ２．Laravel側の設定

Laravelのプロジェクト設定などは説明しません。プロジェクトが出来上がっていることから始めることとします。

### LINEユーザーを格納するテーブルを作成する。

Artisanを使用してLINEユーザーを格納するテーブル（`line_users`とします）を作成する。

```php
php artisan make:model LineUser
```

```diff_php
<?php

use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

class CreateLineUsersTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('line_users', function (Blueprint $table) {
+            $table->bigIncrements('id');
+            $table->string('line_id', 255)->comment('LINE ID');
+            $table->enum('mode', ['active', 'standby'])->comment('チャネルの状態');
+            $table->string('name', 255)->comment('LINEの名前');
+            $table->timestamps();
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::dropIfExists('line_users');
    }
}
```

### LaravelのCSRF例外設定

API経由でPOSTメソッドを使うため、CSRFの例外設定を行う必要があります。

`app/Http/Controllers/Middleware`の中の`VerifyCsrfToken.php`ファイルを開き、次のようにいれておきます。

これによって、「ドメイン/line」で始まるルート設定は、CSRFの対象外にできます。

```diff_php
<?php

namespace App\Http\Middleware;

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

class VerifyCsrfToken extends Middleware
{
    /**
     * Indicates whether the XSRF-TOKEN cookie should be set on the response.
     *
     * @var bool
     */
    protected $addHttpCookie = true;

    /**
     * The URIs that should be excluded from CSRF verification.
     *
     * @var array
     */
+    protected $except = [
+        'line/registration/webhook',
+    ];
}
```

### Laravel側にLINE設定を登録

`.env`ファイルにLINEの設定情報（アクセストークン、チャネルシークレット）を登録する。

```
LINE_MESSENGER_SECRET=チャネルシークレット
LINE_CHANNEL_TOKEN=アクセストークン
```

## ３．Laravel側のコーディング

ここまで来てやっとコーディングができます。（設定が少し大変ですが頑張って設定しましょう）

### Webhook用のAPIの作成

まずはルート設定から行います。

以下の通り設定することにより`ドメイン/line/registration/webhook`がAPIのエンドポイントとなります。

```php
Route::prefix('line')->group(function() {
    Route::post('registration/webhook', 'LineRegistrationController@webhook');
});
```

### APIコントローラの作成

```php
<?php

namespace App\Http\Controllers;

use App\Models\LineUser;
use Illuminate\Http\Request;
use LINE\LINEBot;
use LINE\LINEBot\Event\FollowEvent;
use LINE\LINEBot\Event\UnfollowEvent;
use LINE\LINEBot\HTTPClient\CurlHTTPClient;
use LINE\LINEBot\MessageBuilder\TextMessageBuilder;

class LineRegistrationController extends Controller
{
    public function webhook(Request $request)
    {
        $channel_secret = env('LINE_MESSENGER_SECRET');
        $access_token = env('LINE_CHANNEL_TOKEN');

        $signature = null;
        $request_body = $request->getContent();
        $client = new CurlHTTPClient($access_token);
        $bot = new LINEBot($client, ['channelSecret' => $channel_secret]);

        try {
            $events = $bot->parseEventRequest($request_body, $signature);
            foreach ($events as $event) {
                $line_id = $event->getEventSourceId();
                $reply_token = $event->getReplyToken();
                // フォローイベントの場合
                if ($event instanceof FollowEvent) {
                    // line_usersテーブルへ登録する
                    $mode = $event->getMode();
                    $profile = $bot->getProfile($line_id)->getJSONDecodedBody();
                    $display_name = $profile['displayName'];
                    $line_user = LineUser::firstOrNew(['line_id' => $line_id]);
                    $line_user->mode = $mode;
                    $line_user->name = $display_name;
                    $line_user->save();

                    // リプライテキストを設定し、フォローしてくれたユーザーに返信する
                    $text_message = new TextMessageBuilder('フォローありがとうございます。');
                    $bot->replyMessage($reply_token, $text_message);
                // フォロー解除イベントの場合
                } else if ($event instanceof UnfollowEvent) {
                    // line_usersテーブルからデータを削除する
                    $line_user = LineUser::findByLineId($line_id);
                    if (!empty($line_user) && $line_user instanceof LineUser) {
                        $line_user->delete();
                    }
                }
            } catch (\Exception $exception) {
                // エラー処理
            }
        }
    }
}
```

### 特定ユーザーへプッシュ通知を行う

```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() {
 
        // Line Botの設定
        $http_client = new CurlHTTPClient(env('LINE_MESSENGER_SECRET'));
        $bot = new LINEBot($http_client, ['channelSecret' => env('LINE_CHANNEL_TOKEN)]);

        // メッセージ設定
        $message = "こんにちは！";

        // メッセージ送信
        $textMessageBuilder = new TextMessageBuilder($message);
        // 登録されているLineUserテーブルのline_idを指定してプッシュ通知を行う。
        $line_user = LineUser::find(1);
        $response = $bot->pushMessage($line_user->line_id, $textMessageBuilder);
    }
}
```

# 最後に

今回は`LINE Messaging API`を使用してLINEプッシュ通知を行ってみました。

`LINE Messaging API`を使用すると顧客管理システムへLINE連携情報を登録したり、顧客管理システムと連動してメルマガ配信等色々なことができそうですね。

弊社では`Laravel`や`Ruby on Rails`を使用してウェブシステムの構築を得意としております。

弊社にお仕事を依頼したいお客様がいらっしゃいましたら、以下のフォームもしくはメールにてお気軽にお問い合わせ下さい。

[お問合せ](https://computer-tb.co.jp/contact/)

システム開発部 森岡（morioka_tatsuaki@computer-tb.co.jp）