Node-REDでLINE botを作ってみた

大分前の話ですが、以前bluemix冬の大勉強会でNode-REDの本をいただいたので、早速色々試そうと思い、この中にあったLINE botを試そうとしたのですが、IBM Cloudに変わってかなり仕様が変わってしまい色々ハマってしまいました。しかも調べてもLINEとNode-REDの連携する方法があまりネットになかったので、Node-REDでボットを作る方法をまとめようと思います。

# 必要なもの
- IBM Cloudのアカウント（無料のライトプランでOK）
- LINE Developerアカウント

※今回は「はじめてのNode-RED（工学社）」を参考にしています。

# チャンネルの作成
まずは[LINE Developers](https://developers.line.biz/ja/)にログインし、Messaging APIにアクセスします。

![スクリーンショット 2018-07-02 03.32.26.png](https://qiita-image-store.s3.amazonaws.com/0/170520/52d27e95-2c6b-1d8a-c218-d5db03975db2.png)

ここからブロバイダーを選択します。無い場合は新規で作成します。
![スクリーンショット 2018-07-02 03.33.47.png](https://qiita-image-store.s3.amazonaws.com/0/170520/e54cc0cc-b806-b97c-e13b-72b792f35961.png)

チャンネルの情報を入力します。入力が完了したらそのまま次に進んで作成を完了させます。
![スクリーンショット 2018-07-02 03.37.58.png](https://qiita-image-store.s3.amazonaws.com/0/170520/b1e4f19d-2614-1f06-32ed-986372291756.png)

この後、チャンネルの基本設定では次の項目を設定していきます。

- Wabhook：有効
- Webhook URL：この後設定します
- Channel Secret：再発行（後で使うのでコピーします）
- アクセストークン：後で使うのでコピーします
- QRコード：スマホで読み込んで友達登録しておきます


# Node-REDの設定
ここで一旦line developerから離れてIBM Cloudにログインして、リソースの作成を開きます。この中からNode-RED Starterを開きます。

![resource.PNG](https://qiita-image-store.s3.amazonaws.com/0/170520/78c51284-d7b7-4011-7ac7-3928a4fd3227.png)

アプリ名を設定し、アプリを作成します。

![set.PNG](https://qiita-image-store.s3.amazonaws.com/0/170520/9c2831ba-a278-0bc8-6c3e-7a2d5ccd6dfd.png)

Node-REDが開くので、ここからユーザー名、パスワードを設定します。多分再設定できないので忘れないようなユーザ名、パスワードを設定します。ワークスペースまでたどり着いたら、まずは入力の「httpノード」と出力の「debugノード」を接続します。httpノードの設定を「Method : POST」、「URL : /callback」とします。
![スクリーンショット 2018-07-03 03.21.00.png](https://qiita-image-store.s3.amazonaws.com/0/170520/285d58cc-76ee-cea7-cd07-6e18cc5e29c0.png)


完成したら、「<ホスト名>.mybluemix.net/callback」を先ほどのMessaging APIのチャンネル設定のページにあるWebhook URLの欄に入力し、「接続確認」ボタンを押します。~~おそらく場合によってはエラー文が出力されることもありますが、Node-REDのデバッグでこのようなオブジェクトが出たらLINEのチャンネルと通信できています。~~
*（2019/10/12追記）接続確認の方法に関しては[こちらの記事](https://qiita.com/K_M95/items/46e3b93df19d920d2561)でまとめました*

![スクリーンショット 2018-07-03 03.26.54.png](https://qiita-image-store.s3.amazonaws.com/0/170520/8c526dcb-ffbf-99a3-057e-24246298185b.png)

# Node-REDにLINE bot SDKをセットアップする
これでMessaging APIとNode-REDの通信を行うことができました。ただ、このままだとメッセージを受け取るだけでメッセージを送信することはできません。そこでNode-REDから返信を行えるようにLINEにあるNode.js用のSDKを使うと簡単に送信できます。IBM CloudのNode-REDを作成した時のリソースにアクセスし、「継続的デリバリー」から「ツールチェーンの表示」をクリックします。

![スクリーンショット 2018-07-03 10.55.45.png](https://qiita-image-store.s3.amazonaws.com/0/170520/91a73a5c-3c3b-b2b4-5a33-4667f556bf3a.png)

本ではローカル環境にコード一式をダウンロードしていくつか修正しますが、Webエディタを使って修正もできるので、今回はこの中にある「Eclipse Orion Web IDE」をクリックし、開きます。

![スクリーンショット 2018-07-03 11.13.42.png](https://qiita-image-store.s3.amazonaws.com/0/170520/2ec69862-ba8c-401f-c60b-dd1954f6e46a.png)

この中にある「package.json」を開きこの中の「dependencies」に以下を追加します。

``` 
"@line/bot-sdk": "*"
```

さらにNode-REDから呼び出せるように「bulemix-setting.js」の「functionGlobalContext」に以下を追加します。

```
linebot: require('@line/bot-sdk')
```

入力が終わったら一番左のメニューバーにある「Git」をクリックし、Gitを開きます。

![68747470733a2f2f71696974612d696d6167652d73746f72652e73332e616d617a6f6e6177732e636f6d2f302f3137303532302f33643631653362392d643534312d653239622d376561622d6465646133613036316364632e706e67.png](https://qiita-image-store.s3.amazonaws.com/0/170520/bf4a460b-9d2c-e52a-81a2-28bda435e360.png)


ここからコミットを行い、プッシュします。ツールチェーン画面に戻り、「Delivery Pipeline」をクリックします。

![スクリーンショット 2018-07-03 11.30.34.png](https://qiita-image-store.s3.amazonaws.com/0/170520/4f74dece-5419-b79a-0861-472d77a423b2.png)

「Deploy Stage」を実行されていない場合はステージ左上の再生ボタンを押してデプロイを行います。これでNode-REDでLINEのSDKを使うことができます。

# 簡単なボットを作る
それでは実際にボットを作成していきます。今回は送信されたメッセージにそのまま返答するオウム返しを作ろうと思います。先程作ったフローにfunctionノードと出力のhttpノードを追加し、下図のように接続します。

![node.PNG](https://qiita-image-store.s3.amazonaws.com/0/170520/1aeadebd-fca8-7bd9-7889-fafffa96cc9e.png)

functionノードには以下のコードを記入して、右上の「デプロイ」ボタンを押します。

```javascript

const line = context.global.linebot;

const config = {
  channelAccessToken: '<YOUR_TOKEN>',
  channelSecret:  '<YOUR_SECRET>',
};

// create LINE SDK client
const client = new line.Client(config);
// get event
const event = msg.payload.events[0];
// get message
const received_msg = event.message.text;
// return message
var massage = { type: 'text', text: received_msg };


// replay!
client.replyMessage(event.replyToken, massage);

return msg;

```
これでオウム返しのボットができました。ラインのアプリからメッセージを送ると、このように送ったメッセージがそのまま返ってきます。

<img width="375" alt="C4D27859-0CD4-4A35-905C-DD455EB553FC.png" src="https://qiita-image-store.s3.amazonaws.com/0/170520/71202413-f1f8-ee09-7dc5-a81c9175738d.png">

割とSlackボットは良く見かけますがLINEでも簡単にボットが出来てしまうのはいいなと思います。色んな人に試して貰えるし。しかも、IBM　Cloudなので、Watson Assistantなどを使って自然な会話を出来るボットが出来るようになると思うので、色々いじってみようと思います