0

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

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

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

这个问题包含我的代码: How to make asynchronous call 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 操作以检查队列。如果可能的话,我想在初始请求的回调中得到回复,或者获得另一种解决方法来解决这个问题。

4

2 回答 2

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)
        });
})
于 2018-10-01T01:19:23.280 回答
0

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

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

这个函数在 GH 的 action 端点的 Promise 中实现。

于 2019-01-16T13:54:20.950 回答