Создание действий на Google с Oracle ChatBot - PullRequest
0 голосов
/ 30 сентября 2018

Я работаю с чат-ботами Oracle и Google Home и создаю приложение на основе действий в Google, данные которого обрабатываются ботом Oracle.Но я нашел проблему с общением между ними.Они общаются через webhook, у меня есть приложение, которое получает пользовательские входные данные и отправляет его в чат-бот, но чат-бот отправляет ответ обратно асинхронным способом, и я не могу взять данные ответа в запросе POST и показать егопользователю, поэтому я должен отправить медиа-ответ пользователю, чтобы дождаться ответа от бота, и после вызова другого действия, чтобы проверить, готов ли ответ.

Я хотел бы получить ответ синхронно или, по крайней мере, не нужно отправлять медиаответ, чтобы дождаться ответа бота.Возможно ли это?

Мне нужно использовать чат-боты Oracle и Google Home.

Этот вопрос содержит мой код: Как выполнять асинхронные вызовы из внешних служб для действий в Google?

РЕДАКТИРОВАТЬ:

Конечная точка /text отправляет пользовательские входные данные в мой чат-бот

app.intent('actions.intent.MAIN', conv => {
  console.log('entra en main');
  conv.ask('Hi, how is it going?');
});

app.intent('actions.intent.TEXT', (conv, input) => {
  var userId = conv.body.user.userId;
  console.log(userId);

  if(userId && input){
    return textFound(conv, input, userId);
  }else{
    textnotFound(conv);
  }
});
express_app.post('/text', app);

Чат-бот отправляет ответ другой конечной точке:

express_app.post('/webhook', bodyParser.json(), (req, res)=>{
    message = req.body;
    const userId = req.body.userId;

    if (!userId) {
        return res.status(400).send('Missing User ID');
    }
    if (webhook.verifyMessageFromBot(req.get('X-Hub-Signature'), req.body, metadata.channelSecretKey)) {
        console.log("todo bien");
        res.sendStatus(200);
    } else {
        console.log("Todo mal");
        res.sendStatus(403);
    }
});

Отсюда я не могу отправить данные из ответа в Actions-on-Google, мне нужно сохранить данные в очереди и после вызова действия TEXT снова, чтобы проверить очередь.Я хотел бы получить ответ в ответ на первоначальный запрос, если это возможно, или получить другой обходной путь для решения этой проблемы.

Ответы [ 2 ]

0 голосов
/ 16 января 2019

Я решил эту проблему с библиотекой pub-sub узла.Когда приложение получает сообщение от пользователя GH, подписывают его идентификатор на функцию, которая будет обрабатывать ответ бота var token = PubSub.subscribe(user_id, commandResponse);.

Когда приложение получает ответ от бота в другой конечной точке, приложение публикует сообщение втема user_id PubSub.publish(userId, message);, это сообщение обрабатывается функцией commandResponse и отправляется в GH.

Эта функция реализуется внутри Promise в конечной точке действия GH.

0 голосов
/ 01 октября 2018

Если ваш webhook отвечает в течение 5 секунд, тогда вы можете выполнить всю настройку в режиме реального времени.Если ваше действие написано с использованием Node.js, вы можете использовать Promises для вставки асинхронного кода.Ниже приведен пример фрагмента.

function getBotResponse() {
    return new Promise((resolve, reject) => {
        // Call bot
        resolve(botResponse);
    })
}

app.intent('get oracle bot', conv => {
    return getBotResponse()
        .then((botResponse) => {
            conv.ask(botResponse)
        });
})
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...