伺服器串接 Dialogflow
在「使用 Dialogflow 打造聊天機器人」文章裡已經學會使用 Dialogflow 建立聊天機器人,接下來這篇文章將會介紹如何使用 Google Cloud 建立金鑰,讓自己的 Python 伺服器,可以透過 API 串接 Dialogflow。
快速導覽:
建立並下載金鑰 json
建立 Dialogflow 專案後,同時也會在 Google Cloud Platform 裡建立一個專案,前往 Google Cloud PlatForm 並進入該專案。
點選左上角圖示開啟選單,選擇「IAM 與管理」裡的「服務帳戶」。
如果已經有使用 Dialogflow,會有出現預設的一些服務帳戶,點擊 Dialogflow Integrations 的服務帳戶後方的圖示,選擇「管理金鑰」
進入後新增金鑰,選擇「建立新的金鑰」。
建立金鑰時選擇 json 檔案,將其下載存放到和 python 伺服器執行的檔案同樣的目錄 ( 這樣就不用額外處理檔案路徑 )
存檔後可以使用編輯器打開查看金鑰 json,內容是 token 之類的資訊。
{
"type": "service_account",
"project_id": "XXX",
"private_key_id": "XXX",
"private_key": "XXXXXXXX",
"client_email": "[email protected]",
"client_id": "XXXXXXX",
"auth_uri": "https://accounts.google.com/o/oauth2/auth",
"token_uri": "https://oauth2.googleapis.com/token",
"auth_provider_x509_cert_url": "https://www.googleapis.com/oauth2/v1/certs",
"client_x509_cert_url": "https://www.googleapis.com/robot/v1/metadata/x509/XXXXX%40appspot.gserviceaccount.com"
}
串接 Dialogflow ( 本機環境 )
要使用伺服器串接 Dialogflow,必須要先安裝 Google Cloud 相關的函式庫,輸入指令安裝 google-cloud-dialogflow。
注意,因 Google Dialogflow 函式庫無法運行在 Python 3.7 的環境,所以如果遇到無法安裝的情形,請先將 Python 升級為 3.9 以上版本,同理,因為 Colab 預設 Python 3.7,也就無法正確安裝和執行 Google Dialogflow 函式庫。
pip install google-cloud-dialogflow
參考「使用 Anaconda」或「使用 Python 虛擬環境」文章,選擇其中一種作為本機架設環境,接著參考下方的程式碼,搭配「Flask 函式庫」文章,就能將本機伺服器,串接 Dialogflow,詳細說明寫在程式碼的註解中。
import os
import google.cloud.dialogflow_v2 as dialogflow
from flask import Flask, request
os.environ["GOOGLE_APPLICATION_CREDENTIALS"] = 'dialogflow_key.json' # 剛剛下載的金鑰 json
project_id = 'XXXX' # dialogflow 的 project id
language = 'zh-TW' # 語系
session_id = 'oxxostudio' # 自訂義的 session id
def dialogflowFn(text):
session_client = dialogflow.SessionsClient() # 使用 Token 和 dialogflow 建立連線
session = session_client.session_path(project_id, session_id) # 連接對應專案
text_input = dialogflow.types.TextInput(text=text, language_code=language) # 設定語系
query_input = dialogflow.types.QueryInput(text=text_input) # 根據語系取得輸入內容
try:
response = session_client.detect_intent(session=session, query_input=query_input) # 連線 Dialogflow 取得回應資料
print("input:", response.query_result.query_text)
print("intent:", response.query_result.intent.display_name)
print("reply:", response.query_result.fulfillment_text)
return response.query_result.fulfillment_text # 回傳回應的文字
except:
return 'error'
app = Flask(__name__)
@app.route("/")
def home():
text = request.args.get('text') # 取得輸入的文字
reply = dialogflowFn(text) # 取得 Dialogflow 回應的文字
return reply
app.run()
程式執行後,打開瀏覽器,在網址列輸入伺服器產生的網址,後方加上輸入的文字參數,執行後就可以看見透過 Dialogflow 的回應訊息。
串接 Dialogflow ( Cloud Functions )
如果使用 Google Cloud Functions 作為 Python 運作的後台,可以參考「使用 Google Cloud Functions」文章,新增並啟用一個 Cloud Functions 程式編輯環境,基本設定如下圖所示:
進入編輯畫面後,環境執行階段選擇 Python ( 3.9 ),進入點改成 webhook ( 可自訂名稱,之後的程式碼裡也要使用同樣的名稱 )。
在左側點擊 + 號,新增一個 .json 的檔案 ( 檔名自訂 ),內容就是剛剛下載的金鑰 json 檔案內容。
接著點擊 requirement.txt,新增下方函式庫。
google-cloud-dialogflow
最後輸入下方的程式碼,完成後點擊下方的「部署」,就會將程式部署到 Cloud Functions 裡。
import os
import google.cloud.dialogflow_v2 as dialogflow
os.environ["GOOGLE_APPLICATION_CREDENTIALS"] = 'dialogflow_key.json' # 金鑰 json
project_id = 'XXXX' # dialogflow 的 project id
language = 'zh-TW' # 語系
session_id = 'oxxostudio' # 自訂義的 session id
def dialogflowFn(text):
session_client = dialogflow.SessionsClient() # 使用 Token 和 dialogflow 建立連線
session = session_client.session_path(project_id, session_id) # 連接對應專案
text_input = dialogflow.types.TextInput(text=text, language_code=language) # 設定語系
query_input = dialogflow.types.QueryInput(text=text_input) # 根據語系取得輸入內容
try:
response = session_client.detect_intent(session=session, query_input=query_input) # 連線 Dialogflow 取得回應資料
print("input:", response.query_result.query_text)
print("intent:", response.query_result.intent.display_name)
print("reply:", response.query_result.fulfillment_text)
return response.query_result.fulfillment_text # 回傳回應的文字
except:
return 'error'
def webhook(request):
try:
#req = request.get_json()
text = request.args.get('text')
return dialogflowFn(text)
except:
print(request.args)
如果部署順利完成,就會看見該專案前方出現一個綠色打勾圖示,這時切換到「觸發條件」頁籤,就可以看到所需要的 Webhook 網址。
打開瀏覽器,在網址列輸入網址,後方加上輸入的文字參數,執行後就可以看見透過 Dialogflow 的回應訊息。
小結
有別於 Dialogflow 串接 Webhook 的方式,如果可以使用伺服器串接 Dialogflow,就能更發揮出伺服器的優勢,例如可以參考「LINE BOT 教學」系列文章,將 LINE BOT 完整結合 Dialogflow,做出各種有趣的應用。
意見回饋
如果有任何建議或問題,可傳送「意見表單」給我,謝謝~