プログラミング

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と書くことです。

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
/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');"
/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');"
/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のプロジェクトを作成したいディレクトリに移動して、次のコマンドでプロジェクトを作成します。

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
/usr/local/bin/php71cli -d register_argc_argv=1 "./composer.phar" create-project laravel/laravel プロジェクト名 --prefer-dist
/usr/local/bin/php71cli -d register_argc_argv=1 "./composer.phar" create-project laravel/laravel プロジェクト名 --prefer-dist
/usr/local/bin/php71cli -d register_argc_argv=1 "./composer.phar" create-project laravel/laravel プロジェクト名 --prefer-dist

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

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
http://ドメイン名/プロジェクト名/public/
http://ドメイン名/プロジェクト名/public/
http://ドメイン名/プロジェクト名/public/

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

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
git init
git add .
git commit -m "first"
git remote add origin (リモートリポジトリ名)
git push origin master
git init git add . git commit -m "first" git remote add origin (リモートリポジトリ名) git push origin master
git init
git add .
git commit -m "first"
git remote add origin (リモートリポジトリ名)
git push origin master

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

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
composer install
composer install
composer install

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

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
php artisan key:generate
php artisan key:generate
php artisan key:generate

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

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

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
http://ドメイン名/プロジェクト名/public/
http://ドメイン名/プロジェクト名/public/
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のプログラムを書いていきます。

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
<?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;
}
}
<?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; } }
<?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に次のように記述します。

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
Route::post('/line/webhook', 'LineWebhookController@webhook')->name('line.webhook');
Route::post('/line/webhook', 'LineWebhookController@webhook')->name('line.webhook');
Route::post('/line/webhook', 'LineWebhookController@webhook')->name('line.webhook');

CoreServerにデプロイする

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

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

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
git add .
git commit -m "コミットメッセージ"
git push origin master
git add . git commit -m "コミットメッセージ" git push origin master
git add .
git commit -m "コミットメッセージ"
git push origin master

CoreServerでpullする

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

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
git pull origin master
git pull origin master
git pull origin master

CoreServerで環境を合わせる

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

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
LINE_ACCESS_TOKEN=(LineのチェンネルのMessage API設定タブの中にあるチャンネルアクセストークン)
LINE_CHANNEL_SECRET=(Lineのチャンネルのチャンネル基本設定タブの中にあるチャンネルシークレット)
LINE_ACCESS_TOKEN=(LineのチェンネルのMessage API設定タブの中にあるチャンネルアクセストークン) LINE_CHANNEL_SECRET=(Lineのチャンネルのチャンネル基本設定タブの中にあるチャンネルシークレット)
LINE_ACCESS_TOKEN=(LineのチェンネルのMessage API設定タブの中にあるチャンネルアクセストークン)
LINE_CHANNEL_SECRET=(Lineのチャンネルのチャンネル基本設定タブの中にあるチャンネルシークレット)

Line DevelopersでWebhookにつなぎこみ

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

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
https://ドメイン名/プロジェクト名/line/webhook
https://ドメイン名/プロジェクト名/line/webhook
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
九州在住の組み込み系エンジニアです。 3児の父親でもあります。 数学やプログラミングが趣味です。 サッカーが好きでサッカー指導者やってます。