[教程] Ruby 用阿里云发短信要用哪个 gem?

结论:用 `aliyun-sms` 或者 `aliyun-cloud_sms`

[教程] Ruby 用阿里云发短信要用哪个 gem?

背景介绍

最近(2021年11月)我又花了一些时间弄 Ruby 发阿里云短信的事情,
找了一下所有和短信发送相关的 ruby gem,都看了一下,本文章内写了总结。
对读者的价值是:节省读者大约30分钟时间,因为你不需要自己再去搜索市面上的所有 gem 然后对比他们。

这篇文章适合谁来阅读?

Ruby 开发者(不需要有任何阿里云的基础)

写这篇文章还有一个原因

就是看到谷歌上面并没有优质的信息。请看如下两张截图。
我的搜索关键字是 "ruby 用阿里云发短信"

第一张截图,排名第一的那条,是我之前写的一篇文章。2020年2月写的,主要是介绍 gem 'aliyun-sms'。

第三条信息是 Ruby China 论坛里,
2017年2月的一篇文章,是 gem 'aliyun-sms' 的作者发的帖子。

第一页的下半部分,v2ex 这条红框也是我发的帖子,那个时候2018年我查了市面上很多短信服务商,最后得出来的结论是大家的价格都差不多,那既然差不多就用阿里云呗。

然后另外几条,一个是 Python 一个是 SMTP 一个是 Github 链接,都算不上什么有效信息。

问题1:用哪个 gem?

截止到目前2021年11月17号,阿里云官方并没有给短信服务推出 Ruby gem。
尽管上一篇文章 里提到了 "aliyunsdkcore" gem,但由于我没有实际用过这个 gem,所以不予评价。

在 Rubygems 可以找到如下的 gem(右侧是最新版本和该版本的发布时间)

Github 可以再找到这2个 gem

对这些第三方 gem 的评价

阿里大于已经2021年1月1号正式停止了,所以列表里最底下那3个 gem 废了: 、

  • alidayu-sms
  • aliyun-dysms
  • aliyun_dysms_sdk

剩下的:

  • aliyun-sms-ruby-sdk 只有发送功能,文档还凑合,最近更新是2017年,不建议使用。

  • aliyun_sms 情况类似,文档比较简略,最近更新也是2017年

  • aliyun-sms Rubygems 下载量排名第二,这个是我目前在用的 gem。

  • aliyun-cloud_sms 看起来也不错,今年(2021年)1月份才更新过, Rubygems 下载量排第一(28,660) ,文档仍有改进空间。

结论

截止到2021年11月17日写下这篇文章时,
在所有第三方 gem 里,推荐使用这2个:

  • aliyun-sms
  • aliyun-cloud_sms

这2个我都用过。

  • 其中 aliyun-sms 我在生产环境中用了,它只有发短信的功能。其他的没有。
  • aliyun-cloud_sms 我是最近才试用的,它可以发短信也可以查询发送结果。查询发送结果指的是用 QuerySendDetails(如下图所示)

如果你只是发短信,别的不在乎,那么这俩 gem 你都可以用,如果你觉得新版本发布时间更接近现在的比较好,可以用 aliyun-cloud_sms

如果你需要查询发送结果,就只能用 aliyun-cloud_sms

以下是 aliyun-cloud_sms 的使用示例

安装:

  1. 在 Gemfile 里添加 gem 'aliyun-cloud_sms'
  2. 或者运行 gem install aliyun-cloud_sms

比如你可以把以下代码写入 test/aliyun_sms.rb
运行的时候就 ruby ./test/aliyun_sms.rb 就行了

require 'dotenv/load' # 这样才会去读取 .env 文件
require "aliyun/cloud_sms" # 引入短信 gem

# 读取环境变量里的配置信息
AccessKey_ID = ENV['ALIYUN_SMS_ACCESS_KEY_ID']
AccessKey_Secret = ENV['ALIYUN_SMS_ACCESS_KEY_SECRET']
Sign_Name = ENV['ALIYUN_SMS_SIGN_NAME']
# puts AccessKey_ID
# puts AccessKey_Secret
# puts Sign_Name

# Client 初始化
client = Aliyun::CloudSms::Client.new(AccessKey_ID, AccessKey_Secret, Sign_Name)
# 这里吐槽一句,这个 gem 的中文文档是错的,里面写的是 client = Aliyun::CloudSms.new('your_access_key_id', 'your_access_key_secret', 'your_sign_name')
# 如果你这么用,会报错的。
# 正确的做法:Aliyun::CloudSms::Client.new
# 错误的做法:Aliyun::CloudSms.new

# 手机号
phone = '135xxxx0000' # 自己改,填你的手机号

# 阿里云短信模板
template_code = "SMS_227010129" # 自己改,填你账号里的模板号

# 模板参数
template_params = {}

# 实际发送短信
resp = client.send_msg(phone, template_code, template_params)

# 看一下返回的内容
puts resp # {"RequestId":"EDE9D96B-3432-5993-8C75-A84C84DF57A1","Message":"OK","BizId":"294421737133554357^0","Code":"OK"}

# 返回的类型是
puts resp.class # RestClient::Response

# 根据文档,我们明确调用 body 方法
puts resp.body # {"RequestId":"388E7267-585B-5EDC-BA9E-E4B78DAFC05A","Message":"OK","BizId":"264216237133696309^0","Code":"OK"}

# 这样返回的才是字符串
puts resp.body.class # String

全文完