Bluemix+Node-REDでWatson QA

# **【注意】Watson QAサービスは2015年12月16日をもって提供終了となりました。**

[Node-RED](http://nodered.org)といえば簡単にセンサデータ収集をするためのツールという側面が強いですが、[Bluemix](https://console.ng.bluemix.net/)ではWatson関連ノードも公開されています。今回はtwitterボットを入出力デバイスとしてWatsonへの問い合わせを行うサンプルを作成しました。

##前提

* Bluemixアカウントの取得
* Twitterアカウントおよび[開発者APIキー](https://apps.twitter.com/)の取得

##Node-REDアプリケーションの作成

Bluemix上のアプリケーションを作成します。(ここではnrqasampleという名前にしていますので、URLはnrqasample.mybluemix.netとなります)

ボイラープレート「Node-RED Starter」を選択します。
![node-red-starter-configuration.png](https://qiita-image-store.s3.amazonaws.com/0/21963/5c3e8d40-0140-af08-61da-21782e9343ff.png)

そのままアプリケーションのステージングを行います。
![node-red-starter-initial-staging.png](https://qiita-image-store.s3.amazonaws.com/0/21963/1a1ec159-29b7-8fa2-0971-c21006450e30.png)

ステージングが終了したらブラウザでアプリケーション(今回はnrqasample.mybluemix.net)を開きます。そうすると、フローエディタが現れます。
![node-red-starter-flow-editor.png](https://qiita-image-store.s3.amazonaws.com/0/21963/b5fdcd1b-e505-c2a5-192d-75009bc760c3.png)

ダッシュボードはこのような構成になっています。Node-RED Starterボイラープレートを選択すると、Cloudant NoSQL DBサービスとMonitoring and Analyticsサービスがそれぞれ自動的に追加されていることがわかります。
![node-red-starter-dashboard.png](https://qiita-image-store.s3.amazonaws.com/0/21963/b247a8d6-4738-ba53-fb45-17bcbcb3a282.png)

このままでは誰でもフローエディタにアクセスできてしまいますので、ユーザ名とパスワードを設定しましょう。ダッシュボードからユーザ環境変数を設定するだけです。
![node-red-starter-security.png](https://qiita-image-store.s3.amazonaws.com/0/21963/74dd16e2-aad1-8aed-0dea-a6cb7677be38.png)

環境変数を設定後、再度フローエディタにアクセスすると、今度はログイン要求されるようになります。
![node-red-starter-flow-editor-with-password.png](https://qiita-image-store.s3.amazonaws.com/0/21963/e33d7eae-0b67-ba81-402c-1ff9241dd8c7.png)

##フローの作成

それでは、フローを作成していきます。

まず、Watson Q&Aを利用するために、ダッシュボードでサービスを追加します。
![node-red-starter-watson-service-adding.png](https://qiita-image-store.s3.amazonaws.com/0/21963/4f6a4bbb-054d-8eb5-c770-ebf035573af6.png)

次に、フローエディタでフローを作成します。

![node-red-starter-twitter-watson-twitter.png](https://qiita-image-store.s3.amazonaws.com/0/21963/df740dd9-c961-2b41-99a9-9fbd2b7c31d3.png)

それぞれのノードのタイプと設定は以下のとおりです。

|Name|Type|用途と設定|
|:---|:---|:---|
|Mention|![button-twitter-in.png](https://qiita-image-store.s3.amazonaws.com/0/21963/2b5813a7-5f45-6343-a874-420b1130b443.png)|メンションの取得<br>・Log in as: @botアカウント<br>・Search: all public tweets<br>・for: "@botアカウント"※取得するtweetの条件(先頭文字列)<br>・Name: "Mention"|
|QA|![button-watson-qa.png](https://qiita-image-store.s3.amazonaws.com/0/21963/6c371d0c-7030-3986-160c-5a39de447a71.png)|Watson QAへの問い合わせ<br>・Name: "QA"<br>・Corpus: Travel<br>・Output: Top answer|
|Cut|![button-function.png](https://qiita-image-store.s3.amazonaws.com/0/21963/429d19e4-e2b0-7dc7-9b67-38c076002346.png)|140文字への整形<br>・Name: "Cut"<br>・Function:(*1)<br>・Outputs: 1|
|Reply|![button-twitter-out.png](https://qiita-image-store.s3.amazonaws.com/0/21963/06f63305-e347-d077-6212-7fc9c447aa88.png)|Tweet出力<br>・Twitter: @アカウント<br>・Name: "Reply"|
|Debug|![button-debug.png](https://qiita-image-store.s3.amazonaws.com/0/21963/51a2f768-85f4-fea9-54f0-dbafc98783e0.png)|Debugメッセージ出力<br>・Output: message property, msg."payload"<br>・to: debug tab<br>・Name: "Debug"|

(*1) "Cut"ノードのコード

```js
var sender = msg.topic.replace(/^tweets\//, '')
if (msg.payload.length + sender.length + 2 > 140) {
    msg.payload = '@' + sender + ' ' + msg.payload.substring(0, 140 - sender.length - 6) + " ..."
} else {
    msg.payload = '@' + sender + ' ' + msg.payload
}
return msg;
```

##実行

フローエディタの右上にあるdeployボタンを押すと最新のデプロイが行われます。ただし、twitter apiの仕様上15分に一度しか更新できないことがありますので注意してください。

![button-deploy.png](https://qiita-image-store.s3.amazonaws.com/0/21963/751be459-30a6-26ab-1fc5-d44041d347b8.png)

それではメンションを送ってみましょう。(この例では@travelqabotというアカウント名のボットを使用しています)

![watson-question-by-twitter.png](https://qiita-image-store.s3.amazonaws.com/0/21963/32d5aa86-94b0-36b6-8b44-5acbf7b50a04.png)

リプライが来ました。

![watson-answer-by-twitter.png](https://qiita-image-store.s3.amazonaws.com/0/21963/3af812bf-2664-4875-8c10-693e62b56bd4.png)

Debugノードにもログが出ています。

![debug-log-in-flow-editor.png](https://qiita-image-store.s3.amazonaws.com/0/21963/88539d39-9e69-9d50-6550-7937d79ae793.png)

##まとめ

* Watsonへの問い合わせを行うtwitterボットをあっという間に作ることができました。
* しかしながら、[以前に投稿](http://qiita.com/blackaplysia/items/25e637fa94b108a32605)したような複雑なサービスを書くには多くのjavascriptコードを書く必要があるため、適材適所で選択することになるでしょう。基本的には名前の通り、ノード間でデータが流れるフローで書ける機能のみを実装するのがよさそうです。