服务器串接 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,做出各种有趣的应用。
微信扫码关注
抖音扫码关注