Python網頁設計-Django使用筆記(四):LINE聊天機器人(部署至Heroku)

以前有搭配IFTTT開發過2個LINE機器人,也曾經用定時發送指定訊息的方式,不過都只限於開發者自身帳號,本文將完成一個「所有人」都能聊天的「聊天機器人」

IFTTT

PM2.5的Line機器人:使用Python + IFTTT 傳送最新PM2.5數值

匯率的Line機器人:使用Python + IFTTT 傳送最新匯率資訊

定時發送指定訊息

LINE天氣概況機器人:使用Python傳送氣象局最新天氣概況

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

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 install freeze > requirements.txt

asgiref==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。

  1. 確認 Use webhook已被開啟
  2. Webhook URL的網址請填入:
    XXXX的部分就是Heroku專案的名稱,將它取代即可
https://XXXXXXXXXXXXXX.herokuapp.com/echobot/callback/

測試機器人運作

使用手機掃描螢幕上出現的QR code->加入好友->與機器人聊天

或者也可以直接輸入聊天機器人的LINE ID (Bot basic ID的部分)

# 沒有意外的話,我們輸入123,機器人也會回傳123。
# 也就是說,我們的聊天機器人已經可以正常運作了!

本文的Github Repo

參考資料

Written by

Machine Learning / Deep Learning / Python / Flutter cakeresume.com/yanwei-liu

Get the Medium app

A button that says 'Download on the App Store', and if clicked it will lead you to the iOS App store
A button that says 'Get it on, Google Play', and if clicked it will lead you to the Google Play store