公共短信存储库





5.00/5 (4投票s)
使用 Twilio 和 ASP.NET 存储和检索短信的中央存储库中的消息。
引言
此项目使个人能够将短信“存储在云端”,其他人可以使用自己的手机“获取”。
本项目将演示如何
- 使用 Twilio TwiML API 响应短信;
- 使用 XML 作为数据存储;
- 在此过程中进行一些政治娱乐。
免费试用。
在我们开始之前,请观看应用程序的实际演示。使用您的手机,将短信 (text) `bush` 发送至 `+1 530 PROJECT`(例如 Code Project,即 +15307765328)。
注意:演示不允许添加/修改/删除消息。
背景
我的垒球队遇到了一个问题。如果因雨(或冰雹)导致比赛取消或改期,很难快速将消息传达给所有球员。他们会开车到球场,却发现比赛取消了。
这个项目写于 2012 年,为本文重写,是解决方案。它的工作原理如下:
- 队长通过发送消息给应用程序来设置一条消息:
set rainout bingo 7 月 5 日上午 10:00 今天比赛取消。
- 应用程序会响应:
rainout set: 7 月 5 日上午 10:00 今天比赛取消。
- 球员可以通过发送消息给应用程序来检查状态:
rainout
- 应用程序会响应:
7 月 5 日上午 10:00 今天比赛取消。
工作原理
Twilio 是一个电话网关。它在互联网、POTS 和 3GPP 网络之间建立数据和语音桥梁。通过在 Twilio 注册账户,呼叫和消息可以被定向到一个指定的号码,也可以从该号码发出。
本项目使用一个简单的 API,称为 TwiML。它的使用非常简单:
- 通过指定应用程序的 URI,将一个电话号码与一个 Web 应用程序关联起来。
- 当该号码收到消息时,会向指定的 URI 发送一个 HTTP POST 请求,其格式为 `application/x-www-form-urlencoded`,包含数据和元数据。
- 应用程序以 XML 文档 (TwiML) 响应请求,其中包含如何响应的指令。
- 响应会转发回请求者。
代码内部
在本例中,我使用 IIS/ASP.NET 作为 HTTP 服务器和脚本接口。通过重写 `Default Page` 类的 `Render` 方法来处理传入的请求。如果表单以 `Body` 参数 POST,则会调用 `Controller`。
控制器 (Controller)
有效的请求消息示例如下:
bush
set greeting bingo 感谢您的光临!
greeting
delete greeting bingo
ParseTwilioRequest
使用正则表达式将消息分解成其组件。
// Parse the twilio request.
string command = string.Empty, message = null, password = null, key = null;
var matches = Regex.Match(request, "^(?<command>[^ ]+) (?<key>[^ ]+) (?<password>[^ ]+)(?: (?<message>.*))?$|^(?<command>[^ ]+)(?: (?<values>.*))?$");
可能的消息组件是:
- command
- 一个动词/指令。这是唯一*必需*的组件。有效的命令是任何已存储的键、`hello`、`ping`、`set`、`delete` 和 `bush`。
- 密码
- 如果执行 `set` 或 `delete` 命令,则需要一个 `password`。密码由 `Repository.Password` 指定。
- 键
- 如果执行 `set` 或 `delete` 命令,则需要一个键/消息对的 `key`。键必须符合 `Repository.KeyPattern` 指定的模式。
- message
- 如果执行 `set` 或 `delete` 命令,则需要键/消息对的 `message`。
如果没有组件,或者命令无效,则返回默认消息。
存储库
应用程序使用 XML 文件作为数据存储库,通过 `Repository` 类进行抽象。它继承自 `XDocument`,并提供属性和方法来操作其数据。
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<repository password="bingo" pattern="[a-zA-Z0-9]{3,10}">
<default>Reply with [hello|bush|{0}]. +1530PROJECT brought to you by Red Cell Innovation Inc.</default>
<message key="foo">bar</message>
<message key="rainout">July 5 @ 1000 Today's games are cancelled.</message>
</repository>
布什语录
为了好玩,`bush` 请求会调用 `Bushisms.GetRandom()` 来获取随机的*布什*引言。
部署
- 将提供的文件复制到您的 Web 服务器。
- 注册一个 Twilio 账户(您将获得一些免费积分)。
- 订购一个电话号码。
- 在电话号码配置中,将您的应用程序的 URI 分配给短信回调。
- 进行测试,并使用 Twilio 的警报面板进行调试。
一旦您的积分用完,此项目将花费
- 每月约 1.00 美元用于电话号码;
- 每发送或接收一条消息约 0.0075 美元(¾ 美分)。
安全注意事项
对我而言,安全性不是主要问题。请记住:
- `repository.xml` 文件以纯文本形式存储用于设置和删除消息的密码,消息也是如此。
- 为了保护应用程序,应将其配置在使用 SSL/TLS (HTTPS) 的服务器上,以加密 Twilio 和 Web 服务器之间的消息传输。
- 根据设计,只能使用关键字从存储中检索消息。
贡献
您将如何使用此应用程序?您还能设想出哪些其他用例?在下方添加您的回复。
结论
本项目演示了如何在不使用任何外部库或依赖项的情况下构建一个简单的短信应用程序。
我与 Twilio 无关。本文并非对 Twilio 的认可。Twilio 是一种电话网关,还有许多其他网关。每种网关可能提供不同的服务,价格也不同。
注意:为本文提供一个可用的演示需要实际成本。此演示的成本由 Red Cell Innovation Inc. 赞助。如果您需要开发电话或移动应用程序,请考虑我们。
历史
- 2015 年 5 月 31 日 – 首次发布