[教程] Ruby 用阿里云发短信要用哪个 gem?
结论:用 `aliyun-sms` 或者 `aliyun-cloud_sms`
背景介绍
最近(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(右侧是最新版本和该版本的发布时间)
-
aliyun-sms: https://rubygems.org/gems/aliyun-sms | 1.1.1 - March 15, 2018 (12.0 KB)
-
aliyun-cloud_sms: https://rubygems.org/gems/aliyun-cloud_sms | 0.2.3 - January 17, 2021 (11.0 KB)
-
aliyun_sms: https://rubygems.org/gems/aliyun_sms | 0.1.0 - March 26, 2017 (9.0 KB)
-
aliyun-sms-ruby-sdk: https://rubygems.org/gems/aliyun-sms-ruby-sdk | 0.0.1 - March 13, 2017 (10.5 KB)
-
alidayu-sms: https://rubygems.org/gems/alidayu-sms | 0.1.2 - July 19, 2018 (8.0 KB) 阿里云阿里大于短信SDK
-
aliyun-dysms: https://rubygems.org/gems/aliyun-dysms | 0.0.2 - October 19, 2019 (11.5 KB)
-
aliyun_dysms_sdk: https://rubygems.org/gems/aliyun_dysms_sdk | 0.1.0 - June 11, 2021 (8.0 KB)
Github 可以再找到这2个 gem
- https://github.com/rocLv/alisms (最近更新时间: 2018年5月)
- https://github.com/aihehuo/ali_sms (最近更新时间: 2017年11月)
对这些第三方 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
的使用示例
安装:
- 在 Gemfile 里添加
gem 'aliyun-cloud_sms'
- 或者运行
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