如何将Dialogflow v2与javascript前端集成(Vue.js)

时间:2018-05-25 20:08:32

标签: javascript vue.js axios dialogflow http-status-code-400

我正在尝试根据文档的示例HTTP请求将Dialogflow与Vue.js(和axios)集成:https://dialogflow.com/docs/reference/v2-auth-setup和detectIntent:https://dialogflow.com/docs/reference/api-v2/rest/v2beta1/projects.agent.sessions/detectIntent

我设置了一个具有足够权限的服务帐户,并为其提供了路径参数和请求正文,如文档中所示,但我一直收到错误:请求失败,状态代码为400'在调用detectIntent API时。

但是我确定了一些不确定的事情:

  1. 如何获得sessionId?目前,我只是从Firebase功能日志中复制sessionId,这些日志在通过Dialogflow控制台直接输入查询时显示。

  2. 如何在javascript代码中实际实现$(gcloud auth print-access-token)?目前我在终端中运行命令并在代码中粘贴令牌,只是为了测试API是否有效,但我不知道应该如何实现它。

  3. (也许很有用,我在功能文件夹中设置了实现,并且运行良好。)

    提前致谢!

    
    
    <script>
    import axios from 'axios'
    
    export default {
      name: 'myChatBot',
      mounted () {
    
        // Authorization: Bearer $(gcloud auth print-access-token)
        
        const session = 'projects/mychatbot/agent/sessions/some-session-id'
        const token = 'xxxxxxxxxxxx'
        axios.defaults.baseURL = 'https://dialogflow.googleapis.com'
        axios.defaults.headers.common['Authorization'] = `Bearer ${token}`
        axios.defaults.headers.post['Content-Type'] = 'application/json'
        
        axios
          .post(`/v2beta1/${session}:detectIntent`, {
            "queryInput": {
              "text": "add buy milk to inbox",
              "languageCode": "en-US"
            }
          })
          .then(response => console.log(response))
          .catch(error => console.log(error))
      }
    
    }
    </script>
    &#13;
    &#13;
    &#13;

3 个答案:

答案 0 :(得分:4)

您可以使用JWT授权来处理您的#2问题。您只需要将JSON文件放在安全的地方。 https://developers.google.com/identity/protocols/OAuth2ServiceAccount#jwt-auth

您获取代码400的原因是因为您的参数有点偏差。以下是您的帖子的外观(我还添加了一些额外的代码来处理令牌生成):

&#13;
&#13;
<script>
import axios from 'axios'
import { KJUR } from 'jsrsasign'

const creds = require('./YOUR_JSON_FILE')  

export default {
  name: 'myChatBot',
  data() {
    return {
      token: undefined,
      tokenInterval: undefined
    }
  },
  created() {
    // update the tokens every hour
    this.tokenInterval = setInterval(this.generateToken, 3600000)
    this.generateToken()
  },
  mounted () {
    this.detectIntent('add buy milk to inbox')
  },
  beforeDestroy() {
    clearInterval(this.tokenInterval)
  },
  methods: {
    generateToken() {
      // Header
      const header = {
        alg: 'RS256',
        typ: 'JWT',
        kid: creds.private_key_id
      }

      // Payload
      const payload = {
        iss: creds.client_email,
        sub: creds.client_email,
        iat: KJUR.jws.IntDate.get('now'),
        exp: KJUR.jws.IntDate.get('now + 1hour'),
        aud: 'https://dialogflow.googleapis.com/google.cloud.dialogflow.v2.Sessions'
      }
      
      const stringHeader = JSON.stringify(header)
      const stringPayload = JSON.stringify(payload)
      this.token = KJUR.jws.JWS.sign('RS256', stringHeader, stringPayload, creds.private_key)
    },
    detectIntent(text, languageCode = 'en-US') {
      if (!this.token) {
        // try again
        setTimeout(this.detectIntent, 300, text, languageCode)
        return
      }
      
      // error check for no text, etc.

      const session = 'projects/mychatbot/agent/sessions/some-session-id'
      axios.defaults.baseURL = 'https://dialogflow.googleapis.com'
      axios.defaults.headers.common['Authorization'] = `Bearer ${this.token}`
      axios.defaults.headers.post['Content-Type'] = 'application/json'

      axios
        .post(`/v2beta1/${session}:detectIntent`, {
          queryInput: {
            text: {
              text,
              languageCode
            }
          }
        })
        .then(response => console.log(response))
        .catch(error => console.log(error))
    }
  }
}
</script>
&#13;
&#13;
&#13;

您可以在QueryInput中看到它采用了3种不同类型的对象中的一种(&#34;文字&#34;是其中之一)。

答案 1 :(得分:2)

link中,HTTP请求会话路径参数下指出:“由API调用者选择合适的会话ID。 它可以是随机数,也可以是某种类型的用户标识符(最好是散列的)。

要与Dialogflow V2集成,这里是example,用于与易于集成和开始使用的第三方工具一起使用。

答案 2 :(得分:0)

sessionId是您可以提供的标识符,它将向Dialogflow指示后续请求是否属于用户交互的同一“会话”(see docs)。

对于客户端对API的第一次请求,您只需生成一个随机数即可用作会话ID。对于来自同一客户的后续请求(例如,如果用户继续与您的代理交谈),您可以重复使用相同的号码。

只要您使用的服务帐户具有适当的访问权限,您的令牌管理实施就会很好(因为此令牌可能允许任何人向Google Cloud API发出请求)。为了提高安全性,您可以考虑通过自己的服务器将请求代理到Dialogflow,而不是从客户端进行调用。