Tech blog Produced by FOURIER

Laravelで使う Line Messaging API(line-bot-sdk-php)パート2

Ichikawa Ichikawa 2022.10.24

はじめに

こちらの記事は Laravelで使う Line Messaging API(line-bot-sdk-php)の続きになります。

そのため、下記がすでにできていることを前提に記事を書いています。

  • Laravelの環境構築
  • LINE Developesの登録
  • LINE Messaging APIの設定
  • LINE Messaging APIを使うためのパッケージのインストールと処理

上記がまだできていない方は、こちらの記事を参考に設定をしてください。

また、本記事はWebアプリとLINEの連携を想定したものになっています。

実装内容

今回はDBに保存されたユーザー(LINEアカウント)に対して、毎日決められた時間にメッセージを送信する機能を作っていきます。

機能実装

メッセージ送信処理

メッセージ送信のためのファイルを作成します。

php artisan make:command LineSendMessage

ファイルの中身は以下のようになります。

Laravelで使う Line Messaging API(line-bot-sdk-php)の通り進めていただいていれば、messagesテーブルにメッセージのデータが保存されているので、そこからLINEアカウントのユーザーIDを取得して、各ユーザーに対してメッセージを送信します。

<?php

namespace App\Console\Commands;

use Illuminate\Console\Command;
use App\Services\LineBotService as LINEBot;
use LINE\LINEBot\HTTPClient\CurlHTTPClient;
use LINE\LINEBot\MessageBuilder\TextMessageBuilder;

use App\Models\Message;

class LineSendMessage extends Command
{
    /**
     * The name and signature of the console command.
     *
     * @var string
     */
    protected $signature = 'line:send_message';

    /**
     * The console command description.
     *
     * @var string
     */
    protected $description = 'Send a message to LINE from the WEB app';

    /**
     * Execute the console command.
     *
     * @return int
     */
    public function handle()
    {
        $messages = Message::select('line_user_id')->groupBy('line_user_id')->get(); // メッセージからLINEのユーザーIDを取得

        foreach ($messages as $message) {
            $httpClient = new CurlHTTPClient(config('services.line.message.channel_token'));
            $bot = new LINEBot($httpClient, ['channelSecret' => config('services.line.message.channel_secret')]);

            $userId = $message->line_user_id;  // LINEのユーザーID
            $message = "おはよう!";  // メッセージ
            $textMessageBuilder = new TextMessageBuilder($message);
            $response = $bot->pushMessage($userId, $textMessageBuilder);
        }

        return 0;
    }
}

cronの設定

メッセージを送信する処理ができたので、次は定期実行するため、cronの設定をします。

私はローカル環境でDocker(php:8.1-fpm)を使っているので、コンテナ内の /etc/cron.d/cron の設定は以下のようになっています。

※cronの設定については記事のテーマと外れるので、自信の環境に合わせ設定をお願いします。cronの起動忘れに注意してください。

* * * * * root /usr/local/bin/php -q -f /var/www/html/artisan schedule:run --no-ansi >> /dev/null 2>&1

毎分 php artisan schedule:run のコマンドを実行しています。

↑が叩かれた際に実行するコマンド(メッセージ送信)をLaravelのスケジュールに設定します。

/app/Console/Kernel.php に先ほど作成したコマンドを登録します。以下の設定では毎朝7時30分にコマンド(メッセージ送信)が実行されます。

protected function schedule(Schedule $schedule)
{
    $schedule->command('line:send message')->dailyAt('7:30');
}

1日1回実行のままですと、検証時に不便ですので、->dailyAt('7:30'); を->everyMinute(); に変更して毎分メッセージが送信されるようにしましょう。

$schedule->command('line:send_message')->everyMinute();

1分経つと、Botアカウントから「おはよう!」とメッセージが届くはずです。

※検証後は->dailyAt('7:30');に設定を戻しておきましょう。

カスタマイズ例

今のままでは機能として物足りないですが、実装した機能をベースに拡張してみてください。

機能の拡張案としてはいろいろ出てくるかなと思います。

  • ユーザーの誕生日をDBに保持して、誕生日にお祝いのメッセージとクーポンを発行する
  • 天気予報のAPIを使い、降水確率が一定以上を超えた時にメッセージを送信する
  • 新規の商品や在庫切れ商品の入荷メッセージを送信する

さいごに

最後まで記事を読んでいただきありがとうございます。Laravel × LINE Messaging API の第二弾でした。

LINEと連携したサービス展開は一般的なものとなっています。そのためLINEと連携するにあたり、独自の設定や機能を追加したいという需要も増えていくかと思いますので、是非参考にしてください。

ではまた次の記事で!

Ichikawa

Ichikawa / Engineer

パン屋から転身してエンジニア3年目。主にPHP/Laravelを使っています。最近ではVue.js/Nuxt.jsと人間に興味あり。