つくったわけ
普段暮らしていると「どっちでもいいなぁ」みたいな選択が必要なシーンって結構ありますよね。
僕としては毎日の「晩御飯を決める」って作業がまさにそれです。
一緒にご飯を食べる相手でもいれば決めてもらうのですが
ちょうどnode-redつかって何かしたいなぁっていうのと、なにかボット作ってみようかな、と思ってたので、つくりました。
つくったもの
なにかしら話かけると、事前に登録したごはん屋さんのどれかを返信してくるBOTです。
「飯どこにしよっかなぁ~」の若干の面倒くささを感じなくなるので、けっこう気に入っています。
はじめに
本記事は、使用している各技術群についての詳細は記載しません。
記事を読んでいただいて、自分も作ってみようかな、と思っていただいた方のハウツーになればよいかなと思います。
本題にはいりまして
ibmcloudのライトアカウント(無料)でnode-redのサーバをたてて、そこにlinebotを組み込んだ処理を構築します。
node-redをご存じない方もいらっしゃると思いますので、概要だけ記載しておきます。
qiitaの記事はじめ、日本語情報がけっこうあるので、この記事を読んで気になった方はググってみてください。
(Node-RED User Group Japan)
Node-REDはフローベースドプログラミング(flow-based programming)ツールであり、 元はIBM Emerging Technology Servicesチームによって開発され、 現在ではJS Foundationのひとつになっています。
Node-REDは、フローエディタにアクセスするためにウェブブラウザを指定するNode.js上の実行環境に構築されています。 ブラウザでは、パレットからワークスペースへとノードをドラッグし、自分のアプリケーションを作成します。 そしてシングルクリックで、アプリケーションを実行状態にある実行環境へとデプロイします。
環境をととのえる
ibmcloud
ibmcloudへの登録とnode-redのインストールはこちらの記事を参照してください。
node-red環境の作成手順(ibmcloud)
上記でnode-redを使用することは可能になりますが、linebot連携を行うために、linebotのmoduleを使用できるように設定を変更します。。
(nodejsのrequire()をしたときと同じ状態になるように設定変更するイメージです。)
今回は、ブラウザ上で作業を完結させたいので、ibmcloudのツール群を使用します。
node-redのエディタ画面から離れ、先ほどのアプリ管理画面下部の「継続的デリバリー」パネルの「有効化」ボタンをクリックして、継続的デリバリーを有効化します。
継続的デリバリー用の各種設定画面が開きます。
基本的にすべてデフォルトで問題ありませんが、「ツール統合」部分の「Delivery Pipeline」のみAPIキーの発行が必要なので、「Delivery Pipeline」をクリックして、APIキーの発行を行ってください。
それが完了したら「作成」をクリックしてください。
作成が完了すると、以下の画面が表示されます。
設定変更用のエディタには「Eclipse Orion Web IDE」を使用しますので、「Eclipse Orion Web IDE」をクリックしてください。
エディタ上で各ファイルをそれぞれ修正します。
●package.json
「dependencies」に以下を追加します。
"@line/bot-sdk": "*"
●bulemix-setting.js
「functionGlobalContext」に以下を追加します。
linebot: require('@line/bot-sdk')
編集が終わったら、左側のメニューからgitを選択して、コミット/プッシュします。
プッシュまで完了したら、ツールチェーン画面から「Delivery Pipeline」を選択します。
deployまで、ステージングが完了するのを待ちます。
※ステージングが動いていない場合は、各ステージの再生ボタンをクリックして、ステージングを行ってください。
これでnode-red側は準備OKです。
つぎにlinebotの登録を行います。
linebot
LINE developersでログインします。
アカウント登録も右上のログインボタンから行えます。
(余談ですが、LINE debelopersさんのヘッダー画像すごくいいですよね。)
ログイン後の画面で新規プロバイダを作成してください。
プロバイダを作成した後に、以下のようなチャンネル作成画面が表示されるので、
Messaging APIを選択します。
初期設定画面に遷移するので、必要な項目を入力して作成してください。
チャンネルを作成したら、チャンネルの設定画面に遷移してください。
設定項目は基本的にデフォルトで問題ありませんが、以下の項目だけ設定変更してください。
・Webhook送信 →「利用する」に変更
・Webhook URL
→ node-redのアプリURL + 末尾に「/webhook」をつけたもの
・Channel Secret
・アクセストークン(ロングターム)
ついてはそれぞれ発行して、値をメモしておいてください。
また、作成したBOTはQRコードなどからLINEで友達追加をしておきます。
いよいよnode-redで処理をつくる
といっても、ここは一瞬で終わっちゃいます。
まずはnode-redにアクセスして、左側の「入力」にあるhttpノードを選択し、
・メソッド → POST
・URL → /webhook
と設定し、後続ノードに「出力」のなかにあるdebugノードを接続して「デプロイ」をクリックします。
デプロイしたら、メッセージはなんでもよいので、BOTに対してLINEで話しかけます。
正常にBOTからのwebhookを受信できるとログが表示されます。
ログが出ない場合はBOTの設定などをもう一度確認してください。
ログが表示されたら、いよいよ晩御飯をきめてもらいます。
先ほどのログを確認したときのdebugノードを消して、
下のイメージのように、
[入力]http(先ほどのまま) - [機能]function - [出力]http response とノードを接続します。
そして、functionには以下のコードを記載します。
(http responseノードは特に編集しなくて大丈夫です。)
const line = global.get('linebot');
// クライアントの生成
const client = new line.Client({
channelAccessToken: '先ほどメモしたアクセストークン',
channelSecret: '先ほどメモした channel secret',
});
// イベントとメッセージの取得
const event = msg.payload.events[0];
const received_msg = event.message.text;
// ごはん屋さんの定義
restaurants = [
'松屋',
'大戸屋',
'マクドナルド',
'ケンタッキー',
'駅前のラーメン屋',
]
// ランダムにきめる
idx = Math.floor( Math.random() * restaurants.length );
// 返信するメッセージの設定
// text:''が送信する内容
var massage = { type: 'text', text: restaurants[idx] };
// 返信
client.replyMessage(event.replyToken, massage);
return msg;
デプロイしたら、LINEで話しかけてみてください。
そうすると、以下のように晩御飯を食べるお店をきめてくれます!!
これで「どっちでもいいなぁ」から一つを選ぶストレスから解放されました。最高!
みなさんもぜひオリジナルのBOT作成を試してみてください!