Как сделать http-вызов на DialogFlow v2, используя Javascript AJAX-вызов - PullRequest
0 голосов
/ 31 мая 2018

Я нашел этот пример на официальном сайте DialogFlow с использованием Node.js, и он работает нормально, но я не знаю, как мне интегрировать это в мое веб-приложение.

Возможно ли, что я могу интегрироватьэто в другой мой javascript код jquery?и здесь мне нужно запустить узел index.js, но нужно ли мне это делать, если я интегрируюсь с моим кодом?

const projectId = 'xxx'; //https://dialogflow.com/docs/agents#settings
const sessionId = 'xxxxx';
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);
console.log(sessionPath);
// 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);
  });

Есть ли какая-либо альтернатива, чтобы мы могли использовать DialogFlow v2, используя обычный javascript jquery, ajax без необходимости выполнять index.js узла каждый раз, когда я хочу использовать dialogflow.

DialogFlow v1 былдовольно прост в использовании.У меня было что-то вроде этого:

fetch(url, {
    body: JSON.stringify(data),
    // cache: 'no-cache',
    // credentials: 'same-origin',
    headers: {
        'content-type': 'application/json',
        "Authorization": "Bearer " + configs.accessToken,
    },
    method: 'POST',
    mode: 'cors',
    redirect: 'follow',
    referrer: 'no-referrer',
})
    .then(response => response.json()) // parses response to JSON

Ответы [ 4 ]

0 голосов
/ 22 марта 2019

Как уже говорили здесь другие, токен доступа имеет продолжительность один час, после этого он становится бесполезным.Поэтому необходимо сделать вызов (http-вызов в моем случае) в API, чтобы запросить токен доступа, один раз в час, и использовать его, как объяснил Сатиш после этого.Инструкции о том, как сгенерировать подпись для совершения вызова и использовать ее позже, приведены в https://developers.google.com/identity/protocols/OAuth2ServiceAccount.

После получения файла json из учетной записи службы с закрытым ключом и адресом электронной почты, который необходимо использовать (несвою электронную почту, но созданную учетной записью службы), вы можете использовать библиотеку jsrsasign (в чистом javascript), которую вы можете найти в https://github.com/kjur/jsrsasign,, чтобы сгенерировать JSON Web Signature (JWS) и, следовательно, JSON WebТокен (JWT), который понадобится для выполнения http-вызова для получения токена доступа.

Затем вы используете его, как описано выше Satheesh, для выполнения вызова Dialogflow V2 через jQuery.

Код, который я использовал для достижения этой цели, следующий:

Чтобы сгенерировать JWT (используя соответствующую библиотеку):

function _genJWS() {
    var header = '{"alg":"RS256","typ":"JWT"}';
    var claimSet = jwtClaimSet();
    var privateKey = jwtPrivateKey();

    var sHead = newline_toDos(header);
    var head = KJUR.jws.JWS.readSafeJSONString(sHead);
    var sPayload = newline_toDos(claimSet);
    var sPemPrvKey = privateKey;

    var jws = new KJUR.jws.JWS();
    var sResult = null;
    try {
        prv = KEYUTIL.getKey(sPemPrvKey);

        sResult = KJUR.jws.JWS.sign(head.alg, sHead, sPayload, prv);
    } catch (ex) {
        alert("Error: " + ex);
    }
    return sResult;
}

Чтобы запросить токен доступа:

function _requestAccessToken() {
    var access_token = accessToken;
    var assertion = _genJWS();
    console.log('Assertion: ' + assertion);
    jQuery.ajax({
        type: "POST",
        url: "https://www.googleapis.com/oauth2/v4/token",
        contentType: "application/x-www-form-urlencoded",
        dataType: "json",
        data: "grant_type=urn%3Aietf%3Aparams%3Aoauth%3Agrant-type%3Ajwt-bearer&assertion=" + assertion,
        success: function(response) {
            console.log("success");
            console.log(response);
            access_token = response.access_token;
            console.log(access_token);
        },
        error: function() {
            console.log("Error");
        }
    });
    return access_token;
}

