手把手完整帶你在Heroku上部署Python LINE Bot Server

Leo Liao | 廖鴻林
Leo Liao
Published in
Sep 15, 2020

Purpose

現在有非常多的職缺是希望找到對LINE Bot有經驗的人才,並且LINE Bot的應用場景非常廣,可以實作出很方便的功能來提供企業使用,所以我這次來教學LINE Bot的基礎架設,算是帶給大家一個起步的契機。

本篇主要涵蓋的範圍有:

  1. 建立一個LINE Bot Messaging API
  2. 將Python LINE Bot Server部署在Heroku並綁定Github
  3. 利用ngrok進行本地端測試

Hands-On

登入LINE Developers並建立專案

在LINE Developers中可以用LINE帳號登入,在登入後進入Providers頁面,Provider的意思可以比喻成資料夾,可以在資料夾內加入不同的Service。

接著建立一個Provider,下面會讓你填名稱。

建立之後會可以選要建立哪種channel,我們會用到的是Messaging API。

然後把一些必填的選項填完就OK了~

接著我們要看到Basic settings的頁籤,裡面的Channel secret要複製下來,還有Messaging API的頁籤,裡面的Channel access token欄位,要按下issue產生一組token,這個也要記錄下來,後面要放進server code裡。

可以在LINE Official Account features這裡設定一些Bot的Behavior,歡迎訊息與自動回覆之類的,然後一定要把Webhook打開,才能觸發之後在Heroku上的Server端處理。

建立Heroku專案

首先需要註冊一個帳戶。

免費版提供每個月450個小時的運作時間,綁定信用卡會額外有550個小時的時數的,如果你只有一個application在跑,是可以每個月24小時不間斷持續運作不被收費喲!

但是免費版會有cold start的問題,30分鐘未使用會啟動休眠,休眠後下次使用會需要等他重新開啟,才會正常運作。

我們先新增一個application,名稱是不能重複的,你可以需要稍微想一下。

建立起來後,我們要到LINE Bot去綁上Webhook的url,這樣在與Bot互動時,才知道要把Message往哪裡送。

在LINE Developers Messaging API頁籤的Webhook URL填上符合格式的url

https://{HEROKU_APP_NAME}.herokuapp.com/callback

並且記得將Webhook打開。

建立Github Repo

在Github建立一個Repo來存放Server code。

你可以在我的另外一個Repo clone新的Template使用。

於app.py中,13~16行需要將我們上面複製的Cannel secret和token貼進來。

# Channel Access Tokenline_bot_api = LineBotApi('YOUR_CHANNEL_ACCESS_TOKEN')# Channel Secrethandler = WebhookHandler('YOUR_CHANNEL_SECRET')

完成之後把程式碼push上remote。

將Heroku連動Github Repo

我們回到Heroku,於Deploy頁籤,你可以選擇Connect Github。

點選下面的Deploy Branch,將master手動部署進Heroku Server。

在Automatic deploys裡面選擇master分支,接著打開自動部署,這樣當你發pull request將變更合併至master時,github可以直接觸發Heroku進行部署。

看到下面這張圖就代表完成了!

測試一下pull request合併之後,確實會觸發deploy!

接著我們來測試一下,進入LINE Developer Messaging API頁籤,可以看到有個QR code,掃描加入好友,跟它說說話吧!

利用ngrok本地端測試你的Python

那麼就會有人問我,我每改一次程式碼,是不是就要重新push上github,才能測試?

當然不是!我們可以在本地端進行測試,我們需要透過一個叫ngrok的東西。

如果要讓別人的網路可以連到你的伺服器,你的伺服器需要一個Public IP給外網連進去,但如果你今天沒有綁上Public IP可以怎麼做?我們可以透過ngrok將你的localhost對應到ngrok的domain上,別人只要連上那個domain,就可以轉到你的localhost上,ngrok就像是一個轉介站一樣!

首先我們需要下載ngrok到你的電腦,因為我是用Mac,所以我直接用homebrew裝到global上,方便我每次使用。

brew cask install ngrok

接著我們run起來app.py,可以看到localhost開了一個5000 port,是因為上面程式碼是指定5000,這是可以自行更改的。

然後我們把ngrok指向5000。

ngrok http 5000

可以看到ngrok啟動了,並且給了我們一個網址。

我們需要把這個網址複製下來,並到LINE Developer Messaging API的頁籤,將Webhook url換成上面給的網址後面加上/callback,這樣Bot就會知道要先把訊息丟到這裡去處理。

接著我們先停掉app.py,把response丟回去的訊息加個笑臉,並重新跑一次app.py。

# 處理訊息@handler.add(MessageEvent, message=TextMessage)def handle_message(event):message = TextSendMessage(text=(event.message.text + '😊'))line_bot_api.reply_message(event.reply_token, message)

會發現真的變了呢!等到確定結果是你要的,再把程式碼push進github,然後然後然後一定要記得把webhook url改成原本的Heroku callback url,不然你怎麼測都會是失敗的。

Conclusion

LINE Bot真的是一個很方便又很好玩的東西,你只要把LINE Bot接上Database,它不僅僅可以用在企業管理或行銷上,甚至可以變成是你的生活小幫手,只要你coding的能力夠,LINE Bot幾乎沒有什麼做不到的事情,不多說了,你們自己動手做做看吧😊

--

--

Leo Liao | 廖鴻林
Leo Liao

Frontend Engineer | Web Developer,覺得分享經驗就跟潛水一樣,不知不覺在每段旅途中多認識了自己一點