はじめに
まず、IBM Cloudで翻訳Botを作成するにあたって、チャットのインターフェースとなるツールを選択しないといけません。Slackは比較的簡単に連携できますが、日本人であれば、馴染みのあるLINEに連携させたいはず!!という事で、LINE連携で翻訳Botを作成します。
事前準備
・Node-REDで構築しますので、こちらを参考に環境を作成しておく。
・こちらを参考にLINE Messaging APIを使う準備をしておく。
Watson Language Translatorの作成
LINE Messaging APIの作成(LINE Developers)
- LINE DevelopersにLINEアカウントでログイン
- チャネル設定から「新規チャネル作成」をクリック
- 「Messaging API」を選択する
- チャネル名に適当なBotの名前を入力(これがLINEに表示されるBotの名前になります)し、各種チェックボックスにチェック後、作成ボタンをクリック
- 「同意する」をクリック
- チャネル基本設定の下の方にあるWebhook設定に以下を入力し更新ボタンをクリック
https://「Node-REDのチャネル名」.mybluemix.net/trans
- Chanel Access Tolenを取得
右端にある「発行」ボタンをクリックし、Chanel Access Tolenを取得します。これは後続作業で使用しますので、控えておきます。
- 応答メッセージの詳細設定から応答メッセージは「オフ」に変更する
Node-REDでアプリ作成
####1.左のノード一覧より「http in」ノードをパレットに配置
メソッドは「POST」、URLは「/trans」を設定します。
URLの「/trans」は上記、LINE Messaging APIの作成の6.で指定したWebhookのアドレスの末尾の文字列になります。
####2.IBM Watsonから「Language Translator」ノードを配置します。
「Language Translator」ノードのHelpを読むとmsg.payloadで渡して、msg.payloadで受け取るとあります。msg.payloadへデータを入れるための処理を「function」ノードで行います。これが上記フローの「翻訳準備」にあたる部分になります。「function」ノードはJavaScriptで記述します。Node-REDではmsgというJavaScriptオブジェクトを使ってノード間でデータを受け渡しを行います。
【「Language Translator」ノードのHelpより】
####3.「http request」ノードを配置
以下のようにURLを指定して、LINE Messaging APIをCALLし、翻訳結果を返信します。
LINEへ返信するための設定をその直前の「function」ノードでやっています。
この中で、Channel access token を指定します(LINE Messaging APIの作成の7.で取得したものです)
全てのノードを配置し終わったら、右上の「デプロイ」を実行します。
####4.完成
以下のように翻訳してくれるBotができました。
##参考
####1.エラーが発生した場合に備えて
以下のように「debug」ノードを配置しておくとログを見る事ができます。
####2.ソースコード
参考にソースコードを添付します。
[{"id":"221915cf.607392","type":"tab","label":"フロー 1","disabled":false,"info":""},{"id":"e05b84c2.2f69d8","type":"http request","z":"221915cf.607392","name":"LINE Messaging API実行","method":"POST","ret":"txt","paytoqs":"ignore","url":"https://api.line.me/v2/bot/message/reply","tls":"","persist":false,"proxy":"","authType":"","x":270,"y":560,"wires":[["35ca4ede.3372d2"]]},{"id":"35ca4ede.3372d2","type":"debug","z":"221915cf.607392","name":"APIリクエスト結果","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"payload","targetType":"msg","statusVal":"","statusType":"auto","x":600,"y":560,"wires":[]},{"id":"b7d87e2f.2c2888","type":"function","z":"221915cf.607392","name":"LINEへの返信準備","func":"var messageText = msg.payload;\nmsg.payload = {\"messages\": [{\"type\": \"text\", \"text\": messageText}], \"replyToken\": msg.replyToken};\nmsg.headers ={ \"Content-Type\": \"application/json\", \"Authorization\": \"ここにLINE Messaging APIのChannel access tokenを指定する\"};\nreturn msg","outputs":1,"noerr":0,"initialize":"","finalize":"","x":440,"y":400,"wires":[["e05b84c2.2f69d8","e6dd74e4.ef9b98"]]},{"id":"e6dd74e4.ef9b98","type":"debug","z":"221915cf.607392","name":"Watsonの翻訳結果","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"payload","targetType":"msg","statusVal":"","statusType":"auto","x":750,"y":400,"wires":[]},{"id":"e61b56b4.932628","type":"debug","z":"221915cf.607392","name":"翻訳をリクエストした日本語","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"payload","targetType":"msg","statusVal":"","statusType":"auto","x":640,"y":220,"wires":[]},{"id":"945c7146.6e7b8","type":"watson-translator","z":"221915cf.607392","name":"翻訳","action":"translate","basemodel":"en-tr","domain":"general","srclang":"ja","destlang":"en","password":"","apikey":"Wo5q6_1jn45aqK5QCR5PNueRs9RTSYIHGOUMb84xTNnd","custom":"","domainhidden":"general","srclanghidden":"ja","destlanghidden":"en","basemodelhidden":"en-tr","customhidden":"","filetype":"forcedglossary","trainid":"","lgparams2":true,"service-endpoint":"https://api.us-south.language-translator.watson.cloud.ibm.com/instances/f371e853-a2ea-4a74-85c4-585a9718fe01","x":210,"y":400,"wires":[["b7d87e2f.2c2888"]]},{"id":"cdb992ab.e74ec8","type":"http in","z":"221915cf.607392","name":"POST","url":"/trans","method":"post","upload":false,"swaggerDoc":"","x":90,"y":220,"wires":[["4d77eeca.c59358"]]},{"id":"4d77eeca.c59358","type":"function","z":"221915cf.607392","name":"翻訳準備","func":"var event = msg.payload[\"events\"][0];\n\nmsg.replyToken = event[\"replyToken\"];\nmsg.payload = event[\"message\"][\"text\"];\n\nreturn msg","outputs":1,"noerr":0,"initialize":"","finalize":"","x":320,"y":220,"wires":[["e61b56b4.932628","945c7146.6e7b8"]]}]