如何'运行'保存在JSON中的IVR?
问题描述:
我正在为本地区的小型企业开发IVR解决方案,但我在围绕Node如何处理菜单时遇到了麻烦。我可能为我的每个客户制造一个单独的节点服务器,但我希望有一台服务器,当他们的号码被调用时,从Mongo数据库或文件中提取每个客户的IVR设置。我有一个关于如何在JSON中保存菜单结构的想法,但是在将该JSON转换为对<gather>
输入的响应时,我迷失了方向。我想我可以在数据库中使用JSON结构是这样的(也许是在Amazon S3上一个以.json文件):如何'运行'保存在JSON中的IVR?
{
"menu": {
"id": 1,
"name": "Main",
"script": "Thank you for calling Local Company. To speak to sales press 1, ...",
"options": [
{
"name": "",
"action": "",
"value": "",
"next": ""
},
{
"name": "Sales",
"action": "dial",
"value": 12345678901,
"next": ""
},
{
"name": "Support",
"action": "dial",
"value": 12345678902,
"next": ""
},
{
"name": "Directions",
"action": "say",
"value": "Our offices are located at...",
"next": 1
},
{
"name": "Mailbox",
"action": "mailbox",
"value": "main",
"next": 1
}
]
}
}
答
Twilio开发者传道这里。
如果你能根据用户拨打该号码返回JSON,那么你可以做这样的事情:
const Twilio = require('twilio');
app.post('/voice', (req, res) => {
const dialledNumber = req.body.To;
getIVRObjectFromPhoneNumber(dialledNumber, (IVRObject) => {
const twiml = Twilio.twiml.VoiceResponse();
if (typeof req.body.Digits !== 'undefined') {
// A user has pressed a digit, do the next thing!
const action = IVRObject.menu.options[req.body.Digits]
twiml[action.action](action.value);
} else {
// No digits yet, return the <Gather>
const gather = twiml.gather({
numDigits: 1
});
gather.say(IVRObject.script);
}
res.send(twiml.toString());
});
});
这并不完全使用所有的对象,我不知道next
的值是什么意思,但希望这是一个开始。 getIVRObjectFromPhoneNumber
方法是我编写的异步方法,它返回从上面的示例JSON解析的JavaScript对象。
让我知道这是否有帮助。
非常感谢您的帮助!下一个参数是接下来要执行的动作的ID。所以信息选项可以返回到菜单或做类似的事情。另外,我不知道你可以做twiml [action.action](action.value)。我认为我将不得不对每种命令类型做一个switch语句。 –
由于到目前为止您选择的动作名称和值,您可以执行'twiml [action.action](action.value)'(即动作名称是您使用的TwiML动词的名称,但是它们的小写形式也是'twiml'对象上方法的名称)。它可能不适合所有的事情,我还没有想过它! – philnash