こんにちは、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への登録と新規チャンネルの作成方法は下の記事を見てください。

プログラムを書く
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ボットを使ってみよう!」でした。