Google CloudDialogflow意图检测Node.js示例不起作用

时间:2018-09-19 02:32:21

标签: javascript node.js api google-cloud-platform dialogflow

我正在尝试与nodejs实现非常简单的dialogflow代理集成。

这是我到目前为止所做的

  • 我遵循了Intent detection中的代码
  • 我将服务帐户私钥文件.json添加到了服务器中。
  • 我将环境变量GOOGLE_APPLICATION_CREDENTIALS与我的.json私钥文件的路径一起添加了。

这是我现在要运行的代码:

require('dotenv').config()
const projectId = 'gg-chatbot-216808'; 
const sessionId = 'quickstart-session-id';
const query = 'hello';
const languageCode = 'en-US';

// Instantiate a DialogFlow client.
const dialogflow = require('dialogflow');
const sessionClient = new dialogflow.SessionsClient();

// Define session path
const sessionPath = sessionClient.sessionPath(projectId, sessionId);

// The text query request.
const request = {
    session: sessionPath,
    queryInput: {
        text: {
            text: query,
            languageCode: languageCode,
        },
    },
};

// This prints the private key path correctly.
console.log(process.env.GOOGLE_APPLICATION_CREDENTIALS);

// Send request and log result
sessionClient
    .detectIntent(request)
    .then(responses => {
        console.log('Detected intent');
        const result = responses[0].queryResult;
        console.log(`  Query: ${result.queryText}`);
        console.log(`  Response: ${result.fulfillmentText}`);
        if (result.intent) {
            console.log(`  Intent: ${result.intent.displayName}`);
        } else {
            console.log(`  No intent matched.`);
        }
    })
    .catch(err => {
        console.error('ERROR:', err);
    });

然后我在运行此文件时在控制台中收到此错误

Auth error:Error: invalid_user: Robot is disabled.
ERROR: { Error: 14 UNAVAILABLE: Getting metadata from plugin failed with error: invalid_user: Robot is disabled.
    at Object.exports.createStatusError (/var/www/html/google_auth/node_modules/grpc/src/common.js:87:15)
    at Object.onReceiveStatus (/var/www/html/google_auth/node_modules/grpc/src/client_interceptors.js:1188:28)
    at InterceptingListener._callNext (/var/www/html/google_auth/node_modules/grpc/src/client_interceptors.js:564:42)
    at InterceptingListener.onReceiveStatus (/var/www/html/google_auth/node_modules/grpc/src/client_interceptors.js:614:8)
    at callback (/var/www/html/google_auth/node_modules/grpc/src/client_interceptors.js:841:24)
  code: 14,
  metadata: Metadata { _internal_repr: {} },
  details: 'Getting metadata from plugin failed with error: invalid_user: Robot is disabled.' }

2 个答案:

答案 0 :(得分:0)

我的角度机器人也遇到了类似的问题。

我所做的是,我没有使用json文件中的google_credentials,而是使用 private_key,client_email 创建了一个对象(这些值可以从服务帐户私钥文件.json中获取) ,并在设置会话客户端时传递了该对象。

var config = {
  credentials: {
    private_key: "YOUR_PRIVATE_KEY",
    client_email: "YOUR_CLIENT_EMAIL"
  }
}

const sessionClient = new dialogflow.SessionsClient(config);

注释:请从.json复制完整的private_key字符串。它将从"-----BEGIN PRIVATE KEY-----\n......"开始。

此外,在GCP中,转到项目-> IAM,然后尝试将服务的角色设置为DIALOGLOW API ADMIN。检查是否可行。

答案 1 :(得分:0)

如果尚未解决,则解决方案是在sessionClient内部提供“ fileKey”。

const sessionClient = new dialogflow.SessionsClient({
fileKey:" path of your credentials.json file"
});

let filePath = process.env.GOOGLE_APPLICATION_CREDENTIALS ="Location of credentials file".

const sessionClient = new dialogflow.SessionsClient({
fileKey:filePath
});

如果没有将系统环境变量设置为GOOGLE_APPLICATION_CREDENTIALS,这甚至将起作用。

希望这会有所帮助。