2016年12月20日 星期二

使用Claudia.js製作查詢台銀匯率API & 自動回覆匯率BOT(Skype 版本)

前一篇文章分享了如何製作簡單的Facebook BOT,但是應該不會有人希望自己的BOT只會找理由吧。而且Lambda的最大應用其實是Web API,而Claudia其實也是可以幫忙建立API的,一樣是很輕鬆愉快喔~
這篇文章會介紹如何用Claudia寫一隻自動抓取台銀最新的現金賣出匯率,並轉成JSON格式的API,再建立一個機器人並讓機器人自動回覆匯率。

建立API

初始化npm專案

  1. 建立一個資料夾並命名為currencyrate
  2. 打開Mac Terminal/Windows command line tool並移動到這個資料夾(cd currencyrate)
  3. 初始化npm專案:輸入
    npm init  
    

安裝套件

如果之前選擇不將Claudia安裝到Global,要在這個步驟打入
npm install claudia -D
來安裝Claudia到這個專案。

另外還必須要安裝幾個npm套件:
  • claudia-api-builder:Claudia自動部署API的套件
  • minimal-request-promise:很簡單就可以取得網頁上資料的套件
  • csv-parse:因為台銀提供csv檔格式的API,這個套件可以解析csv檔
在Terminal或是Cmd輸入
npm install claudia-api-builder minimal-request-promise csv-parse -S 
即可安裝這兩個套件。

API的Code

打開你的sublime或是其他的記事本工具,輸入以下的code:
'use strict'
const parse = require('csv-parse/lib/sync');
const rp = require('minimal-request-promise')
const ApiBuilder = require("claudia-api-builder");

var api = new ApiBuilder();
var rootUri = 'http://rate.bot.com.tw/';
var currencyMethod = 'xrt/flcsv/0/day';
var sellcashcol=12;
var currencyCode=0;

api.get("/currency/{code}", function (message) {
 var code = message.pathParams.code;
 var errorMessage,sellcash;
 var returnData={errorMessage:errorMessage,sellcash:sellcash};
 return rp.get(rootUri+currencyMethod)
            .then(response => {
               var body='#'+response.body;
               var records = parse(body, {comment: '#'});
               var arrayFound = records.filter(function(item) {
     return item[currencyCode].toLowerCase()==code.toLowerCase();
    });
    if (arrayFound.length>0)
    {
     returnData.sellcash=arrayFound[0][12];
    }else{
     returnData.errorMessage='Cannot find any currency from code '+code
    }
    return returnData;
              })

});

module.exports = api;
然後儲存成index.js。 這段Code會到台銀網站提供的API取得匯率,透過csv-parser解析之後取得目標匯率並回傳。

透過Claudia部署

透過Claudia部署,一樣只要一個指令 claudia create --name currency --region us-west-2 --api-module index
部署完可以透過URL https://[api-gateway-id].execute-api.us-west-2.amazonaws.com/latest/currency/USD測試是否有成功,也可以進入AWS Console,選擇"API Gateway"服務後找到currency API,在resource中按下"Test“按鈕測試。

建立BOT

參考上篇文章建立機器人,然後在機器人的folder中安裝minimal-request-promise套件,並將BOT的Code修改如下:
'use strict'
const botBuilder = require('claudia-bot-builder');
const excuse = require('huh');
const rp = require('minimal-request-promise')
module.exports = botBuilder(
function(message) {
 if (message.text.lastIndexOf('Currency/', 0) === 0)
      {
          var msgArr=message.text.split('/');
          return rp.get('https://[api-gateway-id].execute-api.us-west-2.amazonaws.com/latest/currency/'+msgArr[1])
            .then(response => {
                var rate = JSON.parse(response.body);
                if(rate.sellcash!=null || typeof(rate.sellcash)!='undefined'){
                  return('Currency '+msgArr[1]+' exchange rate today is '+rate.sellcash) 
                }
                else
                {
                  return('Error occured, reason is'+rate.errorMessage);
                }
              })
      }
      else
      {
        return 'Thanks for sending '+ message.text +'.Your message is very important to us, but '+excuse.get();
      }
});
*注意https://[api-gateway-id].execute-api.us-west-2.amazonaws.com/latest/currency/ 這邊是剛剛建立好的API的URL,要記得改不要全部照抄,不然BOT找不到API不會理人的~
存檔之後,透過Claudia create或Claudia update將BOT部署到AWS。

