はじめに
SwitchBot API v1.1をPostmanから呼び出す に引き続き、RubyでSwitchBot APIを呼び出すテストを行いました。公式の SwitchBot Open API Documents にはPython, JavaScript, C#など代表的な言語のサンプルコードは用意されていますがなぜかRubyはなかったので参考になれば幸いです。
コード
SwitchBotAPIv11.rb
require 'openssl'
require 'securerandom'
require 'base64'
require 'httpclient'
def getDevices
token = "92708d6a34f4ea9f4a79f..."
secret = "00f394fc46f732b6..."
t = (Time.now.to_f * 1000).to_i
nonce = SecureRandom.uuid
payload = "#{token}#{t}#{nonce}"
signature = Base64.strict_encode64(OpenSSL::HMAC.digest('sha256', secret, payload))
client = HTTPClient.new
url = "https://api.switch-bot.com/v1.1/devices"
header = { "Authorization" => token, "sign" => signature, "nonce" => nonce, "t" => t }
response = client.get(url, header: header)
puts (response.body)
end
getDevices
実行結果
$ ruby SwitchBotAPIv11.rb
{"statusCode":100,"body":{"deviceList":[{"deviceId":"44179310230F","deviceName":"デバイス名"...
ハマったポイント
- 唯一ハマったのが
t
(UnixTime)です。RubyのTime.now.to_i
は秒単位までのUnixTimeしか返してくれず、Time.now.to_i
で送っても応答はUnauthorizedになってしまいます。必要なのはミリ秒単位のUnixTimeなのですが、それを送るにはTime.now.to_f * 1000
と小数のUnixTimeを1000倍してから整数に直すという力技が必要になります。