Edited at

PHPで作成したLINEBOTをHerokuで動かしてみた


はじめに

ユアマイスターアドベントカレンダー2018 の8日目の記事です。

現在絶賛卒業研究中の大学インターンのmasaki-ogawaです。

今回はユアマイスター8日目の記事ですが、個人的にこの一年を通して取り組んでいるLINEBOTについて書いておこうと思います。


LINEBOTを作るに当たって参考にしたもの

LINE BOTを作ろう! Messaging APIを使ったチャットボットの基礎と利用例を参考にしました。

LINE BOTを作ろう! Messaging APIを使ったチャットボットの基礎と利用例.jpg

非常に参考になったのでおすすめです。環境構築の部分やサンプルコードが非常にわかりやすく参考になりました。

また、Messaging APIの公式ドキュメントも参考になりました。


環境構築について

LINEBOTに関しては多くの記事が出ていて、GASを使ってサーバーレスでLINEBOTを作成する例が多いですが、Herokuを使ってみたかったので、Herokuを使用するようにしました。

 


実行環境について


  • Macbook Air Early 2014

  • メモリ 8GB

  • プロセッサ intel Core i5

  • macOS Sierra


Herokuアカウントを開設する

まずはHerokuにアクセスしてトップページに行きます。

herokuでは

- PHP

- Node

- Java

- Ruby

- Python

- Go

- Scala

といった言語に対応しています。

今回は、参考にした書籍がPHPで記述されていたことやユアマイスターではPHPを使用しており馴染みのある言語だったためPHPを選択しました。

まずはアカウントを作成します。

登録画面.png

登録画面に必要な項目を入力します。今回は先述したようにPHPを使用するので、ここで主な開発言語はPHPを選択します。

これでアカウントの作成は完了です。


Heroku CLIのインストール

LINEBOTを作成するのに直接的には不要ですが、今後の開発時にHerokuのlogを確認したり、ツールを導入する際にローカルから操作を行う際に必要になるため、インストールをしておきます。

The Heroku CLIにアクセスしてOS別にインストールします。

インストールがうまくいって入れば

ogawa:lineBot$ heroku

CLI to interact with Heroku

VERSION
heroku/7.18.10 darwin-x64 node-v11.1.0

のように現在のバージョン等の情報が帰ってきます。


Herokuで新規プロジェクトの作成

【herokuコマンド】createからdestroyまでを参考に進めました。

今回は以下のようにlineBotというディレクトリを作成し、その中にソースファイルを置いていこうと思います。

$ mkdir lineBot

$ cd lineBot

$ touch index.php

とすれば、lineBotディレクトリ内に空のphpファイルindex.phpが作成されます。

$ git add.

$ git commit -m 'first commit'

$ git push heroku master

とすれば、空のファイルをpushできました。

※loginしなさいと言われた場合はheroku lognをして、登録時のメールアドレスとパスワードを入力してからpushしてみてください。


LINE BOT SDKを導入する

ただオウム返しをするだけのBOTでは必要ありませんが、今後LINEBOTを開発するにあたって便利になるので、インストールをおすすめします。

Composerを使って簡単にインストールします。

Composerがインストールされていない場合は

Composerをインストールしてみた

を参考にインストールします。

先ほど作成したlineBotディレクトリで

$ composer require linecorp/line-bot-sdk

を実行すると導入が完了です。

$ git add.

$ git commit -m 'require line-bot-sdk'

$ git push heroku master

といった感じでHeroku上にpushします。


LINE Developersで登録する

LINE Developersにアクセスします。

ログイン.png

右上のログインまたは、画面中央のログインをクリックします。

入力.png

この画面で、自分のLINEアカウントに登録しているメールアドレスとパスワードを入力してログインします。

プロバイダー.png

ログインしたら新規のプロバイダーを作成します。今回はmasaki-ogawaという名前のプロバイダーを作成しました。

チャンネル.png

真ん中のMessaging APIでチャンネルを作成します。

画面.png

この画面から各種情報を入力します。

このLINE Developersの管理画面ですが、結構頻繁にリニューアルされるので他の方の記事と画面が違うかもしれませんが、入力する内容は変わりません。2018年12月現在はこの画面になります。

登録完了したら、作成したチャンネルの、Webhook URLに先ほど作成したHerokuアプリのURLを指定し、Channel Secret Channel Access Tokenを控えておきます。

こちらのドキュメントからも作成の方法が確認できます。


おうむ返しをするLINEBOTを作成する

IMG_B7444740210C-1.jpeg

こんなのを作成します。


必要になるデータを確認する

ユーザーからBOTに向けてメッセージが送信されるとその内容が、JSON形式でWebhook URLに指定したURLに渡されます。

例えば、ユーザーから「こんにちは」というテキストメッセージが送信された場合以下のJSONを受け取ります。



{
"replyToken": "nHuyWiB7yP5Zw52FIkcQobQuGDXCTA",
"type": "message",
"timestamp": 1462629479859,
"source": {
"type": "user",
"userId": "U4af4980629..."
},
"message": {
"id": "325708",
"type": "text",
"text": "こんにちは"
}
}

Messaging APIを使用してメッセージを送る際に必要になるのはreplyTokenなので、このトークンを使用してユーザーにメッセージ等を送信することができます。また、UserIdも受け取るので、ここからユーザーの情報を取得できたり、誰からメッセージを受け取ったのかという情報をDBに保存することも可能です。

おうむ返しをするに当たっては、受け取ったテキストの情報を取得できれば良いので、messageの中のtextを取得して、その中身を返信すれば可能になります。


おうむ返しをするBOTのコードを作成する

先ほど作成したindex.phpに以下のコードを記述します。


index.php

<?php

// Composerでインストールしたライブラリを一括読み込み
require_once __DIR__ . '/vendor/autoload.php';

// アクセストークンを使いCurlHTTPClientをインスタンス化
$httpClient = new \LINE\LINEBot\HTTPClient\CurlHTTPClient('Channel Access Token');

//CurlHTTPClientとシークレットを使いLINEBotをインスタンス化
$bot = new \LINE\LINEBot($httpClient, ['channelSecret' => 'Channel Secret']);

// LINE Messaging APIがリクエストに付与した署名を取得
$signature = $_SERVER["HTTP_" . \LINE\LINEBot\Constant\HTTPHeader::LINE_SIGNATURE];

//署名をチェックし、正当であればリクエストをパースし配列へ、不正であれば例外処理
$events = $bot->parseEventRequest(file_get_contents('php://input'), $signature);

foreach ($events as $event) {
// メッセージを返信
$response = $bot->replyMessage(
$event->getReplyToken(), new \LINE\LINEBot\MessageBuilder\TextMessageBuilder($event->getText())
);
}


SDKを導入すると、ものすごく簡単に実装できます。$event->getReplyToken()でトークンを取得し、$event->getText()で今回発生したイベントのtextを取得します。

今回で言えばreplyMessageにトークンとテキストを渡してあげれば、おうむ返しをするBOTを作成できます。


終わりに

今回は序盤なので、これからDBを追加してユーザーから送信されたテキストを保存したりしたいと思います。

現在作成しているLINEBOTは避難所向けの被災者要望受付LINEBOTなので必要な物資を入力できるようにしたり、避難所に対する要望を保存できるようなBOTを作成しています。

作ってみた感想としては、本当にアイディア次第でどんなBOTでも作成できる夢のあるものだと思います。公式のSDKがとにかく便利でした。