403 IAM 权限尽管向代理授予管理员权限以授予列出意图的权限
403 IAM permission despite giving admin permissions to the agent to give permissions to list intent
我想使用我用 Dialogflow 创建的聊天机器人作为我网站的主页。然而它告诉我 google.api_core.exceptions.PermissionDenied: 403 IAM permission 'dialogflow.sessions.detectIntent' on 'projects/pollingagent-jnscpa/agent' denied.
试图与他交谈时。
我按照 this tutorial 了解如何使用 Flask 进行操作,但我已准备好转向最简单的解决方案。
我从 a similar question 的答案中尝试了以下内容:
- 在 Dialogflow 的控制台中,转到设置 ⚙ > 在常规选项卡下,有项目 ID 部分带有 Google Cloud link 打开 Google Cloud 控制台 > 打开Google云。
- 在 google 云中,转到“成员”选项卡下的“IAM 管理”>“IAM”。找到我的代理人的名字,然后点击编辑。
- 向代理授予管理员权限以授予列出意图的权限。
所以我不知道,也许问题出在我的 index.py?
from flask import Flask, request, jsonify, render_template
import os
import dialogflow
app = Flask(__name__)
@app.route('/')
def index():
return render_template('index.html')
def detect_intent_texts(project_id, session_id, text, language_code):
session_client = dialogflow.SessionsClient()
session = session_client.session_path(project_id, session_id)
if text:
text_input = dialogflow.types.TextInput(
text=text, language_code=language_code)
query_input = dialogflow.types.QueryInput(text=text_input)
response = session_client.detect_intent(
session=session, query_input=query_input)
return response.query_result.fulfillment_text
@app.route('/send_message', methods=['POST'])
def send_message():
message = request.form['message']
project_id = os.getenv('DIALOGFLOW_PROJECT_ID')
fulfillment_text = detect_intent_texts(project_id, "unique", message, 'en')
response_text = { "message": fulfillment_text }
return jsonify(response_text)
# run Flask app
if __name__ == "__main__":
app.run()
您没有在代码中设置凭据,是否为凭据设置了环境变量?
GOOGLE_APPLICATION_CREDENTIALS
变量是最简单的方法,该变量的值设置为您下载的服务帐户密钥的路径。
如果需要,您也可以在代码中执行此操作,因此它不会影响您环境的其余部分,例如:
os.environ["GOOGLE_APPLICATION_CREDENTIALS"] = 'path/to/private_key.json'
您可能面临以下两个问题之一:
- 您可能没有正确设置 json 凭据文件的路径。您可以将其设置为环境变量或执行
os.environ['GOOGLE_APPLICATION_CREDENTIALS']="/path/to/project_name-xxxxxxxx.json"
- 转到dialogflow主页,然后点击显示的位置
然后单击 PROJECT_ID link 转到您的 google 云控制台
进入 google 云控制台后,如图所示打开侧边菜单面板,然后转到 IAM & Admin > IAM
您应该会看到所有成员,如果角色未设置为所有者,则单击编辑图标并将角色更改为所有者
通过以下步骤,我能够运行我的以下片段
from google.cloud import dialogflow
import random
import string
import os
os.environ['GOOGLE_APPLICATION_CREDENTIALS'] = "\path\to\<project_name>-xxxxxx.json"
x = ''.join(random.choice(string.ascii_uppercase + string.ascii_lowercase + string.digits) for _ in range(16))
client_session = dialogflow.SessionsClient()
session = client_session.session_path("<project_name>", x)
print(session)
text = input("Please enter a text : ")
text_input = dialogflow.TextInput(text=text, language_code='en')
query_input = dialogflow.QueryInput(text=text_input)
response = client_session.detect_intent(
request={'session': session, 'query_input': query_input})
print('=' * 20)
print('Query text: {}'.format(response.query_result.query_text))
print('Detected intent: {} (confidence: {})\n'.format(
response.query_result.intent.display_name,
response.query_result.intent_detection_confidence))
print('Fulfillment text: {}\n'.format(response.query_result.fulfillment_text))
我想使用我用 Dialogflow 创建的聊天机器人作为我网站的主页。然而它告诉我 google.api_core.exceptions.PermissionDenied: 403 IAM permission 'dialogflow.sessions.detectIntent' on 'projects/pollingagent-jnscpa/agent' denied.
试图与他交谈时。
我按照 this tutorial 了解如何使用 Flask 进行操作,但我已准备好转向最简单的解决方案。 我从 a similar question 的答案中尝试了以下内容:
- 在 Dialogflow 的控制台中,转到设置 ⚙ > 在常规选项卡下,有项目 ID 部分带有 Google Cloud link 打开 Google Cloud 控制台 > 打开Google云。
- 在 google 云中,转到“成员”选项卡下的“IAM 管理”>“IAM”。找到我的代理人的名字,然后点击编辑。
- 向代理授予管理员权限以授予列出意图的权限。
所以我不知道,也许问题出在我的 index.py?
from flask import Flask, request, jsonify, render_template
import os
import dialogflow
app = Flask(__name__)
@app.route('/')
def index():
return render_template('index.html')
def detect_intent_texts(project_id, session_id, text, language_code):
session_client = dialogflow.SessionsClient()
session = session_client.session_path(project_id, session_id)
if text:
text_input = dialogflow.types.TextInput(
text=text, language_code=language_code)
query_input = dialogflow.types.QueryInput(text=text_input)
response = session_client.detect_intent(
session=session, query_input=query_input)
return response.query_result.fulfillment_text
@app.route('/send_message', methods=['POST'])
def send_message():
message = request.form['message']
project_id = os.getenv('DIALOGFLOW_PROJECT_ID')
fulfillment_text = detect_intent_texts(project_id, "unique", message, 'en')
response_text = { "message": fulfillment_text }
return jsonify(response_text)
# run Flask app
if __name__ == "__main__":
app.run()
您没有在代码中设置凭据,是否为凭据设置了环境变量?
GOOGLE_APPLICATION_CREDENTIALS
变量是最简单的方法,该变量的值设置为您下载的服务帐户密钥的路径。
如果需要,您也可以在代码中执行此操作,因此它不会影响您环境的其余部分,例如:
os.environ["GOOGLE_APPLICATION_CREDENTIALS"] = 'path/to/private_key.json'
您可能面临以下两个问题之一:
- 您可能没有正确设置 json 凭据文件的路径。您可以将其设置为环境变量或执行
os.environ['GOOGLE_APPLICATION_CREDENTIALS']="/path/to/project_name-xxxxxxxx.json"
- 转到dialogflow主页,然后点击显示的位置
然后单击 PROJECT_ID link 转到您的 google 云控制台
进入 google 云控制台后,如图所示打开侧边菜单面板,然后转到 IAM & Admin > IAM
您应该会看到所有成员,如果角色未设置为所有者,则单击编辑图标并将角色更改为所有者
通过以下步骤,我能够运行我的以下片段
from google.cloud import dialogflow
import random
import string
import os
os.environ['GOOGLE_APPLICATION_CREDENTIALS'] = "\path\to\<project_name>-xxxxxx.json"
x = ''.join(random.choice(string.ascii_uppercase + string.ascii_lowercase + string.digits) for _ in range(16))
client_session = dialogflow.SessionsClient()
session = client_session.session_path("<project_name>", x)
print(session)
text = input("Please enter a text : ")
text_input = dialogflow.TextInput(text=text, language_code='en')
query_input = dialogflow.QueryInput(text=text_input)
response = client_session.detect_intent(
request={'session': session, 'query_input': query_input})
print('=' * 20)
print('Query text: {}'.format(response.query_result.query_text))
print('Detected intent: {} (confidence: {})\n'.format(
response.query_result.intent.display_name,
response.query_result.intent_detection_confidence))
print('Fulfillment text: {}\n'.format(response.query_result.fulfillment_text))