はじめに
ユアマイスターアドベントカレンダー2018 の8日目の記事です。
現在絶賛卒業研究中の大学インターンのmasaki-ogawaです。
今回はユアマイスター8日目の記事ですが、個人的にこの一年を通して取り組んでいるLINEBOT
について書いておこうと思います。
LINEBOTを作るに当たって参考にしたもの
LINE BOTを作ろう! Messaging APIを使ったチャットボットの基礎と利用例を参考にしました。
非常に参考になったのでおすすめです。環境構築の部分やサンプルコードが非常にわかりやすく参考になりました。
また、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を選択しました。
まずはアカウントを作成します。
登録画面に必要な項目を入力します。今回は先述したように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にアクセスします。
右上のログインまたは、画面中央のログインをクリックします。
この画面で、自分のLINEアカウントに登録しているメールアドレスとパスワードを入力してログインします。
ログインしたら新規のプロバイダーを作成します。今回はmasaki-ogawa
という名前のプロバイダーを作成しました。
真ん中のMessaging API
でチャンネルを作成します。
このLINE Developersの管理画面ですが、結構頻繁にリニューアルされるので他の方の記事と画面が違うかもしれませんが、入力する内容は変わりません。2018年12月現在はこの画面になります。
登録完了したら、作成したチャンネルの、Webhook URLに先ほど作成したHerokuアプリのURLを指定し、Channel Secret Channel Access Tokenを控えておきます。
こちらのドキュメントからも作成の方法が確認できます。
おうむ返しをするLINEBOTを作成する
こんなのを作成します。必要になるデータを確認する
ユーザーから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
に以下のコードを記述します。
<?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がとにかく便利でした。