代码之家  ›  专栏  ›  技术社区  ›  Marco Lampis

Dialogflow是一种简单的授权方式

  •  10
  • Marco Lampis  · 技术社区  · 7 年前

    是否存在一种将Dialogflow代理连接到的简单方法 node.js 密码当我将此代码与Dialogflow代理的设置页面中的正确projectID一起使用时,我出现以下错误:

    错误:获取应用程序默认凭据时出现意外错误:无法加载默认凭据。浏览至 https://developers.google.com/accounts/docs/application-default-credentials 了解更多信息。

    const sessionClient = new dialogflow.SessionsClient();
    const sessionPath = sessionClient.sessionPath(projectId, sessionId);
    

    我访问了这个页面,但对于我想要的东西,我觉得很困惑(他们引用了其他API和很多设置),我该如何解决这个问题?

    我想从文件中获取信息并加载所有内容,而无需安装第三方API。

    5 回复  |  直到 5 年前
        1
  •  16
  •   Marcos Casagrande    6 年前

    虽然没有很好的文档记录,但最简单的身份验证方法是使用谷歌云平台控制台上提供的JSON文件。

    const sessionClient = new dialogflow.SessionsClient({
        keyFilename: '/path/to/google.json'
    });
    const sessionPath = sessionClient.sessionPath(projectId, sessionId);
    

    这也适用于所有其他客户。 ContextsClients , EntityTypesClient 等等

        2
  •  8
  •   Ashish Singh Rawat    7 年前

    我正在写代码,这对我很有用。请遵循中提供的所有步骤 Reference link 2 出于编码目的,您可以使用提供的代码段。

    我还添加了Google Cloud Oauth的JSON示例

    参考资料:

    1. https://www.npmjs.com/package/dialogflow#samples
    2. https://medium.com/@tzahi/how-to-setup-dialogflow-v2-authentication-programmatically-with-node-js-b37fa4815d89

    //Downloaded JSON format
    
    {
      "type": "service_account",
      "project_id": "mybot",
      "private_key_id": "123456asd",
      "private_key": "YOURKEY",
      "client_email": "yourID@mybot.iam.gserviceaccount.com",
      "client_id": "098091234",
      "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/yourID%40mybot.iam.gserviceaccount.com"
    }
    
    
    //------*********************---------------------------
    //
    const projectId = 'mybot';
    
    //https://dialogflow.com/docs/agents#settings
    // generate session id (currently hard coded)
    const sessionId = '981dbc33-7c54-5419-2cce-edf90efd2170';
    const query = 'hello';
    const languageCode = 'en-US';
    
    // Instantiate a DialogFlow client.
    const dialogflow = require('dialogflow');
    let privateKey = 'YourKey';
    
    // as per goolgle json
    let clientEmail = "yourID@mybot.iam.gserviceaccount.com";
    let config = {
      credentials: {
        private_key: privateKey,
        client_email: clientEmail
      }
    }
    const sessionClient = new dialogflow.SessionsClient(config);
    
    // Define session path
    const sessionPath = sessionClient.sessionPath(projectId, sessionId);
    
    // The text query request.
    const request = {
      session: sessionPath,
      queryInput: {
        text: {
          text: query,
          languageCode: languageCode,
        },
      },
    };
    
    // 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);
      });
        3
  •  3
  •   Arturo Gonzalez    6 年前

    几个月前我也有同样的问题,看看这个,我就是这样解决的。 谷歌云从你的JSON中提取这行代码。

    const dialogflow = require('dialogflow');
    const LANGUAGE_CODE = 'en-US'
    const projectId = 'projectid';
    const sessionId = 'sessionId';
    const query = 'text to check';
    
    
    let privateKey = "private key JSON";
    let clientEmail = "email acount from JSON";
    let config = {
    credentials: {
        private_key: privateKey,
        client_email: clientEmail
    }
    };
    
    sessionClient = new dialogflow.SessionsClient(config);
    
    async function sendTextMessageToDialogFlow(textMessage, sessionId) {
    // Define session path
    const sessionPath = this.sessionClient.sessionPath(projectId, sessionId);
    // The text query request.
    const request = {
        session: sessionPath,
        queryInput: {
            text: {
                text: textMessage,
                languageCode: LANGUAGE_CODE
            }
        }
    }
    try {
        let responses = await this.sessionClient.detectIntent(request)
        console.log('DialogFlow.sendTextMessageToDialogFlow: Detected intent', responses);
        return responses
    } catch (err) {
        console.error('DialogFlow.sendTextMessageToDialogFlow ERROR:', err);
        throw err
    }
    };
    
    
    sendTextMessageToDialogFlow(query, sessionId)
    
        4
  •  1
  •   Anthony V    6 年前

    从最初的问题开始,Dialogflow身份验证的文档得到了改进。你应该在这里找到所有答案:

    Authentication and access contro

        5
  •  1
  •   Sadaf Sid    5 年前

    我遵循上述解决方案,但没有什么变化:

    // A unique identifier for the given session
    const sessionId = uuid.v4();
    
    // Create a new session
    
    const sessionClient = new dialogflow.SessionsClient({
        keyFilename: require("path").join('config/google-credential.json')
    });
    const sessionPath = sessionClient.sessionPath(process.env.DIALOGFLOW_PROJECTID, sessionId);