這篇文章會介紹如何用Claudia寫一隻自動抓取台銀最新的現金賣出匯率,並轉成JSON格式的API,再建立一個機器人並讓機器人自動回覆匯率。
建立API
初始化npm專案
- 建立一個資料夾並命名為currencyrate
- 打開Mac Terminal/Windows command line tool並移動到這個資料夾(cd currencyrate)
- 初始化npm專案:輸入
npm init
安裝套件
如果之前選擇不將Claudia安裝到Global,要在這個步驟打入npm install claudia -D來安裝Claudia到這個專案。
另外還必須要安裝幾個npm套件:
- claudia-api-builder:Claudia自動部署API的套件
- minimal-request-promise:很簡單就可以取得網頁上資料的套件
- csv-parse:因為台銀提供csv檔格式的API,這個套件可以解析csv檔
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版本。- 首先,用你的microsoft/Azure帳號登入Microsoft BOT Framework,並按下"Register a BOT"
- 在Bot profile區段,給你的BOT一個名字,並且在bot handle給予這個BOT一個識別值(identity)。bot handle區段一旦設定了,就不能再改了。
- 在Configuration區段中設定:
- Microsoft BOT framework的設定告一段落,回到我們的command/terminal console,打入
Claudia update --configure-skype-bot
- Claudia會要求你輸入Skype App ID和Skype Private key,其中Skype App ID就是應用程式識別碼,Skype Private key則是按下“產生應用程式密碼以繼續”按鈕時,系統自動產生的那組密碼,也就是剛剛特別要你存起來的那組密碼
- 至此,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新版)。