LKY 只有原創內容的 Blog

今之能者,謂能轉貼,至於魯蛇,皆能轉貼。不原創,何以別乎?

  1. 1. 這篇文章會談什麼?
  2. 2. 這篇文章不談什麼?

這篇文章會談什麼?

如何最方便的佈署一個 Line chatbot。要是你佈署成功了,它就只會 echo,也就是把你傳的字串吐回給你,不會產生任何新字串,證明 Server 有接收到你的訊息。

這篇文章不談什麼?

不會談如何讓 chatbot 調皮搗蛋、生動有趣、讓你覺得 Server 上面養了一隻真人。因為那牽涉到複雜、多變,而且沒有固定作法的機器學習。也許未來會談,但這篇文章不會。


  1. 寫程式之前,要先去申請一個 Line Developer 帳號,拿到這幾樣東西:

    • Channel secret
    • Channel access token
  2. 到這個 repo 的 readme 照做

  3. 修改 SDK 中讀取 Channel secret 和 Channel access token 的部分
    把上一步拿到的 Channel secret 和 Channel access token 寫入在 *.ini 裏面,並將這兩個檔案加入 .gitignore,動態讀入 Line API

    1
    2
    3
    4
    5
    6
    7
    8
    my_CHANNEL_ACCESS_TOKEN  = open('channel_access_keys/channel_access_token.ini').read()
    print(my_CHANNEL_ACCESS_TOKEN)

    my_CHANNEL_SECRET = open("channel_access_keys/channel_access_secret.ini").read()
    print(my_CHANNEL_SECRET)

    line_bot_api = LineBotApi(my_CHANNEL_ACCESS_TOKEN)
    handler = WebhookHandler(my_CHANNEL_SECRET)
  4. 建立 https server 取得 Webhook URL
    Line 的用戶操作介面,是一張前端的皮,開發 Line Bot 就是自己掌握這張皮後面的邏輯思維。Webhook 是一個 function ,是「皮」和「腦」的傳輸管道。Webhook 是由 Server 端提供,所以架好 Server 才會有 Webhook。

    要注意的是,Line 有限定這個 Webhook 一定要是 Https,那要怎麼架 Https Server 呢?

    我目前會採用兩種方案:

    • ngrok 的 https local server
      在開發機上 demo 測試用的,手上的電腦就是 server,關機就沒了。所以只是和暫時性的 demo 和測試。方便快速,但不能持續,因為我不能讓筆電 24 小時都開著維持連網。

    • GCP VM 上的 remote server
      由於是雲端機器,只要用 tmux 維持 process 運作就好。雖然大多數服務要錢,但是選用最便宜的 f1-micro 免費,用來完成一個 MVP(Minimum Value Product) 應該是足夠。
      注意:防火牆設定:0.0.0.0/0 tcp:5000 輸入(ngrok 好像可以不用?)

    因為不想要另外弄 https certificate(MVP就是要儘量省下麻煩,能動就好,對吧!),所以我仍然會在 remote server 跑 ngrok。

    我會用 tmux 維持兩個 session:

     - session 1:ngrok 的,負責聽 local server(開了就儘量不要關,理由後面會說)  
         
    1
    $ ngrok http 5000
    ![](/content/images/佈署LineChatbot/ngrok_running.jpg) - session 2:跑 server 程式的,可能會隨著更新,時常重新啟動)
    1
    2
    $ export FLASK_APP=app.py
    $ flask run --host=127.0.0.1 --port=5000
    ![](/content/images/佈署LineChatbot/flask_running.png)
  5. 把 ngrok 拿到的 Webhook URL 放到 Line Developer 後台

  6. 照理說,這樣應該就可以用了

本文最后更新于 天前,文中所描述的信息可能已发生改变