iT邦幫忙

2023 iThome 鐵人賽

0
Software Development

跟著 OXXO 一起學 Python系列 第 76

( Day 36.3 ) Python 伺服器串接 Dialogflow

  • 分享至 

  • xImage
  •  

在「使用 Dialogflow 打造聊天機器人」文章裡已經學會使用 Dialogflow 建立聊天機器人,接下來這篇文章將會介紹如何使用 Google Cloud 建立金鑰,讓自己的 Python 伺服器,可以透過 API 串接 Dialogflow。

原文參考:伺服器串接 Dialogflow

建立並下載金鑰 json

建立 Dialogflow 專案後,同時也會在 Google Cloud Platform 裡建立一個專案,前往 Google Cloud PlatForm 並進入該專案。

前往:Google Cloud Platform 控制台

Dialogflow 教學 ( Python ) - 伺服器串接 Dialogflow - 建立一個專案

點選左上角圖示開啟選單,選擇「IAM 與管理」裡的「服務帳戶」。

Dialogflow 教學 ( Python ) - 伺服器串接 Dialogflow - IAM 與管理服務帳戶

如果已經有使用 Dialogflow,會有出現預設的一些服務帳戶,點擊 Dialogflow Integrations 的服務帳戶後方的圖示,選擇「管理金鑰

Dialogflow 教學 ( Python ) - 伺服器串接 Dialogflow - 管理金鑰

進入後新增金鑰,選擇「建立新的金鑰」。

Dialogflow 教學 ( Python ) - 伺服器串接 Dialogflow - 建立新的金鑰

建立金鑰時選擇 json 檔案,將其下載存放到和 python 伺服器執行的檔案同樣的目錄 ( 這樣就不用額外處理檔案路徑 )

Dialogflow 教學 ( Python ) - 伺服器串接 Dialogflow -  下載金鑰 json 檔案

Dialogflow 教學 ( Python ) - 伺服器串接 Dialogflow - 存放金鑰 json

存檔後可以使用編輯器打開查看金鑰 json,內容是 token 之類的資訊。

{
  "type": "service_account",
  "project_id": "XXX",
  "private_key_id": "XXX",
  "private_key": "XXXXXXXX",
  "client_email": "XXXXX@appspot.gserviceaccount.com",
  "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 教學 ( Python ) - 伺服器串接 Dialogflow - 本機環境

串接 Dialogflow ( Cloud Functions )

如果使用 Google Cloud Functions 作為 Python 運作的後台,可以參考「使用 Google Cloud Functions」文章,新增並啟用一個 Cloud Functions 程式編輯環境,基本設定如下圖所示:

Dialogflow 教學 ( Python ) - Dialogflow 串接 Webhook - 新增並啟用 Cloud Functions

進入編輯畫面後,環境執行階段選擇 Python ( 3.9 ),進入點改成 webhook ( 可自訂名稱,之後的程式碼裡也要使用同樣的名稱 )。

Dialogflow 教學 ( Python ) - Dialogflow 串接 Webhook - Cloud Functions 環境執行階段

在左側點擊 + 號,新增一個 .json 的檔案 ( 檔名自訂 ),內容就是剛剛下載的金鑰 json 檔案內容。

Dialogflow 教學 ( Python ) - 伺服器串接 Dialogflow - Cloud Functions 新增一個 json 的檔案

接著點擊 requirement.txt,新增下方函式庫。

google-cloud-dialogflow

Dialogflow 教學 ( Python ) - 伺服器串接 Dialogflow - Cloud Functions requirement.txt 新增函式庫

最後輸入下方的程式碼,完成後點擊下方的「部署」,就會將程式部署到 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 教學 ( Python ) - 伺服器串接 Dialogflow - Cloud Functions 部署程式

打開瀏覽器,在網址列輸入網址,後方加上輸入的文字參數,執行後就可以看見透過 Dialogflow 的回應訊息。

Dialogflow 教學 ( Python ) - 伺服器串接 Dialogflow - Cloud Functions 看見透過 Dialogflow 的回應訊息

小結

有別於 Dialogflow 串接 Webhook 的方式,如果可以使用伺服器串接 Dialogflow,就能更發揮出伺服器的優勢,例如可以參考「LINE BOT 教學」系列文章,將 LINE BOT 完整結合 Dialogflow,做出各種有趣的應用。

更多教學

大家好,我是 OXXO,是個即將邁入中年的斜槓青年,我有個超過一千篇教學的 STEAM 教育學習網,有興趣可以參考下方連結呦~ ^_^


上一篇
( Day 36.2 ) Python Dialogflow 串接 Webhook
下一篇
( Day 37.1 ) Python 建立 Firebase RealTime Database
系列文
跟著 OXXO 一起學 Python101
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言