こんにちは、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ボットを使ってみよう!」でした。