Asynchronous 如何从外部服务对google上的操作进行异步调用?
我正在尝试使用actionssdk将Google Home连接到外部聊天机器人。我有一个API,它接收用户输入并通过webhook将它们发送到我的聊天机器人,但是我的聊天机器人以异步方式调用我的API的另一个端点进行响应,并且我无法在Google或Google Home上的操作中显示响应 我创建了一个actionssdkAppAsynchronous 如何从外部服务对google上的操作进行异步调用?,asynchronous,actions-on-google,chatbot,google-home,Asynchronous,Actions On Google,Chatbot,Google Home,我正在尝试使用actionssdk将Google Home连接到外部聊天机器人。我有一个API,它接收用户输入并通过webhook将它们发送到我的聊天机器人,但是我的聊天机器人以异步方式调用我的API的另一个端点进行响应,并且我无法在Google或Google Home上的操作中显示响应 我创建了一个actionssdkApp const { actionssdk, SimpleResponse, Image, } = require('actions-on-google'); va
const {
actionssdk,
SimpleResponse,
Image,
} = require('actions-on-google');
var app = actionssdk();
var express_app = express();
我的API有两个端点。其中之一是google上的操作将用户输入发送到我的聊天机器人:
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){
textFound(conv, input, userId);
}else{
textnotFound(conv);
}
});
TextFound函数使用webhook将用户输入发送到我的聊天机器人,但请求未收到响应。My chatbot使用文本应答调用另一个端点:
express_app.post('/webhook', bodyParser.json(), (req, res)=>{
console.log("Webhook");
const userId = req.body.userId;
if (!userId) {
return res.status(400).send('Missing User ID');
}
console.log(req.body);
res.sendStatus(200);
});
这里是我想把答案发送到谷歌主页的地方。但我需要conv对象在googlehome、google或任何其他设备上显示答案
编辑:
我的textFound
功能:
webhook.messageToBot(metadata.channelUrl, metadata.channelSecretKey, userId, input, function(err){
if(err){
console.log('Error in sending message');
conv.ask("Error in sending message");
}else{
conv.ask("some text");
}
});
request.post({
uri: channelUrl,
headers: headers,
body: body,
timeout: 60000,
followAllRedirects: true,
followOriginalHttpMethod: true,
callback: function(err, res, body) {
if (err) {
console.log('err: '+err);
callback(err);
} else {
console.log('Message sent');
callback(null);
}
}
});
从这里,我的api通过messageToBot
函数向我的bot发送用户输入:
webhook.messageToBot(metadata.channelUrl, metadata.channelSecretKey, userId, input, function(err){
if(err){
console.log('Error in sending message');
conv.ask("Error in sending message");
}else{
conv.ask("some text");
}
});
request.post({
uri: channelUrl,
headers: headers,
body: body,
timeout: 60000,
followAllRedirects: true,
followOriginalHttpMethod: true,
callback: function(err, res, body) {
if (err) {
console.log('err: '+err);
callback(err);
} else {
console.log('Message sent');
callback(null);
}
}
});
从现在起,我的bot不会发送响应,而是用响应调用我的api的
/webhook
端点。但在这个函数中,我没有de conv对象,也无法将答案发送到google。我不知道如何访问这个对象。也许有一个uri可以从我的api连接到谷歌上的actions中的我的项目 通常,Google上的操作以请求-响应的方式工作。用户对该操作说了些什么,该操作会给出一个响应。这个答复需要在大约5秒钟内作出。如果您认为对/webhook的调用可以这么快到达,并且只有在用户说了什么之后,您才会向用户发送消息,那么您可以让/webhook将响应保存在一个队列中供用户使用,并让您的意图处理程序处于一个循环中,该循环检查该队列中是否有任何要回复的消息-如果在5秒内有消息,你用它回复,如果没有,你需要在5秒之前回复
如果你不能保证它能在5秒内完成,那么根据你的需要,有一些变通方法可能会很有用
首先,您可能能够使用。在这种情况下,您将从用户发送消息,然后关闭对话。当您的/webhook endpiont被触发时,您将找到用户并将通知发送给他们的助手。不幸的是,这是一个有点笨重,不导致一个非常互动的聊天系统,通知也不支持智能扬声器
您还可以研究使用设置定期轮询新消息的方法。在此方案下,您的用户将发送他们的消息。在您对他们的回复中,您将包括媒体对某些音频的响应,例如播放15秒。音频结束后,将再次调用您的操作,您可以检查是否有任何消息排队等待发送给用户。如果是这样,您将转发这些消息,然后是媒体响应增益。否则,只需发送媒体响应即可。您对/webhook的调用必须将消息放入队列中才能传递给用户。这更复杂,尤其是在规模上,但可以使其更具交互性。这也是一种更普遍的情况,即尝试在5秒内以循环方式处理它。因此,如果我理解正确,您希望从actions.intent.text向web服务发出POST请求吗?然后,此web服务将返回一个响应,该响应将从您的操作中发送?查看
textFound
功能会很有用。我编辑了这篇文章,请查看。web服务是一个聊天机器人。我从actions.intent.text发出了一个POST请求,我的聊天机器人没有做出响应,而是用答案调用/webhook
端点,我不知道如何将此答案发送到我在谷歌上的actions项目。感谢您的评论。我正在尝试解决此问题,我想问您是否有办法延迟以等待消息重播,或者我需要实施媒体响应解决方案。谢谢。我已经更新了我的答案来澄清。如果您知道回复将在五秒钟内完成,那么您当然可以在处理程序中循环并查找它。但是,通过媒体响应工作区这样做将在更一般的情况下处理它。