Python網頁設計-Django使用筆記(四):LINE聊天機器人(部署至Heroku)
以前有搭配IFTTT開發過2個LINE機器人,也曾經用定時發送指定訊息的方式,不過都只限於開發者自身帳號,本文將完成一個「所有人」都能聊天的「聊天機器人」
IFTTT
PM2.5的Line機器人:使用Python + IFTTT 傳送最新PM2.5數值
匯率的Line機器人:使用Python + IFTTT 傳送最新匯率資訊
定時發送指定訊息
2020年4月26日09:51更新
在Heroku上排程Python程式執行
2020年2月22日11:30更新
Linebot官方SDK的一些功能介紹
2020年1月16日17:54更新
Debug聊天機器人Bug最好的方式就是
1)先在本地端測試,是不是資料型態的問題
2)Push到Heroku後,到Heroku網站,點擊More→View Logs,透過log來進行Debug
2020年1月16日19:23更新
弄壞原本的機器人怎麼辦?首先,先回到Heroku網站上開啟我們的APP專案頁面,在Activity中,Roll back回正常的版本。接著,到電腦上開一個全新資料夾(新增資料夾)heroku git:clone -a appNAME
git reset --hard c74581c5 #c74581c5是正常運作版,此時會跑到正常的程式碼
git add .
git commit -m 'someMesseage'
git push heroku master -f #-f參數強制push到master,忽略那些壞掉的版本
在閱讀本文之前,請先確保已經閱讀過下面2篇文章,了解Django的基本運作狀況。
先備知識
Messaging API:LINE 的Channel機器人的名稱,如果要讓所有人都能與我們開發的機器人聊天,就需要申請這個API。
Use webhook:預設為關閉,請將它打開。
Webhook URL:讓LINE把收到的訊息傳給LINE使用者的URL,本專案設計成 https://XXXXXX.herokuapp.co/echobot/callback/
,在稍後的設定中填入。
Auto-reply messages:請設定為Disabled,回覆訊息的功能將交給程式處理。
Heroku:用來保存並維持我們聊天機器人運作的地方,讀者可以先自己註冊一個帳號並且下載Heroku的CLI。
如果沒有裝過git的人,也請先安裝git
基礎LINE Bot設定
請先參考以下文章取得Channel access token和Channel secret並且開啟webhook功能
Django實作
(選)虛擬環境
$ conda create -n LINE-BOT python=3.6
$ activate LINE-BOT
安裝套件
$ pip install Django
$ pip install line-bot-sdk
建立echobot項目
$ django-admin startproject django_line_bot
$ cd django_line_bot
$ python manage.py startapp echobot
django_line_bot/urls.py
from django.contrib import admin
from django.urls import include, path
urlpatterns = [
path('admin/', admin.site.urls),
path('echobot/', include('echobot.urls')),
]
echobot/urls.py
from django.urls import path
from . import views
urlpatterns = [
path('callback/', views.callback, name='callback'),
]
echobot/views.py
from django.conf import settings
from django.http import HttpRequest, HttpResponse, HttpResponseBadRequest
from django.views.decorators.csrf import csrf_exempt
from linebot import LineBotApi, WebhookHandler
from linebot.exceptions import InvalidSignatureError
from linebot.models import MessageEvent, TextMessage, TextSendMessage
#請分別輸入自己的CHANNEL_ACCESS_TOKEN和CHANNEL_SECRET,可在此文中學習如何取得line_bot_api = LineBotApi('CHANNEL_ACCESS_TOKEN')
handler = WebhookHandler('CHANNEL_SECRET')
@csrf_exempt
def callback(request: HttpRequest) -> HttpResponse:
if request.method == "POST":
# get X-Line-Signature header value
signature = request.META['HTTP_X_LINE_SIGNATURE']
# get request body as text
body = request.body.decode('utf-8')
# handle webhook body
try:
handler.handle(body, signature)
except InvalidSignatureError:
return HttpResponseBadRequest()
return HttpResponse()
else:
return HttpResponseBadRequest()
@handler.add(MessageEvent, message=TextMessage)
def message_text(event: MessageEvent):
line_bot_api.reply_message(
event.reply_token,
TextSendMessage(text=event.message.text)
)
部屬到Heroku的前置作業
Heroku介紹請參考Wiki
其實Heroku跟我之前測試過的GAE(Google App Engine)相當的類似
專案目錄下,建立requirements.txt,讓Heroku知道需要安裝哪些套件
$ pip freeze > requirements.txtasgiref==3.2.3
certifi==2019.11.28
chardet==3.0.4
Django==3.0.2
future==0.18.2
idna==2.8
line-bot-sdk==1.15.0
pytz==2019.3
requests==2.22.0
sqlparse==0.3.0
urllib3==1.25.7
gunicorn == 19.7.1
six
建立runtime.txt
讓Heroku知道運行的Python版本
python-3.7.6
建立Procfile
請注意本檔案沒有副檔名,只有Procfile這個單字而已。主要是讓Heroku知道程式該怎麼去執行。以下內容代表著到django_line_bot django資料夾底下去執行wsgi.py的這個程式
web: gunicorn --pythonpath django_line_bot django_line_bot.wsgi
設定django_line_bot/settings.py
DEBUG = False #要改成False,不然會有漏洞ALLOWED_HOSTS = ['*']INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'echobot',
]
Heroku CLI初始化
開啟Heroku網站登入帳號-> New -> Create new app,並且為APP取名。
此時回到電腦的資料夾,並且回到目錄(requirements.txt、runtime.txt、Procfile都在的位置)
$ heroku login #登入heroku
$ git init #設定git
$ heroku git:remote -a your-app-name #填入在Heroku中設定好的名字
$ heroku config:set DISABLE_COLLECTSTATIC=1
部署
$ git add .
$ git commit -am "make it better"
$ git push heroku master
這時候LINE Bot已經上傳成功,我們要到LINE Channel的後台進行設定
回到自己設定的Channel當中,點選Messaging API。
- 確認 Use webhook已被開啟
- Webhook URL的網址請填入:
XXXX的部分就是Heroku專案的名稱,將它取代即可
https://XXXXXXXXXXXXXX.herokuapp.com/echobot/callback/
測試機器人運作
使用手機掃描螢幕上出現的QR code->加入好友->與機器人聊天
或者也可以直接輸入聊天機器人的LINE ID (Bot basic ID的部分)
# 沒有意外的話,我們輸入123,機器人也會回傳123。
# 也就是說,我們的聊天機器人已經可以正常運作了!