プログラミング

LaravelとCoreserverでLineボットを使ってみよう!

こんにちは、MSKです。
今回は、PHPのWebフレームワークであるLaravelとCoreServerでLineボットを試してみます。

使用する環境

  • サーバーサイドはLaravel
  • 使用するサーバーはCoreServerのCORE-Aプラン

CoreServerとは

CoreServerはGMOグループのValue-Domainが運営しているレンタルサーバーです。

GMOはインターネット関連の事業を行っている東証一部上場企業です。

複数のレンタルサーバーを運営して、有名なものにはロリポップなどがあります。

CoreServerもGMOグループのレンタルサーバーですので、安心感はあります。

Laravelでプロジェクトを作成する

CoreServerにLaravelのプロジェクトを作成します。

まずはCoreServerにSSH接続して、Composerをインストールします。

Composerのページに書いてある内容を参照します。

気を付ける点はphpではなく、/usr/local/bin/php71cliと書くことです。

/usr/local/bin/php71cli -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"
/usr/local/bin/php71cli -r "if (hash_file('sha384', 'composer-setup.php') === 'e0012edf3e80b6978849f5eff0d4b4e4c79ff1609dd1e613307e16318854d24ae64f26d17af3ef0bf7cfb710ca74755a') { echo 'Installer verified'; } else { echo 'Installer corrupt'; unlink('composer-setup.php'); } echo PHP_EOL;"
/usr/local/bin/php71cli composer-setup.php
/usr/local/bin/php71cli -r "unlink('composer-setup.php');"

Laravelのプロジェクトを作成したいディレクトリに移動して、次のコマンドでプロジェクトを作成します。

/usr/local/bin/php71cli -d register_argc_argv=1 "./composer.phar" create-project laravel/laravel プロジェクト名 --prefer-dist

インストールが完了すると次のURLでLaravelのトップページを見ることができるはずです。

http://ドメイン名/プロジェクト名/public/

CoreServer上ではなく、ローカルで開発を行いたいので、gitを使います。

git init
git add .
git commit -m "first"
git remote add origin (リモートリポジトリ名)
git push origin master

ローカル環境にcloneします。
このままだとphp artisan serveなどで、動作確認ができません。
次のコマンドを使って、venderフォルダを作ります。

composer install

venderフォルダができますが、まだしなければならないことがあります。
(このままphp artisan serveで動作確認を行うとエラーが発生します。)
.env.exampleをリネームして、.envにします。
最後に次のコマンドを打ちます。

php artisan key:generate

php artisan serveでローカルサーバーを立ち上げ、アクセスすると次のページが表示されると思います。

CoreServerにあるプロジェクトにブラウザからアクセスするときは以下のURLでした。

http://ドメイン名/プロジェクト名/public/

publicをつけないでアクセスしたいので、次のページにある.htaccessをLaravelのルートディレクトリに入れます。

 liaotzukai/Php laravel 5.5 project .htaccess file

リモートリポジトリにpushして、CoreServerでpullします。publicなしでLaravelのtopページが表示されると思います。

LaravelでLineボットプログラムを書く

Line Developerからチャンネルを作成

新規チャンネルを作成します。
Line Developerへの登録と新規チャンネルの作成方法は下の記事を見てください。

LineボットをPythonで使ってみよう!今回は、Lineボットを使うための登録から解説して、PythonとFlaskを使ってよくあるオウム返しを作ります。...

プログラムを書く

Laravelのプログラムを書いていきます。

<?php
namespace App\Http\Controllers;

use Illuminate\Http\Request;
use Illuminate\Http\Response;
use LINE\LINEBot;
use LINE\LINEBot\Constant\HTTPHeader;
use LINE\LINEBot\SignatureValidator;
use LINE\LINEBot\HTTPClient\CurlHTTPClient;
use LINE\LINEBot\MessageBuilder\TextMessageBuilder;
use LINE\LINEBot\Event;
use Exception;

