[專案開發日常—2]

Tags
linebot
飲水機
Last edited
Jan 22, 2022 02:51 AM
by:陳澤榮 (timothychenpc@gmail.com)
日期:0121

測試和部署:

前情提要:因為是關於linebot開發,然後也因為要測試webhook,所以就必須要有一個公網ip讓它訪問,然後後續的所有linebot的互動也都需要經過這個webhook然後再分發給每一個
  • Azure 事情是這樣的,原本我是使用azure測試和部署,但是經過了上次糟糕的debug經驗(因為它的log不是同步的,只會顯示application error時的錯誤,其他的一些終端機的訊息就看不到)
    • 很多個log
      很多個log
      azure log(docker沒有錯誤的話就看不到終端)
      azure log(docker沒有錯誤的話就看不到終端)
      應用程式錯誤
      應用程式錯誤
  • Heroku 然後後來又轉到heroku做測試(因為CLI可以將heroku上的終端機同步到本地的終端,也就可以看到從自動部署到部署成功的全過程,並且裡面就是系統的終端,所以錯誤訊息也都很清楚),但是因為Heroku和Azure一樣都是屬於雲端部署,都需要經過上傳Github→自動部署→執行 的整個過程,然後整個過程大概需要1~3分鐘的時間,然後就會把整個開發的過程拉的很長,然後每次都是因為一個小bug,然後就重新部署一次,效率很低.......
    • notion image
  • Ngrok(目前採用的方法) 因為ngrok是通過“內網穿透”(應該是這樣叫)的方式把你電腦上的一個端口,對應到ngrok下的一個子域名。也就是可以直接通過外網訪問到本地的特定端口(我是用8080),然後再啟動伺服器,就可以再本地進行測試。 而這種作法的好處是,因為省略了整個部署的時間,所以只要在本地執行python就可以了,然後同樣可以看到完成的終端機(但是vscode原生的終端機有點醜,有的時候要找錯誤訊息要翻半天,之後可能會考慮用插件解決)
    • notion image

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" }
然後順便一提,這邊你看到的json長得很直觀,但是它傳過來的時候就是一整個字串,所以後來用之前寫的json格式化的函式處理了一下,所以之後webhook那邊收到請求,就會經過這個函式,解析整個event然後輸出,爽多了(然後上面有涉及安全的一些資料我都碼掉了)
於是我就下意識的想用event.source.userId去存取,結果根本沒有這個東西(試了半天才發現原來應該是event.source.user_id),真的不知道為什麼當初寫這個event的時候不統一一下,

儲存id

目前是儲存在MongoDB(NoSQL讚讚),然後儲存的時候只能存一個userid,但是之後應該會改成用指令的方式儲存和刪除id,並且可以增加多個id的情況(也就是可以在不同人那邊同步看到linebot的結果)

整個專案規劃

之後應該會把linebot處理的部分包成物件然後從主程式分離出去(比較好管理)