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)