//message Event
use LINE\LINEBot\Event\MessageEvent;
use LINE\LINEBot\Event\MessageEvent\AudioMessage;
use LINE\LINEBot\Event\MessageEvent\FileMessage;
use LINE\LINEBot\Event\MessageEvent\ImageMessage;
use LINE\LINEBot\Event\MessageEvent\LocationMessage;
use LINE\LINEBot\Event\MessageEvent\StickerMessage;
use LINE\LINEBot\Event\MessageEvent\TextMessage;
use LINE\LINEBot\Event\MessageEvent\UnknownMessage;
use LINE\LINEBot\Event\MessageEvent\VideoMessage;

class LineWebhookController extends Controller
{
    public function webhook(Request $request)
    {
        $content = $request->getContent();
        $line_access_token = env('LINE_ACCESS_TOKEN',"");
        $line_chennel_secret = env('LINE_CHANNEL_SECRET',"");
        $signature = $request->headers->get(HTTPHeader::LINE_SIGNATURE);

        $http_client = new CurlHTTPClient($line_access_token);
        $line_bot = new LINEBot($http_client,['channelSecret'=>$line_chennel_secret]);

        try{
            $events = $line_bot->parseEventRequest($request->getContent(),$signature);

            foreach($events as $event)
            {
                //MessageEventのインスタンスであるかを確認
                if( $event instanceof MessageEvent)
                {
                    //MessageEventのなかのTextMessageのインスタンスであるならば、返信
                    if( $event instanceof TextMessage)
                    {
                        $rcv_message = $event->getText();
                        $reply_token = $event->getReplyToken();
                        $text_message = new TextMessageBuilder($rcv_message);
                        $line_bot->replyMessage($reply_token,$text_message);
                    }
                    else if($event instanceof FileMessage)
                    {
                    }
                    else if($event instanceof LocationMessage)
                    {
                    }
                    else if($event instanceof VideoMessage)
                    {
                    }
                }
            }
        }
        catch(Exception $e)
        {
            return ;
        }
        return;
    }
}

次にルート設定します。
routes/web.phpに次のように記述します。

Route::post('/line/webhook', 'LineWebhookController@webhook')->name('line.webhook');

CoreServerにデプロイする

リモートリポジトリにpushする

プログラムを保存したら、コミットしてリモートリポジトリにpushします。

git add .
git commit -m "コミットメッセージ"
git push origin master

CoreServerでpullする

SSHでCoreServerと接続して、pullします。

git pull origin master

CoreServerで環境を合わせる

CoreServerのプロジェクト直下に.envファイルがあるので、以下のように変更します。

LINE_ACCESS_TOKEN=(LineのチェンネルのMessage API設定タブの中にあるチャンネルアクセストークン)
LINE_CHANNEL_SECRET=(Lineのチャンネルのチャンネル基本設定タブの中にあるチャンネルシークレット)

Line DevelopersでWebhookにつなぎこみ

Line DevelopersのMessaging API設定の中のWebhook URLに次のように記述します。

https://ドメイン名/プロジェクト名/line/webhook

【補足】CoreServerで無料SSLを設定する

Line Message APIのwebhookを受けるためにはhttpsでなければならないので、無料SSLを設定します。
CoreServerのサイト設計からドメインを選択します。
サイト設定の変更をクリックします。

SSLの項目がありますので、無料SSLを選択します。

最後にサイト設定を変更するをクリックします。

おわりに

Laravel+CoreServerでLineボットを動かしてみました。
特に難しいこともなく、簡単に使えるのがいいですね。
UIをLineに任せて、サービス側に集中できることはメリットです。
他にもLineボットには面白い機能があるので、また紹介していきたいと思います。

最後までご覧いただき、ありがとうございます。
以上、「LaravelとCoreserverでLineボットを使ってみよう!」でした。

ABOUT ME
MSK
九州在住の組み込み系エンジニアです。 2児の父親でもあります。 数学やプログラミングが趣味です。 最近RustとReact、結び目理論と曲面結び目理論にはまっています。