2
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

LINE Messaging APIを使用してLINE通知

Posted at

概要

※当記事は所属している株式会社コンピュータテクノブレインにて投稿した内容を転載したものです。

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

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

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をクリックし、表示されたページで「今すぐはじめよう」ボタンをクリック

6c18b71fcb61c070ddfce47075108712-1024x489.png

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

10b5890c7dafe4b91bff1351a4c1cd83-1024x490.png

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

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

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

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

e466106ad1c7de053532bf213ca56977-1-1024x489.png

【アクセストークン】

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

554887152a33dce1f53013f84ea13742-1024x490.png

【webhook設定】

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

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

cfcecca73cf71cd2ca1e62a91dc50b8f-1024x489.png

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連携情報を登録したり、顧客管理システムと連動してメルマガ配信等色々なことができそうですね。

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

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

お問合せ

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

2
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?