LINE Messaging APIを使用してLINE通知

システム開発部 森岡です。

1ヶ月に1度は投稿しようと思っていたのですが、既に1ヶ月以上空いてしまいました。。。

今回は資格試験の投稿ではなくプログラムについて投稿となります。

LINE Messaging API とは?

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

詳しくは 公式サイト を参照してください。

LINE Messaging API を使用した実装

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

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

1.LINE Messaging API を使用するための準備

まず、LINE Messaging API を使用するためには LINE Developers へ登録する必要があります。

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

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

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

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

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

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

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

【アクセストークン】

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

【webhook設定】

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

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

2.Laravel側の設定

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

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

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

php artisan make:model LineUser
<?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の対象外にできます。

<?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=アクセストークン

3.Laravel側のコーディング

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

Webhook用のAPIの作成

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

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

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

APIコントローラの作成

<?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
 
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 を使用してウェブシステムの構築を得意としております。

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

お問合せ

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

  • X

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です