使用 Twilio 实现短信自动回复功能

作者 QIFAN 日期 2017-04-14
使用 Twilio 实现短信自动回复功能

毕设项目临时决定增加短信功能发放问卷,但并不想提供自己的私人号码也不想手动回复。找了一点资料并搭起一个 sinatra application 用于回复 inbound sms。偶然间第一次接触到了 ruby ,所以写一点儿记录。

整个机制就是:当用户发送信息到 Twillio 的虚拟号码时,API 会向自己预设的 server 发 http 请求,并将结果回复给用户。


主要参考来源:https://www.twilio.com/docs/quickstart/ruby/sms/hello-monkey


1. 搭建环境

必要工具有

  • Ruby
  • Sinatra
  • twilio-ruby library

安装 Ruby

Mac 与 Linux 机子通常已经预装了。用 ruby -v 查看版本。我的是这样。

$ ruby -v
ruby 2.3.0p0 (2015-12-25 revision 53290) [x86_64-darwin14]

如果现实 ruby: command not found ,Mac 与 Linux 按照这个链接进行安装。

安装 RubyGems

Ruby 的第三方依赖通常是用 RubyGems 这一个命令行工具来管理的,所以这个也要安装一下。键入 gem --version 如果出现版本号则已经安装,不然请去这里下。

$ gem --version
2.6.4

安装 Sintra 和 twilio-ruby

$ gem install sinatra twilio-ruby

2. 创建一个本地 Sinatra 应用

应用例子

sms-quickstart.rb

require 'rubygems'
require 'twilio-ruby'
require 'sinatra'
get '/sms-quickstart' do
twiml = Twilio::TwiML::Response.new do |r|
r.Message do |message|
message.Body "Body"
message.Media "https://demo.twilio.com/owl.png"
message.Media "https://demo.twilio.com/logo.png"
end
end
twiml.text
end

/sms-quickstart 是页面名。Body 部分是想要回复的文本内容,Media 则是多媒体文件。

使用的 twilio-ruby 库,API 可以看这里

本地测试

$ ruby test.rb
[2017-04-14 10:43:26] INFO WEBrick 1.3.1
[2017-04-14 10:43:26] INFO ruby 2.3.0 (2015-12-25) [x86_64-darwin14]
== Sinatra (v1.4.8) has taken the stage on 4567 for development with backup from WEBrick
[2017-04-14 10:43:26] INFO WEBrick::HTTPServer#start: pid=48897 port=4567

此时去 http://localhost:4567/sms-quickstart 就可以看见自定义的 Message 了。

3. 在 Heroku 上搭建 Sinatra 应用

由于 twilio 需要一个公开的 url 作为目的地,所以要求将应用布到一个 server 上。我就照着 heroku 上的教程一步步来。

登录 heroku

需要安装 heroku cli,然后登录。

$ heroku login
Enter your Heroku credentials.

写应用

sms-quickstart.rb 已经写好了。

Gemfile

Heroku 通过 Gemfile 来识别 Ruby 程序。而且因为 deploy 到远端时没了本地的环境,所以需要一个文件写出程序的所有依赖,这个文件就是 Gemfile 。文件名就是 Gemfile 。
我的 Gemfile 是这样的,按照自己的改版本号。

source "https://rubygems.org"
ruby "2.3.0"
gem 'sinatra', '1.4.8'
gem 'twilio-ruby', '4.13.0'

如果没有 bundler 运行 gem install bundler 安装先。
然后运行 bundle install 来设置本地。

Procfile

这个文件里写的是启动程序的命令。

web: bundle exec ruby sms-autoreply.rb -p $PORT

本地测试

运行 heroku local 看应用能否在本地正常跑。

$ heroku local
[WARN] No ENV file found
11:01:23 AM web.1 | [2017-04-14 11:01:23] INFO WEBrick 1.3.1
11:01:23 AM web.1 | [2017-04-14 11:01:23] INFO ruby 2.3.0 (2015-12-25) [x86_64-darwin14]
11:01:23 AM web.1 | == Sinatra (v1.4.8) has taken the stage on 5000 for development with backup from WEBrick
11:01:23 AM web.1 | [2017-04-14 11:01:23] INFO WEBrick::HTTPServer#start: pid=49106 port=5000

此时去 http://localhost:5000/sms-quickstart 就可以查看效果了。

应用存入 Git

现在路径下应该有一个 sms-quickstart.rb Gemfile Procfile 三个文件。存到 Git 。

$ git init
$ git add .
$ git commit -m "init"

deploy

在 heroku 创建新的 app

$ heroku create

deploy

$ git push heroku master

此时输入 heroku open 就可以打开 app 的 url ,要进入 ruby 程序记得修改路径和 rb 文件一致。

4. 连接 Twillio

到这里功能以及差不多完成了。然后再去 Twilio 申请一个号码,再去号码下的 Configure 将 Messaging 的 A MESSAGE COMES IN 改为 Webhook ,贴上正确打开 sms-quickstart 的 url,并将 http 方式改为 GET 。


大功告成!此时向 twilio 里买的虚拟号码发送短信,就能自动收到在 Message 中设置的内容啦!

另注:trial 的账号只能给验证过的号码回复,升级成普通账号就可以对任何号码回复了。每条回复 $0.0075 ,还是挺划算的。

Twilio SMS Example