Затем используйте этот токен доступа для выполнения HTTP-вызова Dialogflow.

Надеюсь, это поможет.

0 голосов
/ 08 июня 2018

https://dialogflow.com/docs/reference/v2-auth-setup

После того, как вы пройдете через страницу выше и создадите служебные ключи, у вас должен быть файл json, подобный следующему:

{
    "type": "",
    "project_id": "",
    "private_key_id": "",
    "private_key": "",
    "client_email": "",
    "client_id": "",
    "auth_uri": "",
    "token_uri": "",
    "auth_provider_x509_cert_url": "",
    "client_x509_cert_url": ""
  }  

С этим файлом выполните эти две команды (вам нужно установить gcloud CLI, если это еще не сделано):

gcloud auth activate-service-account --key-file=<service-account-key-file.json>
gcloud auth print-access-token

После этого скопируйте токен доступа и передайте его в свою программу в качестве переменной среды (или жесткого кода, если вам все равно).Затем вы просто отправляете HTTP-запрос.Я использую Axios в своем проекте React, вот пример кода для DeteIntent:

import axios from "axios";

const DIALOG_FLOW_TOKEN = process.env.REACT_APP_DIALOG_FLOW_TOKEN;
const DIALOG_FLOW_API_ROOT_URL = "https://dialogflow.googleapis.com/v2";
const YOUR_PROJECT_ID = <YOUR_PROJECT_ID>;
const SESSION_ID = <SESSION_ID>;
const URL = `${DIALOG_FLOW_API_ROOT_URL}/projects/${YOUR_PROJECT_ID}/agent/sessions/${SESSION_ID}:detectIntent`;

var config = {
    headers: {
        "Authorization": "Bearer " + DIALOG_FLOW_TOKEN,
        "Content-Type": "application/json"
    }
};

export function sendText(text) {
    var bodyParameters = {
        "queryInput": { "text": { "text": text, "languageCode": "en" } },
    };

    const request = axios.post(
        URL,
        bodyParameters,
        config
    );

    return request;
} 
0 голосов
/ 01 сентября 2018

В следующем фрагменте объясняется, как мы можем общаться из веб-приложения в диалоговом потоке NLU.Чтобы получить токен доступа, мы можем использовать Google Cloud SDK для получения токена, но срок его действия составляет один час, поэтому наличие его в другом сервисе и получение его до вызова диалогового потока даст обходной путь.

$(документ) .ready (function () {

$("button").click(function(){

    $.ajax({
        type: "POST",
        url: "https://dialogflow.googleapis.com/v2/projects/YOUR-PROJECT-NAME/agent/sessions/SESSIONIDOFYOURCHOICE:detectIntent",
        contentType: "application/json; charset=utf-8",
        dataType: "json",
        headers: {
            "Authorization": "Bearer " + "YOUR ACCESS TOKEN GOES HERE",
        },
        data: JSON.stringify({ "queryInput":{
            "text":{
                "text":"YOUR QUERY TO NLU",
                "languageCode":"en-US"
            }
        } }),
        success: function(data) {
            $("#div").html(data.queryResult.fulfillmentText);
        },
        error: function() {
            console.log("Internal Server Error");
        }
    });     

});

});

0 голосов
/ 04 июня 2018

Вы можете легко вызвать конечную точку API Dialogflow V2 detectIntent из jQuery.

Документы API показывают URL-адреса и форматы запросов:

POST https://dialogflow.googleapis.com/v2/{session=projects/*/agent/sessions/*}:detectIntent

{
  "queryParams": {
    object(QueryParameters)
  },
  "queryInput": {
    object(QueryInput)
  },
  "inputAudio": string
}

Аутентификация работаетнемного по-другому;вместо того, чтобы использовать токен доступа, вы создадите учетную запись службы и ключ с помощью панели инструментов Cloud. Эта страница документации объясняет, как.

...