使用Perl和Twilio自动化电话
Perl可以让你的电话响起。
Twilio 允许开发者编写可以拨打电话或接收短信的应用程序(虽然Twilio还能做许多其他有趣的电话功能)。Twilio的RESTful API、文本到语音合成器、语音转录服务以及JavaScript客户端,使得在几分钟内轻松完成会议电话应用程序、浏览器中的客户服务语音应用程序、短信天气应用程序、电话提醒等应用成为可能。本文展示了如何制作几个小应用程序,一个帮助你正确发音单词,另一个用于转录尴尬的调味品电话调查回答。
Twilio设置
首先,访问 Twilio.com 并点击“免费试用Twilio”链接。虽然来电费用为每分钟0.01美元,去电费用为每分钟0.02美元,但Twilio通常会给新用户提供丰富的账户余额免费开始(目前为30美元)——足够你尝试和体验。
继续注册(我在这里等你)。完成注册后,你将获得一个账户SID(以“AC”开头)和一个认证令牌,可在Twilio仪表板中找到。这些是Twilio API的用户名和密码;你将需要它们来编写任何API应用程序。
Twilio基础知识
Twilio网站上有大量组织良好的文档和示例应用程序。我建议从“如何工作”(主页上的主要导航链接之一)开始。同时浏览“文档”下的文档。
H. H. Munroe说过,“有时候一点不准确可以节省大量的解释。”记住这一点,来电(拨打Twilio号码的电话)是这样工作的
来电到Twilio号码
1) 用户用他们的电话拨打“555-867-5309”
2) Twilio接收电话,然后向 http://example.com/jenny.xml 发送HTTP POST请求
3) example.com响应一个“TwiML”文档(TwiML是一种简单的XML语言,用于描述Twilio如何与通话者交互)
<?xml version="1.0" encoding="UTF-8" ?>
<Response>
<Say voice="woman">This is Jenny!</Say>
</Response>
4) Twilio的TwiML解析器和文本到语音合成器读取此文档,然后告诉用户(来自神秘谷的声音),“这是Jenny!”
当你设置沙箱号码时,你告诉Twilio将一个URL映射到该号码。Twilio在收到电话时会对该URL进行GET/POST请求。
去电(从Twilio号码打出的电话)是这样工作的
从Twilio号码发出的去电
1) 应用程序向Twilio的“Calls” API发送HTTP POST请求,带有参数
From=+15558675309
To=+19991234567
Url=http://example.com/jenny.xml
2) Twilio拨打电话并等待接听
3) 用户接听后,Twilio检索POST中指定的URL(应该返回一个TwiML文档)
4) Twilio解析TwiML文档并将其传递给文本到语音合成器
5) 合成器对用户说“这是Jenny!”
Twilio还可以录制语音输入、转录它、发送和接收短信、进行会议电话,以及一些其他有用的事情,所有这些都可以使用相同的熟悉RESTful API和TwiML。
Twilio遇见Perl
CPAN通过WWW::Twilio::API使得编写Twilio应用程序变得容易。我的(当前)最喜欢的安装CPAN模块的方法来自Mojolicious项目
curl -L cpanmin.us | perl - WWW::Twilio::API
cpanmin.us 提供一个 Perl 程序,可以为您处理所有构建依赖。如果您对在命令行中直接运行来自网站的代码感到担忧,请安装 App::cpanminus 并使用其 cpanm
程序。
如果您像我一样,不想弄乱干净的开发环境,请告诉 cpanmin.us 或 cpanm
将东西安装到临时位置。
$ mkdir ~/perl-test
$ export PERL5LIB=~/perl-test/lib/perl5
$ curl -L cpanmin.us | perl - --local-lib=~/perl-test WWW::Twilio::API
# or
$ cpanm --local-lib=~/perl-test WWW::Twilio::API
有关更多信息和使用选项,请参阅 如何安装 CPAN 模块。
获取所有必要的 Twilio 信息
安装 WWW::Twilio::API 后,但在您进行第一次呼叫之前,您需要从 Twilio 控制面板获取一些信息。
AccountSid:这是一个以“AC”开头的长字符串。
AuthToken:另一个长十六进制字符串,位于 AccountSid 旁边;您可能需要单击锁形图标才能显示它。
沙盒号码:在“沙盒应用”部分的控制面板页面底部找到。
这就全部了!现在您可以开始了。
您的第一次电话
启动您喜欢的编辑器
#!/usr/bin/env perl
use strict;
use warnings;
use WWW::Twilio::API;
my $twilio = WWW::Twilio::API->( AccountSid => 'ACxxxxxxxxx',
AuthToken => 'xxxxxxxxxxx',
API_VERSION => '2010-04-01' );
## A hollow voice says 'plugh'
my $response = $twilio->POST( 'Calls',
To => '+15556667777', ## maybe your cell phone
From => '+12223334444', ## your Twilio sandbox
Url => 'http://twimlets.com/message?'
. 'Message%5B0%5D=plugh' );
print STDERR $response->{content};
这就是整个应用程序。运行它,如果一切顺利,您应该会看到一个长的 XML 字符串返回,类似于
<?xml version="1.0"?>
<TwilioResponse>
<Call>
<To>+15556667777</To>
<From>+12223334444</From>
<Status>queued</Status>
<Direction>outbound-api</Direction>
</Call>
</TwilioResponse>
…然后您的电话应该会响。我一直想知道“plugh”怎么发音——现在我知道了。
可能出错的是什么?
在 Twilio 开发的早期,您可能会遇到一些小麻烦。例如,您可能会收到此消息
LWP will support https URLs if the LWP::Protocol::https module
is installed.
这是 LWP 告诉您安装 LWP::Protocol::https。它还将安装或更新一些其他模块,包括 Net::SSLeay。
如果您在运行脚本后看到 XML,那么您的开发环境可能没有问题。您可能会看到
<TwilioResponse>
<RestException>
<Status>401</Status>
<Message>Authenticate</Message>
<Code>20003</Code>
<MoreInfo>http://www.twilio.com/docs/errors/20003</MoreInfo>
</RestException>
</TwilioResponse>
注意“401”吗?如果您熟悉 HTTP 状态码,您可能会记得 401 表示“未授权”。您要么没有提供任何授权信息,要么信息不正确。在这种情况下,通常意味着 AccountSid 或 AuthToken 是错误的。登录到 Twilio.com,转到控制面板,并确保您的 AccountSid 和 AuthToken 是正确的。
我们还能做什么?
一切取决于您为 URL 参数输入的内容。您可以在 Twilio Labs 中浏览一些免费应用程序,尽管其中大部分都是用于入站呼叫。
以下是一个使用语音邮件 Twimlet 进行简短电话调查的愚蠢示例,并将被叫方的回复转录并发送电子邮件。首先更改 POST 中的 URL 行
my $email = '[email protected]'; ## your email
my $msg = 'Please+tell+us+what+you+think+of+Tabasco+sauce';
my $response = $twilio->POST( 'Calls',
To => '+15556667777',
From => '+12223334444',
Url => "http://twimlets.com/voicemail?"
. "Email=$email&Message=$msg" );
请注意,此 Twimlet 的参数区分大小写。“Email”和“Message”与“email”和“message”不同。请确保您使用正确的拼写。
此外,务必用您的电话号码替换 To 参数,并用您的 Twilio 沙盒电话号码(也位于您的 Twilio 控制面板上)替换 From 参数。Twilio 电话号码始终使用国际通话前缀(例如,美国号码使用“+1”后跟三位区号,然后是七位电话号码)。
当您运行此脚本时,您将收到来自 Twilio 的电话,要求您分享您对塔巴斯科酱的看法。请诚实。一旦您给出意见,Twilio 将将您的消息转录并发送至您指定的电子邮件地址。
我在发送短信
SMS 消息甚至更容易:不需要 TwiML。而不是使用 Calls API,使用 SMS/Messages API。
my $response = $twilio->POST( 'SMS/Messages',
To => '+15556667777',
From => '+12223334444',
Body => 'Rescue me before '
. 'I fall into despair' );
这就是您使用 Twilio 发送 SMS 消息所需要做的(尽管有 160 个字符的限制)。
结论
Twilio 和 Perl 是一对强大的组合:用这么少的代码可以做这么多。下一部分将介绍使用 TwiML 编写更大的应用程序。
标签
反馈
这篇文章有问题吗?请通过在 GitHub 上打开一个 issue 或 pull request 来帮助我们。