Skype BOT設定

在這裡介紹怎麼設定Skype的BOT。Skype BOT已經整合到Microsoft的BOT Framework,目前還在Preview階段,根據Microsoft BOT Framework的Q&A將會在2017年推出正式版,這裏的設定教學都是針對Preview版本。
  1. 首先,用你的microsoft/Azure帳號登入Microsoft BOT Framework,並按下"Register a BOT"
  2. 在Bot profile區段,給你的BOT一個名字,並且在bot handle給予這個BOT一個識別值(identity)。bot handle區段一旦設定了,就不能再改了。

  3. 在Configuration區段中設定:
    1. Messaging endpoint:Claudia deploy回應結果中,deploy->skype區段中的內容,通常是https://[api-gateway-id].execute-api.us-west-2.amazonaws.com/latest/skype
    2. 按下"Create Microsoft App ID and password"按鈕
    3. 給予這個應用程式一個名稱(可以和bot的名字不同),然後按一下"產生應用程式密碼"
    4. 系統產生一組密碼,一定要複製起來,待會透過Claudia設定的時候要用。密碼只有這個時候可以看得到,沒有複製到就只好再產生一次了。

  4. Microsoft BOT framework的設定告一段落,回到我們的command/terminal console,打入
    Claudia update --configure-skype-bot
  5. Claudia會要求你輸入Skype App ID和Skype Private key,其中Skype App ID就是應用程式識別碼,Skype Private key則是按下“產生應用程式密碼以繼續”按鈕時,系統自動產生的那組密碼,也就是剛剛特別要你存起來的那組密碼
  6. 至此,Skype BOT已經全部設定完成。回到Microsoft BOT Framework,找到"Test connection to your bot"區段,按下Test按鈕,如果看到下方出現OK "ok",就表示兩方的configuration沒有問題。

Test in skype

在Microsoft BOT Framework中,我們可以看到系統已經很貼心地將我們的Skype Channels建立好了。

有注意到除了Skype Channel,還有一個Web Chat嗎?如果我們是自己寫API沒有透過claudia-bot-builder,這個BOT可以同時支援Skype和Web Chat。但很可惜的是claudia-bot-builder並沒有支援Web Chat,所以雖然BOT Framework有幫我們建立Web Chat的Channel,也已經啟用,在頁面最底下的Chat區段測試,BOT是不會理我們的....
請在Skype Channel旁邊有一個"Add to skype"按鈕,按下去之後會開啟另一個視窗:
按下"Add to Contacts"之後會將Skype開起來,並把BOT加入Skype聯絡人中。這時候就可以和BOT對話了。

BOT收到Currency/[幣別代碼]的指令的時候,會自動呼叫我們寫好的查詢台銀匯率API並回應。如果收到其他的訊息則是一樣隨便找個理由搪塞你。

About Microsoft BOT Framework

設定好BOT Framework之後其實我蠻好奇的,因為可以看到Channels能夠設定的並不只有Skype和Web Chat而已,還有很多種Channel可以設定,包括Facebook Messenger/slack等。
這邊可以看到Microsoft一貫的包山包海風格,其實Microsoft BOT Framework就是一個BOT Connector,可以通吃各家的BOT。.NET的Developer也可以透過Visual Studio的BOT Framework template寫好BOT後發佈到雲端或網站上,設定好應用程式的ID和密碼來串接,只要有在BOT Framework設定,一隻API可以通吃所有的BOT。當然Claudia也是可以通吃,只不過因為要跟skype串, 而在跟skype串接的時候,看到Microsoft BOT又這麼大堆頭, 可是我只是想跟你家skype連線而已,有種「Microsoft真是一以貫之的熱(ㄐㄧ)心(ㄆㄛˊ)啊~」的感覺。

想透過Visual Studio的BOT Template及Microsoft BOT Framework來開發BOT的話,可以參考董大偉老師的文章:關於bot framework (3) - 建立一個最基本的bot (v3新版)

沒有留言: