使用 Twilio MMS、Morbotron 和 Ruby 构建 Futurama Quote-bot
介绍
早在 8 月份,我就向 hack.guides() 教程竞赛提交了一份指南,内容是关于使用 Twilio MMS、Frinkiac 和 Python 构建辛普森一家引言机器人。我非常喜欢写这篇文章,所以我决定用一种我不太熟悉的语言重写一个类似的版本:Ruby。我还想尝试一下Morbotron,这是一个由开发 Frinkiac 的同一团队制作的数据库。
在本教程中,我们将使用 Twilio 和 Morbotron(Futurama 的名言和屏幕截图数据库)创建一个 Ruby 应用程序,该应用程序将每天通过MMS自动向我们发送 Futurama 的屏幕截图和名言。最棒的是,我们将用不到 50 行 Ruby 代码来实现这一点。没错,没有 cron 作业,没有服务器,只有 Ruby。
如果您不想跟着一起做,只想查看完成的代码,请查看 Github存储库。
入门
在我们开始编写代码之前,我们需要设置我们的环境。
Ruby 和 Ruby 版本管理器
对于这个项目,我将使用Ruby 版本管理器(RVM) 安装 Ruby 版本 2.3.0。我建议按照 RVM 的快速安装指南进行设置。安装后,运行以下命令安装必要的 Ruby 版本:
$ source ~/.rvm/scripts/rvm
$ rvm install 2.3.0
$ rvm use 2.3.0
如果您看到消息“RVM 不是函数”,则使用“rvm use ...”选择红宝石将不起作用。继续之前请参阅此 StackOverflow 帖子。
Ruby 库
一旦 RVM 和 Ruby 准备就绪,我们将需要安装一些 Ruby 库或gems。使用bundler来处理这个问题是个好主意。以下命令将安装 bundler,我们可以使用它来下载和安装我们需要的所有外部库:
$ gem install bundler
接下来,创建一个gemfile。 Bundler 使用它来安装我们的库。在项目目录中创建一个名为Gemfile 的新文件,并使用以下命令添加twilio、rufus-scheduler和httparty gem:
source 'https://rubygems.org'
gem 'httparty'
gem 'rufus-scheduler'
gem 'twilio-ruby'
保存Gemfile。我们现在可以通过在同一目录中运行以下命令来安装所需的所有 gem:
$ bundle install
让我们分解一下我们刚刚安装的内容。
- 'rufus-scheduler' ——一种流行的 Ruby 作业调度程序,它允许我们在特定的时间间隔执行给定的方法。
- 'httparty' - 简化 HTTP 请求的 gem。我们将使用它向 Morbotron API 发出 GET 请求,因为没有官方的 API 包装器。
- 'twilio-ruby' ——使用 Twilio REST API 的官方 Ruby 宝石。
Twilio 账户
最后,确保您拥有 Twilio 帐户。如有必要,请免费注册。由于我们正在开发具有 MMS 功能的 Quote-bot,因此您需要一个可以处理 MMS 和 SMS 的Twilio 电话号码。使用电话号码仪表板按电话号码检查功能。完成所有设置后,您就可以开始构建 Quote-bot 了。
构建我们的应用程序
现在是时候开始构建我们的应用程序了。在您的Gemfile目录中,使用您喜欢的编辑器打开一个名为morbotron.rb的新文件。
在此文件的顶部添加以下行:
require 'twilio-ruby'
require 'rufus-scheduler'
require 'httparty'
# Set up a client to talk to the Twilio REST API.
account_sid = 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' # Your Account SID from www.twilio.com/console
auth_token = 'YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY' # Your Auth Token from www.twilio.com/console
@client = Twilio::REST::Client.new account_sid, auth_token
# Set up our scheduler.
scheduler = Rufus::Scheduler.new
上述代码中的前三行只是导入了我们刚刚安装的所有库。导入后的三行配置并创建了一个Twilio::REST::Client对象,该对象将允许我们调用Twilio REST API 。请确保将account_sid和auth_token的值替换为你的实际帐户 SID 和身份验证令牌。你可以在Twilio 帐户仪表板中找到这些值。最后一行创建了我们的调度程序,我们将很快对其进行配置。
重要提示:切勿将包含 API 凭据的代码推送到公共存储库。请参阅本文底部的“可选步骤”部分,了解使用 Twilio API 密钥的替代方法。
接下来添加以下get_quote方法:
def get_quote
r = HTTParty.get('https://morbotron.com/api/random')
# Check if our request had a valid response.
if r.code == 200
json = r.parsed_response
# Extract the episode number and timestamp from the API response.
_, episode, timestamp = json["Frame"].values
# Build a proper URL
image_url = "https://morbotron.com/meme/" + episode + "/" + timestamp.to_s
# Combine each line of subtitles into one string, seperated by newlines.
caption = json["Subtitles"].map{|subtitle| subtitle["Content"]}.join("\n")
return image_url, caption
end
end
get_quote使用httparty向 Morbotron 发送 GET 请求。这将检索有关随机 Futurama 时刻的数据。虽然 Morbotron 在技术上不是 API,但整个站点都是基于 React 并通过 HTTP 获取资源。因此,我们可以像使用 API 一样使用该站点。
接下来,我们将检索到的数据转换为JSON,提取时间戳和剧集代码,并将时间戳转换为字符串。时间戳和剧集用于创建指向随机《飞出个未来》时刻屏幕截图的 URL。
最后,我们从 JSON 中获取每一行字幕的内容并将它们连接在一起以形成屏幕截图的标题。
现在让我们添加我们需要的唯一其他方法:
def send_MMS
media, body = get_quote
begin
@client.messages.create(
body: body,
media_url: media,
to: '+12345678901', # Replace with your phone number
from: '+12345678901' # Replace with your Twilio number
)
puts "Message sent!"
rescue Twilio::REST::RequestError => e
puts e.message
end
end
此方法首先调用我们在上一步中创建的get_quote方法并存储其返回值。上面的begin / rescue块改编自Twilio Ruby Helper Library文档。这些行只是接收一些参数并将它们转换为对 Twilio REST API 的调用。
将to和from参数分别替换为您的手机真实电话号码和您的 Twilio 电话号码。我建议您检查您的终端,看看 API 调用期间是否发生任何错误。
现在在我们的文件底部,在我们刚刚添加的两个方法下面,插入以下三行:
scheduler.every '24h' do
send_MMS
end
scheduler.join
rufus-scheduler允许您直观地设置方法的频率。我们的应用程序现在将根据调度程序运行,这意味着send_MMS将每 24 小时无限期调用一次,或者直到您退出应用程序。
测试我们的应用程序
为了测试应用程序,最好将上面添加的计划更改为更频繁地运行。例如,scheduler.every '30s' do将每 30 秒而不是每 24 小时调用一次send_MMS方法。
更改后,请确保保存morbotron.rb。返回终端并运行以下命令:
$ ruby morbotron.rb
您的终端看起来好像冻结了。这只意味着您的应用正在运行。30</str
免责声明:本内容来源于第三方作者授权、网友推荐或互联网整理,旨在为广大用户提供学习与参考之用。所有文本和图片版权归原创网站或作者本人所有,其观点并不代表本站立场。如有任何版权侵犯或转载不当之情况,请与我们取得联系,我们将尽快进行相关处理与修改。感谢您的理解与支持!
请先 登录后发表评论 ~