Я разрабатываю собственный чат-чат для мессенджера с Dialogflow v2 и клиентским SDK Node.js. Но у меня проблема с пользовательскими данными. Когда я использую консоль, предоставляемую Dialogflow, у меня есть ответ, который выглядит следующим образом:

{ "payload": { "facebook": { "attachment": { "payload": { ...

Но когда я получаю ответ от своего JS-сервера, пользовательские данные были сериализованы. Вот объект, который я получаю:

{ facebook: { structValue: { fields: [Object] }, kind: 'structValue' } }

Можно ли десериализовать этот объект, чтобы получить ту же структуру пользовательской полезной нагрузки, которую я предоставил в Dialogflow?

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

8
MrOnigiri 1 Мар 2018 в 12:05

4 ответа

Лучший ответ

Это построено с использованием Структурные протоколы

Чтобы преобразовать это, вам нужно использовать протобугерный буфер Google, т.е. google.protobuf. Я использовал приведенный ниже код, чтобы сделать это.

import google.protobuf  as pf
pf.json_format.MessageToJson(response.query_result.fulfillment_messages[1].payload, including_default_value_fields=False)
3
fool-dev 30 Апр 2018 в 07:55

Теперь вы можете использовать pb-util для преобразования из protobuf в объекты JavaScript в узле , Согласно этому комментарию к nodejs-dialogflow, этот является временным решением, пока оно не будет включено в клиентскую библиотеку.

0
techpeace 29 Мар 2019 в 11:11

Как я декодирую диалог

Формат ответа от моего API на (запрос выполнения диалогового потока диалогового потока)

const response = {
"status":200,
"messages":[{},{} ...]
}

Как я читаю ответ от My API, чтобы отправить чат-бот или что-то сделать ..

var express = require('express');
var {value} = require('pb-util');
var router = express.Router();

...

const status = value.decode(data[0].queryResult.webhookPayload.fields.status);
const messages = value.decode(data[0].queryResult.webhookPayload.fields.messages);

pb-util конвертирует мой статус и сообщения в обычный объект JSON

0
user3444748 5 Апр 2020 в 13:15

Редактировать: Очевидно, Dialogflow выпустил свое собственное решение с примерами для Node.js SDK: dialogflow-nodejs-client-v2 / samples / structjson.js

В качестве альтернативы решению Vikas Jain вы можете написать собственную (рекурсивную) функцию преобразования.

Что-то вроде:

processCustomPayloadMessage(object) {
  let outputMessage = Array.isArray(object) ? [] : {};
  Object.entries(object).forEach(([key, value]) => {
    if (value.kind == 'structValue') {
      outputMessage[key] = this.processCustomPayloadMessage(value.structValue.fields);
    } else if (value.kind == 'listValue') {
      outputMessage[key] = this.processCustomPayloadMessage(value.listValue.values);
    } else if (value.kind == 'stringValue') {
      outputMessage[key] = value.stringValue;
    } else if (value.kind == 'boolValue') {
      outputMessage[key] = value.boolValue;
    } else {
      outputMessage[key] = value;
    }
  });
  return outputMessage;
}

// call this method with your response message
this.processCustomPayloadMessage(message.payload.fields);
3
JDK 31 Мар 2019 в 23:38