10分鐘完成你的第一支 Watson Workspace bot

IBM Watson Workspace 是一個類似 Slack or Microsoft Team 的「團隊溝通平台」+「即時通訊軟體」。它的底層稱為 Watson Works Services,已經內建IBM Watson  NLU (Natural Language Understanding 自然語言理解) 及 IBM Watson NLC  (Natual Language Classfier 自然語言分類)。簡單來說,在 Watson Workspace 的每句對話的背後,到底這句話是一個命令動作 (ex: 你需要於星期五前完成這個專案),或是是個問句 (ex: 你知道哪裡可以找到簡報檔嗎?),或是這句話裡面有談到關於地域、食物、天氣、情緒、人名……..,Watson Workspace都已經會有這些資料可以直皆提供給開發 Watson Workspace bot 的 developer 。

本文說明如何使用 node.js 從 0 打造一個最簡單的 Watson Workspace bot,傳送訊息到 Watson Workspace 中。知道如何傳送訊息到 Watson Workspace 中之後,能應用範圍就會很廣了,例如可以建立一個客服的後台系統,把前台不管來自網站的 chat bot 或是 line chat bot 的訊息都拋轉給後台的客服人員,客服人員可以使用  Watson Workspace 處理從不同管道進來的訊息,決定在前台 chat bot 無法自動處理客戶訊息的時候,人工介入來幫客戶處理問題。

Step 1: 註冊或登入 Watson Workspace
若還沒有 Watson Workspace 帳號,可於註冊一個免費帳號來玩玩

2018-04-18_10-59-29

開始試用 Watson Workspace

接下來你可以下載 Desktop 版的 Watson Workspace 使用,也可以直接使用 Web 版的。

Step 2: 建立一個 Space
如果已經有Space了,可以跳過這個步驟。
進入 Watson Workspace 後,點選畫面中的 Spaces 旁的 + icon,建立一個 Space

Step 3: 建立一個 Watson Work Services App
進入 Watson Work Services App console

2018-04-18_15-24-32

打開 Watson Work Services Apps 管理介面

建立一個新的 App

為你的 Bot 取個名字,為避免跟別人的Bot名字重複,建議在 App Name 最後加入你的名字的縮寫之類的
建立好之後,把 App ID 及 App secret 記下來(很重要,因為App secret 只會出現一次)
2018-04-18_11-17-21

Step 4: 將 App 加入 Space 中
到 Space Settings 中 把 Step 2 中建立的 App 加入你的 Space

Step 5: 複製 Space ID
回到 Space Settings 中,選擇 Audio & Video,將畫面中 Meeting Link 的 URL,meeting/ 之後的那段編碼 copy 下來,這個就是每個 Space 的 unique ID,將它記錄起來
SpaceID

Step 6: 建立 nodejs project
建立一個新的Folder

mkdir wws-bot-nodejs
cd wws-bot-nodejs

初始化 nodejs project
npm inits

這邊我是使用 watsonworkspace-sdk,這不是官方的 sdk,但是因為 Watson Works Services 的 API 呼叫大多數是透過GraphQL,這個非官方的 sdk 把呼叫 GrapQL 這段都封裝起來了,所以使用上會簡單非常的多,程式也會簡潔易懂多
watsonworkspace-sdk 除了能傳送訊息之外,也可以處理接收到的訊息,詳細可以參考 watsonworkspace-sdk
安裝 watsonworkspace-sdk
npm install watsonworkspace-sdk —save

建立 index.js
source code 如下
const wwsdk = require('watsonworkspace-sdk')
const ww = new wwsdk("<Step 2中的 APP ID>","<Step 2中的 APP secret>")
const msg = "Hello World!!"
ww.authenticate()
.then(token =>; {
ww.sendMessage('<Step 5中的 Space ID>', msg)
})

Step 7: 測試
執行

node .

回到 Watson Workspace,可以看到訊息已經傳送到 Space 中了。 第一支 Watson Workspace bot 完成!
Watson Workspace bot

如何申請免費SSL憑證讓NGINX 加入 HTTPS 支援

SSL for Free 可以申請 免費SSL憑證 ,唯一缺點就是效期只有90 天,所以每90天要回到網站上重新 renew。不過效期快到之前,會有郵件通知就是了。

Step 1: Create Free SSL Certificate 建立 免費SSL憑證

首先先到 https://www.sslforfree.com/,輸入你要申請 免費SSL憑證 的網址,再按下 Create Free SSL Certificate

SSL-For-Free-免費SSL憑證

Step 2: 確認 Domain 擁有權

接下來的選澤 Manual Verification 透過 DNS 手動確認你擁有這個 Domain

2018-04-13_18-11-44

1. 點選Manual Verification

2018-04-13_20-46-18

2. 接下來點選 Manual Verify Domain

Step 3:Update DNS Records

接下來畫面會顯示 Update DNS Records,在Update DNS Records步驟2中,會顯示類似下面的說明

2.  Add the following TXT records below to the DNS server for each domain (In the Time to Live (TTL) field, enter 1):
1. Add TXT record with the name/host _acme-challenge.www.xxxxx.me with the value b7-sYV7EWFyJxxxxxxKc7wq3RtRaGz6-SIgilDA
2. Add TXT record with the name/host _acme-challenge.yourdomain.com with the value 2rnrUcbVCoUJxxxxxIGycNd_cpUGee8kM

_acme-challenge.www.yourdomain.com 是到時候要加到DNS TXT record中的 name/host值 b7-sYV7EWFyJxxxxxxKc7wq3RtRaGz6-SIgilDA 是 TXT record 的 value 值

Step 4: 於DNS中加入TXT records

