使用 Oracle ChatBot 在 google 上构建操作

Building actions on google with Oracle ChatBot

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

我希望同步获得回复,或者至少不必发送媒体回复来等待机器人回复。可能吗?

我必须使用 Oracle 聊天机器人和 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 动作后再次检查队列。如果可能的话,我想在初始请求的回调中得到回复,或者得到另一个解决方法来解决这个问题。

如果您的 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)
        });
})

我用node的pub-sub库解决了这个问题。当应用收到来自 GH 用户的消息时,使用他们的 ID 订阅将处理机器人响应的函数 var token = PubSub.subscribe(user_id, commandResponse);

当应用程序在另一个不同的端点收到来自机器人的响应时,应用程序在 user_id 主题 PubSub.publish(userId, message); 中发布消息,此消息由 commandResponse 函数处理并发送到 GH。

此函数在 GH 的操作端点中的 Promise 中实现。