Как интегрировать Dialogflow v2 с веб-интерфейсом JavaScript (Vue.js) - PullRequest
0 голосов
/ 25 мая 2018

Я пытаюсь интегрировать Dialogflow с Vue.js (и axios) в соответствии с примером HTTP-запроса документации: https://dialogflow.com/docs/reference/v2-auth-setup и detectIntent: https://dialogflow.com/docs/reference/api-v2/rest/v2beta1/projects.agent.sessions/detectIntent.

У меня установлена ​​учетная запись службыс достаточными разрешениями и предоставил ему параметры пути и тело запроса, как показано в документации, но я продолжаю получать сообщение «Ошибка: запрос не выполнен с кодом состояния 400» при вызове API DeteIntent.

Есть несколькохотя я не уверен в этом:

  1. Как получить идентификатор сессии?В настоящее время я просто копирую идентификатор сеанса из журналов функций Firebase, который появляется при непосредственном вводе запроса через консоль Dialogflow.

  2. Как на самом деле реализовать $ (gcloud auth print-access-token)в коде JavaScript?В настоящее время я запускаю команду в терминале и вставляю токен в код, просто чтобы проверить, работает ли API, но я понятия не имею, как его реализовать.

(Возможно, полезно, у меня есть выполнение в папке функций, и это прекрасно работает.)

Заранее спасибо!

<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>

Ответы [ 2 ]

0 голосов
/ 30 мая 2018

Вы можете использовать авторизацию JWT для решения вашего вопроса №2.Вам просто нужно поместить свой файл JSON в безопасное место.https://developers.google.com/identity/protocols/OAuth2ServiceAccount#jwt-auth

Причина, по которой вы получаете код 400, заключается в том, что ваши параметры немного сбиты.Вот как должен выглядеть ваш пост (я также добавил дополнительный код для генерации токенов):

<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>

Вы можете видеть, что в QueryInput он принимает 1 из 3 различных типов объектов (один из них - "текст").

0 голосов
/ 29 мая 2018

sessionId - это идентификатор, который вы можете указать, который будет указывать Dialogflow, принадлежат ли последующие запросы к тому же «сеансу» взаимодействия с пользователем ( см. Документы ).

ДляПервый запрос клиента к API, вы можете просто сгенерировать случайное число для использования в качестве идентификатора сеанса.Для последующих запросов от того же клиента (например, если пользователь продолжает общаться с вашим агентом) вы можете повторно использовать тот же номер.

Ваша реализация управления токенами выглядит хорошо, пока вы используете учетную запись службы.Использование имеет соответственно ограниченный доступ (так как этот токен потенциально может позволить любому отправлять запросы к API Google Cloud).Для дополнительной безопасности вы можете рассмотреть возможность передачи запроса в Dialogflow через ваш собственный сервер, а не делать вызовы от клиента.

...