這邊以 GoDaddy 為例,在GoDaddy DNS管理工具裡面,按”加入“新建一筆 DNS record
類型選擇 TXT  主機欄位內填入 Step 3 中 TXT name/host 值 (只要填 Domain 前的值,例如 _acme-challenge.www),TXT 值 填入Step 3 中 TXT value值,TTL 選擇自訂,秒數選擇 600
2018-04-13_21-19-27
然後按下”儲存“(如果畫面上有出現任何錯誤,可以不用管它)
再重複一次 Step4,把 Step 3中的第二筆 TXT record 也加到 DNS 中
 

Step 5:驗證TXT record

回到 SSLforFree 網站,大概等個幾分鐘後,點選  Verify _acme-challenge.www.yourdomain.com 連結,驗證TXT record
2018-04-13_21-32-43
這邊要注意的是,設定文件裡面建議TTL是設定為 1 秒,但GoDaddy DNS的TTL最低只能設定 600 秒,所以設定完之後,可能不能馬上進行驗證,要等個幾分鐘再進行驗證
畫面應該會出現如下(若有 Warning 可以不要理它)

TXT Record(s) Found. Make sure the value matches the value specified by the instruction for with the domain hostname:

Step 6: 建立 SSL Certificate 檔

點選 Download SSL Certificate
在本機上新建一個檔案命名為 <yourdomain.com>.crt (ex: coryma.com.crt),將畫面上 Certificate: 內的值複製貼上到 <yourdomain.com>.crt
在本機上新建一個檔案命名為 <yourdomain.com>.key (ex: coryma.com.key),將畫面上 Private Key: 內的值複製貼上到 <yourdomain.com>.key
在本機上新建一個檔案命名為 <yourdomain.com>.crt (ex: coryma.com.ca-bundle),將畫面上CA Bundle 內的值複製貼上到 <yourdomain.com>.ca-bundle

Step 7:建立 Intermediate/chain certificate

用任一種文字編輯器把 Step 6 中的 <yourdomain.com>.crt  及 <yourdomain.com>.ca-bundle 合併為  <yourdomain.com>_chain.crt

或是在 Mac or Linux 中可以直接使用以下指令

cat <yourdomain.com>.crt <yourdomain.com>.ca-bundle >> <yourdomain.com>_chain.crt 

Step 8:將 <yourdomain.com>_chain.crt  及 <yourdomain.com>.key 放置到 nginx server 上

例:
放置於 nginx server 上
/etc/ssl/certs/<yourdomain.com>_chain.crt
/etc/ssl/private/<yourdomain.com>.key

Step 7: 於 nginx server 上建立 ssl.conf

於 /etc/nginx/conf.d 建立 ssl.conf

server {
listen 443 ;
server_name <your domain>;
ssl_certificate /etc/ssl/certs/<yourdomain.com>_chain.crt ;
ssl_certificate_key /etc/ssl/private/<yourdomain.com>.key ;
}

Step 8: 重啟 nginx server

加羅湖(2018/03/30~2018/03/31)

加羅湖 位在宜蘭縣,於南湖大山和太平山間的中央山脈稜線上,海拔2200公尺左右。從四季林道停車處走到加羅湖,如果途中不去加羅山也不去其他零星小湖,來回大概是14公里。安排輕鬆一點走的話,重裝去程大概是 5~7小時,回程大概 4~6 小時。起登為四季林道柵欄口停車處,停車的地方大概只能停五部車,所以建議安排非假日來,或是要非常早到或是前一晚就到柵欄口睡在車上,否則大概要多走個一兩公里。

以中級山的經驗來說,我也只爬過北插天山,所以對加羅湖到底裝備跟服裝要怎麼準備,真的也沒什麼概念。好在就是以登百岳的方式準備裝備,否則下場一定很淒慘。主要是步道實在太過泥濘,如果不是穿雨鞋或是中高筒登山鞋加上綁腿,絕對會很慘。

無標題

被遺落雨鞋

加羅湖的湖水不是活水,所以不能在湖中洗碗筷,湖水也要用濾水濾過才能使用,不然就是要從加納富溪把水扛上來。所以濾水器買了一年多,這次覺得真的是值回票價,可以少扛水上來也有乾淨的水可以用

無標題

辛苦濾水中

這趟路上還有遇到桃園龍潭國中的校外教學(?),是太加縱走,從太平山進經過加羅湖然後從四季林道出。太加縱走是從海拔2200左右的太平山下到海拔1700公尺左右的四季林道,比來回加羅湖少了陡上的路程。不過再怎麼說,這些國中生也是很厲害了,我們看到最後壓隊的老師,已經距離最前面的隊員大概有半小時的路程了,老師已經以半蹲坐方式下山的(膝蓋大概受不了了)。我們ㄧ致的結論,最辛苦的應該是老師吧! (別人的校外教學應該就是參觀博物館這樣)

無標題

加羅湖步道

撇開泥濘的步道,加羅湖絕對值得推薦作為高山野營的入門體驗,因為真正重裝陡上的路程大概是1.9K,應該是差不多有點累又不會太累的距離。我們當天出發時天氣預報下雨機率60%,途中只有遇到零星小雨,還沒有到需要著全副雨衣雨褲的地步,山神有保佑,讓我們體驗了霧中的加羅湖及藍天襯托下的加羅湖

無標題

清晨薄霧中的加羅湖

加羅湖

藍天加羅湖,兩頂帳包場

加羅湖湖邊的草皮露營起來實在太舒服了,我們運氣相當好,當天只有我們兩頂帳。不過晚上相當冷,不時聽到山羌的叫聲,營帳內的溫度大概只有6度左右,即使舖了鋁箔睡墊,還是會感覺寒氣一直從地面上來,冷到有點難睡。
加羅湖的美不輸嘉明湖,就車程及行程長度來說,加羅湖親近多了,真的很值得一訪