by:陳澤榮 (timothychenpc@gmail.com)
日期:0121
測試和部署:
前情提要:因為是關於linebot開發,然後也因為要測試webhook,所以就必須要有一個公網ip讓它訪問,然後後續的所有linebot的互動也都需要經過這個webhook然後再分發給每一個
- Azure 事情是這樣的,原本我是使用azure測試和部署,但是經過了上次糟糕的debug經驗(因為它的log不是同步的,只會顯示application error時的錯誤,其他的一些終端機的訊息就看不到)
- Heroku
然後後來又轉到heroku做測試(因為CLI可以將heroku上的終端機同步到本地的終端,也就可以看到從自動部署到部署成功的全過程,並且裡面就是系統的終端,所以錯誤訊息也都很清楚),但是因為Heroku和Azure一樣都是屬於雲端部署,都需要經過
上傳Github→自動部署→執行
的整個過程,然後整個過程大概需要1~3分鐘的時間,然後就會把整個開發的過程拉的很長,然後每次都是因為一個小bug,然後就重新部署一次,效率很低.......
- Ngrok(目前採用的方法) 因為ngrok是通過“內網穿透”(應該是這樣叫)的方式把你電腦上的一個端口,對應到ngrok下的一個子域名。也就是可以直接通過外網訪問到本地的特定端口(我是用8080),然後再啟動伺服器,就可以再本地進行測試。 而這種作法的好處是,因為省略了整個部署的時間,所以只要在本地執行python就可以了,然後同樣可以看到完成的終端機(但是vscode原生的終端機有點醜,有的時候要找錯誤訊息要翻半天,之後可能會考慮用插件解決)
Line-bot-api
獲取id
我這個層級的
linebot
目前應該是之支援 .push_message()
和 .reply_message()
,然後呢push是需要有userId
(或者roomId,groupId),然後reply的話則是需要reply_token
,這些東西在經過webhook和handler的處理後就會被包成event物件,然後用物件的屬性進行存取,然後我把這個物件印出來了,長這樣 { "message": { "id": "************", "text": "\u547c\u53eb\u6a5f\u5668\u4eba", "type": "text" }, "mode": "active", "replyToken": "******************88", "source": { "type": "user", "userId": "******************" }, "timestamp": 1642818241903, "type": "message" }
於是我就下意識的想用
event.source.userId
去存取,結果根本沒有這個東西(試了半天才發現原來應該是event.source.user_id
),真的不知道為什麼當初寫這個event的時候不統一一下,儲存id
目前是儲存在MongoDB(NoSQL讚讚),然後儲存的時候只能存一個userid,但是之後應該會改成用指令的方式儲存和刪除id,並且可以增加多個id的情況(也就是可以在不同人那邊同步看到linebot的結果)
整個專案規劃
之後應該會把linebot處理的部分包成物件然後從主程式分離出去(比較好管理)