[Python]在自己的Server上整合Dialogflow + Line Messaging API

Posted by John on 2019-02-17
Words 727 and Reading Time 2 Minutes
Viewed Times

新年快樂,我寫故我在,為了證明我還活得好好的所以來寫文章(?)

今天要來講的是當初寫chatbot遇到的一個問題,首先先來簡單科普一下兩個名詞:Diaglogflow和Line Messaging API。

在製作Line的聊天機器人時可以透過網站後端的平台在完全不用寫程式的情況下設定一些關鍵字回覆,但這只限於簡單的關鍵字,如果你打的是同義字但你卻沒有新增這個關鍵字的對應回應,那他就不會觸發。此外,如果需要一些額外的功能,比方說我輸入今日天氣,就回傳我今日天氣的話,就必須寫程式了(你必須有個server收到這指令之後去爬蟲今日天氣,並回傳給client),Line Messaging API就是用來處理訊息收送的API。

Dialogflow是google開發的AI工具,透過一些簡單的設置就可以完成簡單的對話流程。比方說你可以設定飲料和他的關鍵字(果汁、汽水、喝的……),當使用者輸入的句子中包含了這些關鍵字,dialogflow就會回傳你設定好的答案回去。

關於這兩個的細節就不詳述了,網路上隨便找都有一堆很好的教學和介紹文,今天是來講自己開發chatbot時遇到的問題:如果我想要把這兩個工具整合在一起使用該怎麼辦呢?

如果只是單純要整合Line + Dialogflow,並沒有要自己架Server的話,那只要在Dialogflow的Integrations設定即可,只要填上Channel ID、Secret和Access token,這些都可以在Line後端的網站上取得。

螢幕快照 2019-02-17 上午11.02.42

螢幕快照 2019-02-17 上午11.03.00

不過有些情境就需要自己來架Server處理訊息對應的動作,舉個應用的情境,我希望在Line收到訊息後,透過Dialogflow判斷語意,然後在Server上執行對應的爬蟲動作再回傳資料,這時候又該如何串接這兩個平台呢?

問題在於,這兩個平台都會需要使用到webhook,webhook就像是一個郵箱,告訴Line和Dialogflow收到訊息之後要把對應的資訊寄到哪裡去,可是同時使用的話似乎會引發衝突,所以這邊提供我後來解決的方法:

解決方法就是把webhook給Line用就好,所以大致上的Server架構還是跟Line架設Server是一樣的。至於Dialogflow那邊其實他們有提供API(pip install apiai),只要提供Dialogflow帳號的CLIENT_ACCESS_TOKEN就可以透過API查詢該帳號下設置好的intent、action……了,sample code如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
import os.path
import sys
import json
try:
import apiai
except ImportError:
sys.path.append(
os.path.join(os.path.dirname(os.path.realpath(__file__)), os.pardir)
)
import apiai

CLIENT_ACCESS_TOKEN = '' # put your CLIENT_ACCESS_TOKEN here

def dialog_detect(say):
ai = apiai.ApiAI(CLIENT_ACCESS_TOKEN)

request = ai.text_request()

request.lang = 'tw' # optional, default value equal 'en'

request.query = say
response = request.getresponse().read().decode()
result=json.loads(response)

>