作者ichico (細雪。)
看板Soft_Job
標題[心得] 使用Claudia.js製作Facebook機器人
時間Sat Dec 17 10:21:17 2016
Claudia.js是一個可以把Node.js/Javascript 的Microservice
簡單地部署到AWS Lambda的工具。
只要一行command就會幫你處理好AWS的IAM/Lambda的設定,
甚至是BOT的configuration,非常方便。
因為這個工具目前中文的介紹似乎還不多,
所以小的想拋磚引玉先來個簡單的中文介紹如何使用Claudia製作FB機器人,
請版上各位年薪千萬的大大們鞭小力一點。
Blog無廣告音樂好讀版
http://kaoruiscoding.blogspot.tw/2016/12/claudiajsfacebook.html
以前我們常常會需要一些Web Service幫我們處理一些簡單的GET/POST,
這些Web Service可能很簡單並不複雜,甚至不需要UI,
不過它總是需要一個host來立足,於是你可能就必須要找一台主機,
如果是Windows的話還要有IIS
(然後忍受IIS偶爾的衝康跟無止盡的windows update)
所以當AWS推出了Lambda,身為一個Infra暴弱的Dev,真的會要給AWS一個大大的讚!
這才是真正的SASS精神啊。畢竟我們不需要為了喝牛奶而去養一頭牛你說是吧。
Lamdba讓程式開發人員可以專心的在程式的邏輯上面,
將每個function獨立出來計費可以讓阮囊羞澀的獨立開發者與startup
不需要負擔主機的維運費用,
並且有精美的dashboard可以統計各個function的狀態,真的是非~常~的美好。
BUT,這世界上總是有個BUT,Lambda要寫python/node.js方便是方便,
不過在部署的時候還是得設定IAM的Role,function才能正常運行。
如果是AWS的菜鳥(尤其是Infra跟我一樣爆爛的)看到IAM的設定應該會很茫然。
於是現在就有很多Lambda的部署工具,比方說Python用的Kappa,
以及現在我想介紹的Claudia.js。
Claudia.js其實就是用AWS的Node.js framework將Lamdba的部署自動化,
IAM以及Lambda的設定都在Claudia.js當中完成。
之後如果要更新code,也只要一個指令就能完成,
而且不需要登入AWS Console,是不是很方便啊。
以下就來介紹怎麼透過Claudia.js自動部署microservice
並在Facebook上面做一個機器人。
首先你必須要申請一個AWS帳號
(不然你是要部署到哪裡去),
在此就不贅述如何申請了。
設定環境
因為Claudia.js是用來Deploy Node.js的microservice,
所以你的電腦也要裝Node.js
(這不是廢話嗎)
Node.js預設就有npm(Node.js的package管理工具)因此以下會提到npm指令,
但不需要另外安裝。
安裝Node.js
Windows版
Command:
sudo curl
http://nvm-latest.herokuapp.com | bash
手動安裝:到官網安裝最新版的Node.js
安裝完後在Command line工具中執行
node -v
就可以檢查Node.js是否正確安裝。
Mac版
雖然Mac的Homebrew好用到令人流淚,但因為node.js版本更新非常快速,
因此推薦使用nvm安裝。透過nvm安裝Node可以很簡單的輕鬆切換Node.js版本。
如果你有安裝XCode,可以透過XCode來安裝nvm
$ xcode-select --install
如果沒有安裝,可以透過curl來安裝
sudo curl -o-
https://raw.githubusercontent.com/creationix/nvm/v0.32.1/install.sh | bash
在Terminal中輸入nvm ls-remote找出最新的版本,
我寫這篇文章時最新的版本是7.2.1
執行$ nvm install 7.2.1
$ nvm alias default 7.2.1
安裝node.js
新增一個IAM使用者
1.到AWS主控台,從上方的下拉選單選擇IAM服務,
進入IAM服務後選擇左邊的"Users" ,並按下藍色的"Add User"
2.輸入使用者名稱,並勾選“Programmatic access”,
然後按下“Next:Permissions"
3.選擇”Attach existing policies directly“
並在底下的policy勾選IAM Full permission / Lambda Full permission,
然後按下"Next: Review"
4.確定這個使用者有IAM Full Access 和Lambda Full Access之後,
按下”Create User“
5.按下"Download .csv"按鈕可以下載這個使用者的Credential,
強烈建議要下載下來,
因為當按下close之後你就再也沒有機會看到Secret access key 了,
只能重新建立一個使用者。
(都已經說了This is the last time these credentials
will be available to download.了~)
建立登入資料
這個步驟是讓你在Deploy的時候不需要再輸入帳號密碼。
用Sublime或Notepad等純文字編輯器打開 Mac/Linux 的 ~/.aws/credentials
或 Windows 的 C:\Users\USERNAME\.aws\credentials,加入以下指令:
[default]
aws_access_key_id = YOUR_ACCESS_KEY_ID
aws_secret_access_key = YOUR_ACCESS_SECRET_KEY
YOUR_ACCESS_KEY_ID指的是剛剛建立好的帳號中,最後一步顯示的access_key_id,
YOUR_ACCESS_SECRET_KEY則是被隱藏的access Secret key.
如果剛剛沒有把資料保存下來...再回去重新建立一個使用者吧
安裝Claudia.js
因為已經安裝好npm了,安裝Claudia就是一件非常輕鬆簡單的事情。
在Mac的Terminal或是Windows的console打入以下指令:
npm install claudia -D
Claudia就裝好了。
開始寫機器人囉!
初始化npm專案
1.建立一個資料夾並命名為aLittleGreeter
2.打開Mac Terminal/Windows command line tool
並移動到這個資料夾(cd aLittleGreeter)
3.初始化npm專案:輸入npm init
安裝套件
在寫機器人之前,我們還需要安裝兩個npm套件
1.claudia-bot-builder:
有了這個套件,Claudia才能幫你設定和其他通訊軟體
(例如Facebook, skype, slack)
2.huh:這是亂數取一個理由的npm套件,
可以在系統掛掉的時候第一時間回信給PM解釋(誤)
在Terminal或是Cmd輸入
npm install claudia-bot-builder huh -S
即可安裝這兩個套件。
BOT的Code
(鄉民表示:終於到寫Code了)
打開你的sublime或是其他的記事本工具,輸入以下的code:
const botBuilder = require('claudia-bot-builder');
const excuse = require('huh');
module.exports = botBuilder(
function(message) {
return 'Thanks for sending '+ message.text +
'Your message is very important to us, but '+excuse.get();
});
然後儲存成index.js。
這是一個很簡單的機器人,會把你說的話再重複一次,
然後找個理由回(ㄈㄨ)答(ㄧㄢˇ)你。
透過Claudia把Code部署上AWS
Claudia會幫你把Lambda和Role該設定的全部都設定好,
就交給Claudia部署就可以了。
只需要一個指令
claudia create --name aLittleGreeter --region us-west-2 --api-module index
name 屬性: Claudia會使用name來建立IAM Role和Lamdba
region屬性: 你要部署到哪個AWS的region,
在這邊使用us-west-w2指的是美國的奧勒岡州。
可以參考AWS Region列表
https://goo.gl/FXWlJW
選擇要部署到哪個region。
api-module屬性:Lamdba程式的進入點。我們的檔名是index.js,
所以將api-module設定為index,
Claudia就會將index.js的內容部署到Lamdba。
如果沒有問題,就會看到Claudia一直在幫你跑AWS上面的流程了。
部署完成以後,應該會看到以下的訊息
{
"lambda": {
"role": "aLittleGreeter-executor",
"name": "aLittleGreeter",
"region": "us-west-2"
},
"api": {
"id": "
[api-gateway-id]",
"module": "index",
"url":
"
https://[api-gateway-id].execute-api.us-west-2.amazonaws.com/latest"
"deploy": {
"facebook": "
[url]facebook",
"slackSlashCommand": "
[url]slack/slash-command",
"telegram": "
[url]telegram",
"skype": "
[url]skype",
"twilio": "
[url]twilio",
"kik": "
[url]kik",
"groupme": "[url]groupme",
"viber":
"[url]viber",
"alexa": "
[url]alexa"
}
}
}
然後回到AWS的IAM 管理介面,選擇Role,
可以看到Claudia已經幫你建好一個Role了。
再切到AWS的Lambda管理介面,發現Claudia也建好Lambda的函數了。
這樣AWS的部署就已經完成了。有沒有很方便呀。
設定Facebook粉絲專頁機器人
OK,我們已經部署完AWS的部份了,接下來是Facebook的設定。
1.先建立一個粉絲專頁
2.到Facebook Developer應用程式開發頁面,
如果之前沒有註冊成為Facebook Developer,
應該會先看到"立即註冊"的按鈕,按下立即註冊成為Facebook Developer。
3.按下“新增應用程式”,類別選擇“專業應用程式”,
取好名字以後選擇“建立應用程式編號"
4.建立好之後會到這個應用程式的主控台,
在產品設定中按下Messanger區塊旁的"開始使用"
5.在"權杖產生"中,先選擇先前建立好的粉絲專頁,
在旁邊的粉絲專頁存取權杖中會顯示一組權杖,先記錄下來。
6.這時我們要在Claudia設定與Facebook連動,
回到電腦的Terminal或是Cmd Console,打入以下指令:
claudia update --configure-fb-bot
Claudia會將Code重新部署,部署完後會出現以下的回應:
Facebook Messenger setup
Following info is required for the setup,
for more info check the documentation.
Your webhook URL is:
https://[api-gateway-id].execute-api.us-west-2.amazonaws.com/latest/facebook
Your verify token is: [verify Token]
Facebook page access token:
Claudia詢問的Facebook page access token,
就是剛剛Facebook應用程式中粉絲專頁的權杖,將剛剛複製好的權杖貼入Terminal
接著Claudia會詢問Facebook App Secret,
到應用程式中選擇“主控台”,在主控台中找到"應用程式秘鑰",
按下顯示後,將內容貼到Terminal
到這邊AWS端的連動已經設定完成,接下來回到Facebook應用程式
到"Webhooks"區段中選擇“Setup Webhook”
填寫Webhook資訊:
回呼網址:填上Claudia回應中的deploy->facebook區段中的內容,
通常是
https://[api-gateway-id].execute-api.us-west-2.amazonaws.com/latest/facebook
驗證權杖:在剛剛打入claudia update --configure-fb-bot的時候,
Claudia的回應中有一段 Your verify token is: [verify Token],
填入這個verify token
訂閱欄位:至少要勾選messages
儲存之後,就可以看到Webhooks區段有綠色勾勾,代表已經設定完畢
然後就可以嘗試傳送訊息給你的粉絲專頁了
茶包射手
*部署的時候出現npm error
檢查一下Code有沒有寫錯,或是需要的npm套件沒有安裝。
*部署的時候出現AccessDeniedException
檢查IAM的使用者是否已經有IAM和Lambda的Full permission
*出現package.json does not exist in the source folder
通常是因為沒有執行npm init,可以再執行一次讓npm產生package.json
部署失敗,
出現Make sure you have the latest version of node.js and npm installed.
這是因為Node.js太舊了,
如果Mac有安裝Homebrew只要透過Homebrew更新就可以了
brew upgrade node
如果沒有Homebrew,可以透過npm清除Node.js的Cache並下載最新版:
sudo npm cache clean -f
sudo npm install -g n
sudo n stable
Windows的使用者也可以透過npm來更新node.js
npm cache clean
npm update -g
*我想更新我的Code,重新執行Claudia出現這樣的訊息:
Role with name aLittleGreeter-executor already exists.
這是因為重複執行Claudia create。
Claudia create會自動建立AWS的IAM Role和Lamdba,
而名字是identity不能重複的。
所以如果要更新Code或是設定其他的組態(像是Facebook連動),
請用Claudia update.
如果想要更新的不是只有Code本身,像是想要換AWS的region,
那麼只能將建立好的IAM Role, Lamdba等等都先手動刪除再執行Claudia create。
Facebook機器人不會回應我的朋友
這是正常的,這個機器人目前只會回應你而已,
當全部開發完成之後會需要提交給Facebook審查,
可以參考Facebook的審查說明。
https://developers.facebook.com/docs/messenger-platform/app-review
人工審查需要七天左右,審查通過其他人才可以用。
--
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 1.164.205.197
※ 文章網址: https://www.ptt.cc/bbs/Soft_Job/M.1481941288.A.9D7.html
推 jerry771210: 太威了 12/17 10:50
推 lipojack: 推 12/17 11:38
推 jjwei: push! 12/17 12:46
推 MagicTouch: 感謝分享~ 12/17 12:48
推 Ekmund: 喔喔這個讚 12/17 12:53
推 blackcan: 感謝分享 12/17 12:57
推 wddx: 感謝大大分享! 12/17 13:09
推 saivantist: 讚讚 12/17 13:45
推 SmallDruid: 好玩欸 12/17 14:02
推 jimmy689: 家豪推 12/17 14:34
推 ZC: 感謝 12/17 15:08
推 ian90911: 推 12/17 17:40
推 drajan: 讚 12/17 22:40
推 xxhomey: 推 12/17 22:45
推 srxrrr: 推推!!!! 12/17 23:46
推 NvidiaCUDA: 推 12/17 23:47
推 jay123peter: 推 12/18 02:07
推 bruce723: 推 12/18 09:21
推 yongb: PUSH 12/18 14:54
→ viper9709: 推~感謝分享 12/18 16:58
推 vidcina: 把朋友加到粉絲頁面的tester就可以收到了 12/19 10:11
推 kyocartoon: 推 12/19 19:05
推 yuanyu90221: 推 12/19 22:23
推 markbex: 感謝原po!! 12/21 19:01
推 youccu: 謝分享 12/22 10:01