LINE Bot的自動化回覆訊息功能,普遍的應用在日常生活中,尤其是服務的提供者,都會利用LINE Bot來推播最新消息或回覆客戶的問題等。
隨著各種不同類型的需求增加,有時就會需要更多的LINE Bot來提供服務,而在開發的過程中,普遍都是一個專案包含一個LINE Bot,就會造成有多個專案需要維護,有沒有辦法在一個專案中,包含多個LINE Bot呢?
答案是有的,本文就來和大家分享,如何有效利用Django框架的架構,在既有的LINE Bot專案忠,增加額外的LINE Bot,並且保有各自的獨立性。其中的實作重點包含:
- LINE Bot憑證設定
- LINE Bot網址設定
- LINE Bot開發
- LINE Bot部署
一、LINE Bot憑證設定
開始之前,大家一定要先參考[Python+LINE Bot教學]6步驟快速上手LINE Bot機器人文章,建立一個LINE Bot,並且依照[Python+LINE Bot教學]快速掌握LINE Bot部署至Heroku雲端平台的重點文章部署到Heroku雲端平台後,再來實作本文的內容唷。
如果以上都完成後,為了模擬多個LINE Bot的整合,所以比照同樣的方式,在LINE Developers網站新增第二個LINE Bot,如下圖:
$ python manage.py startapp triplinebot
這時候專案的檔案結構如下圖:
開啟settings.py檔案,將第二個Django(LINE Bot)應用程式(APP)加入到專案主程式中,如下範例第9、10行:
INSTALLED_APPS = [ 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', 'foodlinebot.apps.FoodlinebotConfig', 'triplinebot.apps.TriplinebotConfig', ]
並且,設定第二個LINE Bot的Messaging API憑證,如下範例:
#既有的LINE Bot(foodlinebot)憑證 LINE_CHANNEL_ACCESS_TOKEN = '***' LINE_CHANNEL_SECRET = '***' #第二個LINE Bot(triplinebot)憑證 LINE_TRIP_ACCESS_TOKEN = '***' LINE_TRIP_SECRET = '***'
PS.這邊的憑證變數名稱可以自行命名唷。
二、LINE Bot網址設定
憑證都設定完成後,要讓用戶能夠存取LINE Bot,就需要設定網址,所以,在第二個LINE Bot(triplinebot)應用程式(APP)下,新增urls.py檔案,來自訂它的網址,如下範例:
from django.urls import path from . import views urlpatterns = [ path('callback', views.callback) ]
接著,將這第二個LINE Bot(triplinebot)網址加入到專案主程式的urls.py檔案中,如下範例:
from django.contrib import admin from django.urls import path, include urlpatterns = [ path('admin/', admin.site.urls), path('foodlinebot/', include('foodlinebot.urls')), #既有的LINE Bot(foodlinebot)網址 path('triplinebot/', include('triplinebot.urls')) #第二個LINE Bot(triplinebot)網址 ]
這時候,第二個LINE Bot(triplinebot)的網址結構就會是專案主程式的網址「triplinebot/」,加上(include)應用程式(APP)的urls.py檔案中所定義的網址「callback」,結果為「https://domain/triplinebot/callback」。
三、LINE Bot開發
在剛剛的LINE Bot應用程式(APP)網址檔案(urls.py)中,定義了用戶請求網址後所要執行的Django檢視函式(views)為callback,所以,接下來就要建立其中的執行內容。
開啟views.py檔案,引用Django與LINE Bot的相關模組,如下範例:
from django.shortcuts import render from django.http import HttpResponse, HttpResponseBadRequest, HttpResponseForbidden from django.views.decorators.csrf import csrf_exempt from django.conf import settings from linebot import LineBotApi, WebhookParser from linebot.exceptions import InvalidSignatureError, LineBotApiError from linebot.models import MessageEvent, TextSendMessage
接著,利用settings模組存取settings.py檔案中所設定的LINE Bot憑證,來進行API驗證,如下範例第10、11行:
from django.shortcuts import render from django.http import HttpResponse, HttpResponseBadRequest, HttpResponseForbidden from django.views.decorators.csrf import csrf_exempt from django.conf import settings from linebot import LineBotApi, WebhookParser from linebot.exceptions import InvalidSignatureError, LineBotApiError from linebot.models import MessageEvent, TextSendMessage line_bot_api = LineBotApi(settings.LINE_TRIP_ACCESS_TOKEN) parser = WebhookParser(settings.LINE_TRIP_SECRET)
而既有的LINE Bot(foodlinebot) API驗證,如下範例第10、11行:
from django.shortcuts import render from django.http import HttpResponse, HttpResponseBadRequest, HttpResponseForbidden from django.views.decorators.csrf import csrf_exempt from django.conf import settings from linebot import LineBotApi, WebhookParser from linebot.exceptions import InvalidSignatureError, LineBotApiError from linebot.models import MessageEvent, TextSendMessage line_bot_api = LineBotApi(settings.LINE_CHANNEL_ACCESS_TOKEN) parser = WebhookParser(settings.LINE_CHANNEL_SECRET)
這樣的比較,就可以瞭解到LINE Bot API中所傳入的憑證,可以透過settings模組來存取相應的值來進行驗證。
接下來,新增callback檢視函式(views),如下範例:
from django.shortcuts import render from django.http import HttpResponse, HttpResponseBadRequest, HttpResponseForbidden from django.views.decorators.csrf import csrf_exempt from django.conf import settings from linebot import LineBotApi, WebhookParser from linebot.exceptions import InvalidSignatureError, LineBotApiError from linebot.models import MessageEvent, TextSendMessage line_bot_api = LineBotApi(settings.LINE_TRIP_ACCESS_TOKEN) parser = WebhookParser(settings.LINE_TRIP_SECRET) # Create your views here. @csrf_exempt def callback(request): if request.method == 'POST': signature = request.META['HTTP_X_LINE_SIGNATURE'] body = request.body.decode('utf-8') try: events = parser.parse(body, signature) except InvalidSignatureError: return HttpResponseForbidden() except LineBotApiError: return HttpResponseBadRequest() for event in events: if isinstance(event, MessageEvent): line_bot_api.reply_message( event.reply_token, TextSendMessage(text=event.message.text) ) return HttpResponse() else: return HttpResponseBadRequest()
為了讓教學簡單易懂,其中的實作,就是回覆用戶端所傳入的相同訊息,詳細的程式碼解說可以參考[Python+LINE Bot教學]6步驟快速上手LINE Bot機器人文章。
四、LINE Bot部署
LINE Bot開發完成後,就可以利用Heroku CLI部署到Heroku雲端平台,如下指令:
$ git add . #加入所有變更的程式碼檔案到本地端Git Repository
$ git commit -m "your_message" #儲存到硬碟中
$ heroku git:remote -a foodielinebot #將Heroku雲端平台的Git Repository切換到既有的LINE Bot應用程式
$ git push heroku master #推送到Heroku雲端平台的LINE Bot應用程式Git Repository
以上的指令,就是將剛剛我們所開發的第二個LINE Bot推送到Heroku雲端平台,既有的LINE Bot Git Repository,也就完成了二個LINE Bot原始碼的整合了。
最後,前往LINE Developers網站,設定兩個LINE Bot的Webhook URL,如下圖:
設定完成,就可以拿起手機分別對這兩個LINE Bot發送訊息了,如下圖:
五、小結
擁有多個LINE Bot來提供服務相信是實務上很常會遇到的情況,而能夠統一在一個Django專案中建置多個LINE Bot,除了可以提升未來的維護性外,也比較容易於集中管理,希望透過本文的實作,讓大家有能力利用Django專案的架構,來整合多個LINE Bot服務。
留言
張貼留言