使用Oracle ChatBot在Google上构建操作

时间:2018-09-30 16:51:13

标签: oracle actions-on-google chatbot mcs

我正在使用Oracle聊天机器人和Google Home,并且正在Google上构建一个应用程序,该应用程序的数据由Oracle机器人处理。但是我发现两者之间的通信存在问题。他们通过webhook进行通讯,我有一个应用程序可以接收用户输入并将其发送到聊天机器人,但是聊天机器人以异步方式发送回覆,并且我无法在POST请求中获取回覆数据并显示它给用户,因此我必须向用户发送媒体响应,以等待bot的回复,并在调用另一个操作以检查回复是否准备好之后。

我想同步获取回复,或者至少不必发送媒体响应来等待机器人回复。有可能吗?

我必须使用Oracle聊天机器人和Google Home。

此问题包含我的代码: How to make asynchronous calls from external services to actions on 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);
    }
});

从这里开始,我无法将数据发送回Google行动,我必须将数据保存在队列中,然后在再次调用TEXT行为以检查队列之后。如果可能的话,我想在回覆初始请求中得到答复,或者寻求另一种解决方法来解决此问题。

2 个答案:

答案 0 :(得分:2)

如果您的Webhook在5秒内响应,则可以内联完成整个设置。如果您的Action是使用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)
        });
})

答案 1 :(得分:0)

我用node的pub-sub库解决了这个问题。当应用收到来自GH用户的消息时,请使用其ID订阅一个将处理机器人响应isWrapped=false的函数。

当应用在另一个端点接收到来自bot的响应时,该应用将消息发布在user_id主题CATextLayer.fontSize中,该消息由commandResponse函数处理并发送给GH。

此功能内置于GH动作端点中的Promise中。