0%

Line Chatbot - 前置作業

聊天機器人一直存在我的生活周遭
常常想著哪天我也自己來玩一個看看
所以就在空閒的時候做了一個
用來尋找附近美食的機器人
順便開了一個系列紀錄一下的過程

P.S.範例截的圖是另外一個做失敗的機器人但我又不想重新截圖,所以就用著了,但做法都是一樣的只是機器人名字不一樣而已

前置作業

開發環境與工具

  1. Python (Anaconda)
  2. VS Code
  3. Ngork

Line方面設定

先到Line developer註冊 → Create Provider → 建立Messaging API

建立步驟

Anaconda Env

建議可以使用虛擬環境以保持套件的乾淨

1
2
3
4
conda create --name=django-env python=3.6.6  #建立環境
conda activate django-env #啟動環境
conda deactivate #關閉環境

Django

  1. 安裝套件
1
2
3
4
pip install django
pip install line-bot-sdk
pip install beautifulsoup4
pip install requests
  1. 建立Django專案
1
2
3
4
5
django-admin startproject mylinebot .  #建立Django專案

python manage.py startapp weatherlinebot #建立Django應用程式(App)

python manage.py migrate #執行資料遷移(Migration)

(1) 在專案主程式的settings.py中加上line的access config

1
2
3
# Line Chat Bot Settings
LINE_CHANNEL_ACCESS_TOKEN = 'AucguavwbkWCxY5FbQCwGhx2F6E7slhtxra4cKNgiXnKYEUcTCUe7b1kR09yKVrbtIYNqNw6jOTbTKrOVpK6ZKX0qHqbOsamrCdKJ4e+bSIiHmPppo2QljFEhZt3Unexv4h4A0IkNR9mo9KC95iC5gdB04t89/1O/w1cDnyilFU='
LINE_CHANNEL_SECRET = '32689659c38a00a77e0adbae0eedab36'

(2) 在INSTALLED_APPS的地方加上自己的APP

  1. 開發Line bot應用程式

(1) 在應用程式下的views.py加上下面程式碼

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
from django.shortcuts import render

# Create your views here.
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裡定義過
line_bot_api = LineBotApi(settings.LINE_CHANNEL_ACCESS_TOKEN)
parser = WebhookParser(settings.LINE_CHANNEL_SECRET)


@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()

其中line_bot_api.reply_message()就是處理回傳的部分,也可以像下面改成這樣:

(2) 設定連結網址:在APP應用程式下新增urls.py

1
2
3
4
5
6
from django.urls import path
from . import views

urlpatterns = [
path('callback', views.callback)
]

(3) 在專案主程式下的urls.py加入APP應用程式的連結網址

1
2
3
4
5
6
7
8
from django.contrib import admin
from django.urls import path
from django.conf.urls import include

urlpatterns = [
path('admin/', admin.site.urls),
path('weatherlinebot/', include('weatherlinebot.urls')) #包含應用程式的網址
]
  1. 開啟連線

(1) Ngrok本地port對外公開

1
ngrok http 8000 #Django在local運行的port

(2) 把網域填到APP應用程式下settings.py的ALLOWED_HOSTS中 (或者是測試時直接放一個*允許所有host)

(3) 執行Line bot的APP

1
python manage.py runserver

(4) 設定Line Bot的webhook(訂閱事件)

(5) 打開Use webhook

(7) 把下面的Auto-reply messages的Enable關閉

  1. 掃描QR code加入好友後的結果