Bluemix
node-red
linebot

【Node-RED】LineMessagingAPIとBluemix Node-REDでお天気LineBotを作ってみた。【LineBot】

はじめに

line

  • Node-Redはこんな感じで画面上にパーツを配置していきつつプログラミングする。
    • APIだけでなくHTMLなどを直接出力もできるらしい。

Node-RED

利用する物

  • LineMessagingAPI
  • Bluemix
    • Node−Red
  • livedoorお天気API

LineMessagingAPI

  • Lambda版と同様なため登録などは割愛

Bluemix Node-Red

  • Bluemixは1ヶ月は無料で利用できるのでテストで利用するのは気軽に使える。
    • 一ヶ月すぎるとクレジットカードの登録が必要だけど無料枠もあるので継続利用が可能
    • ただしWatsonの一部のものや起動時間で課金されるものもあるので料金には注意が必要。
    • 無料期間内でも金額は表示されるので参考にするとよい。

Node-Red作成

  • https://console.bluemix.net/catalog/
    • 上記のNode-RED Starterからインスタンスを立ち上げる。
      • 各サービスへの画面遷移が分かりづらいので上記URLのカタログというリンクを覚えておくとよい
    • カタログ - IBM Bluemix
  • アプリ名・ホスト名を記入し(URLの一部になる)SDK for Node.jsで作成を押す。
  • 開始中から実行中になればインスタンスが起動されている。
    • 起動するまで結構時間がかかるのと、開始中のまま止まることもあるのでその際はページをリロードするとよい。
  • Node−REDの設定を行う。Nextと進みUsernameとpasswordを入力する。
    • Node-RED in IBM Bluemix
    • Finish the installでFinishを押して完了。

Node-Red設定とお天気API実装

LineBotReply・入力/http
メソッド:POST
URL:/linebot/reply
msgPayload・機能/function
return msg;
Response・出力/http
copyLineBotPayload・機能/function
msg.lineReplyPayload = msg.payload;
return msg;
  • お天気とエリア情報のIDを紐付け。詳細情報はlambda版に記載しているため割愛
setWeatherData・機能/function
msg.weatherID = {
  "北海道" : "016010",

・・・

  "沖縄" : "471010",
  "那覇" : "471010",
  "名護" : "471020",
  "久米島" : "471030",
  "南大東" : "472000",
  "宮古島" : "473000",
  "石垣島" : "474010",
  "与那国島" : "474020"
};
return msg;
setWeatherAPI・機能/function
// 地域名のみにテキストを出来る限り削除する(自然言語理解に置き換えたい)
let cityName = msg.lineReplyPayload.events[0].message.text.replace( /[あ-ん]/g , "" ).replace( /天気/g , "" ).replace( /今日/g , "" )
.replace( /明日/g , "" ).replace( /明後日/g , "" ).replace( /教/g , "" )
.replace( /県/g , "" ).replace( /府/g , "" ).replace( /東京都/g , "東京" )
.replace( /?/g , "" ).replace( /\u\l\d/g , "" ).replace( /\s/g , "" ).replace( /\n/g , "" );

msg.url = 'http://weather.livedoor.com/forecast/webservice/json/v1?city=' + msg.weatherID[cityName];
return msg;
weatherRequest・機能/http request
メソッド:GET
URL:未記入
出力形式:文字列
createLineReplyPayload・機能/function
// LineBot用メッセージ整形
msg.weatherPayload = JSON.parse(msg.payload);
msg.payload = {
    "replyToken": msg.lineReplyPayload.events[0].replyToken,
    "messages": [
        {
            "type": "text",
            "text": msg.weatherPayload.location.city + 'の' + msg.weatherPayload.forecasts[0].dateLabel + 'の天気は' + msg.weatherPayload.forecasts[0].telop
        }
    ]
};
return msg;
createSendHeader・機能/function
// LineBot用ヘッダー整形
msg.headers = {
    "Authorization" : "Bearer ■Channel Access Token■",
    "Content-Type": "application/json",
};

msg.url = "https://api.line.me/v2/bot/message/reply";
return msg;
LineBotSend・機能/http request
メソッド:POST
URL:未記入
出力形式:文字列

デバッグ用

msg.payload
対象:msg.payload
msg
対象:msg
  • Channel Access Tokenはべた書きしてますが、環境変数を設定できるらしいのでそちらに記載がよいかも。
    • 環境変数.png

LineDevelopers Webhook URL

  • LineDevelopersのWebhook URLにNode-REDのAPIを記載
  • Node-RedのURLは下記部分を合わせた物
    • Node-RedのURLとhttp in ノードのURL部分
    • IBM Bluemix
  • 上記URLをLineDevelopersに記載
    • webhook.png

動作確認

  • メッセージを送ってみて、お天気が帰ってきたらOK。(明日などの判別部分は割愛してます)

line

感想

  • lambdaと同じことをNode-Redでも簡単に作成することが可能でした。
  • lambdaと違い起動時間で課金されるので不要なインスタンスは起動しないように注意。
  • どちらも便利。Node−Redでこんな作り方があるんだと驚き。