包含多个传入短信/回复与Twilio功能



我正在Twilio内的一个项目中工作,使用Twilio Functions,在那里我试图设置SMS消息,以便如果我们收到一个传入的关键字,我们响应一个特定的消息,包括一个URL。该计划是有多个传入关键字,不同的响应,所以如果有人发送短信到我们的一个号码,根据关键字,我们与一个基本的消息和URL响应。我正试图找出最好的方法来处理这个在Twilio函数。

我让它为单个传入关键字/响应工作,如下所示。

if (incomingMessage.includes('testpark')) {
twiml.message('StartMyParking:nnTo start your parking, please click this link: https://blahblah.com');
} else if (incomingMessage.includes('bye')) {
twiml.message('Goodbye!');
} else {
twiml.message('Please check your zone/code and try again.');
}

虽然这样做是有效的,但我想添加更多传入的单词,以及响应,例如'testpark2'的传入消息和'StartMyParking:nn '的响应'StartMyParking:nn要开始停车,请点击此链接:https://blahblah2.com'。

然后我想包括另一个'testpark3'和'StartMyParking:nn '的响应'StartMyParking:nn开始你的停车,请点击此链接:https://blahblah3.com'等等,都在同一脚本中。

有人能帮我理解如何实现这一点吗?

有很多方法可以达到你想要的结果,但这里是最直接的开始。

您可以使用JavaScriptMap预先定义关键字/响应对,而不是为每个可能的关键字创建else if语句。Map的键将是您的关键字,Map的值将是您的响应:

const keywordResponseMap = new Map([
['testpark2', 'StartMyParking:nnTo start your parking, please click this link: https://blahblah2.com'],
['testpark3', 'StartMyParking:nnTo start your parking, please click this link: https://blahblah3.com'],
['testpark', 'StartMyParking:nnTo start your parking, please click this link: https://blahblah.com'],
]);
const keywords = Array.from(keywordResponseMap.keys());
let keyword;
if (incomingMessage.includes('bye')) {
twiml.message('Goodbye!');
}
else if (keyword = keywords.find(k => incomingMessage.includes(k))) {
const response = keywordResponseMap.get(keyword);
twiml.message(response);
} else {
twiml.message('Please check your zone/code and try again.');
}

还请注意,我将bye放在前面,因为它比在incomingMessage中查找关键字性能更高,因此当用户输入bye时,您可以避免不必要的处理。

您可以使用find搜索incomingMessage中的任何关键字,然后您可以使用找到的keyword从映射中检索response

如果你的响应总是相同的,除了URL,你可以进一步优化,只存储URL在映射和使用字符串插值,像这样:

const keywordUrlMap = new Map([
['testpark2', 'https://blahblah2.com'],
['testpark3', 'https://blahblah3.com'],
['testpark', 'https://blahblah.com'],
]);
const keywords = Array.from(keywordUrlMap.keys());
let keyword;
if (incomingMessage.includes('bye')) {
twiml.message('Goodbye!');
}
else if (keyword = keywords.find(k => incomingMessage.includes(k))) {
const url = keywordUrlMap.get(keyword);
twiml.message(`StartMyParking:nnTo start your parking, please click this link: ${url}`);
} else {
twiml.message('Please check your zone/code and try again.');
}

同样重要的是要注意,我将testpark放在地图的最后,因为testparktestpark2testpark3匹配。如果把它放在前面,即使用户提交testpark2或类似的值,它也总是解析为testpark。另外,我使用Map类型是因为它保证键返回的顺序,这对于前一点也很重要。

当你有更多的关键字和响应时,你可能不得不开始寻找一种解决方案,将它们像数据库一样存储在外部,并通过关键字查询数据库来解析响应。

祝你好运,我们迫不及待地想看到你的作品!

最新更新