Ruby
Rails
zoom
zooms

zoomusを使いたい

zoomusとは

zoomのapi?

zoomとは

これ
https://zoom.us/jp-jp/meetings.html
Skypeみたいに通話できるツール

やりたいこと(できていない)

zoomusのapiを使ってzoomを利用(誰かと通話)すること

zoomのドキュメント

https://devdocs.zoom.us/docs

言語

Ruby
理由:とあるサービスをRailsで作る予定だから

GitHubにあったライブラリ

https://github.com/mllocs/zoomus

おそらくやること

・JWTでトークンを取得
・トークンからuser_idを取得?
・user_idlから通話?

やったこと

http://r9.hateblo.jp/entry/2018/01/30/081534
これを見る限りは
・JWTでトークンを取得
・トークンからuser_idを取得?
・user_idlから通話?
なんだけどなぁ。。。同じことをrubyでどうやってできるのだろうか

JWT

Rubyでjwtを利用する
https://blog.shimar.me/2017/02/10/ruby-jwt.html

zoom APIでの利用はHS256

https://devdocs.zoom.us/docs/jwt

Warning
The Zoom API uses HS256. Use of other algorithms may produce unexpected results.

Claimはissとexp

  • iss:zoom APIキー
  • exp :有効期限:現在の時刻から+整数

Note
The expiration time (exp) can be defined in a numeric date time format.

expは日付形式

https://github.com/jwt/ruby-jwt
これのpayloadでClaimを設定すればOKっぽい=> JWTはクリアできそう
以下の内容でJWTは生成できた

module ApplicationHelper
    class TS_Zoom
        def GenerateJWT
            payload = { 
                iss: 'api_key', #api_key
                exp: Time.now.to_i + 4 * 3600
            }
            secret  = 'secret_key' #secret_key
            token = JWT.encode payload, secret, 'HS256'
            return token
        end
    end
end

しかし、ターミナルで以下を打っても(23) Failed writing body と出る
curl -H 'Authorization: Bearer JWTの文字列' https://api.zoom.us/v2/users | jq .
ターミナルでcurl -H 'Authorization: Bearer JWTの文字列' https://api.zoom.us/v2/usersを打てばユーザ情報がでる

あとは、リクエストをRubyでどう扱うか、、、
https://docs.ruby-lang.org/ja/latest/class/Net=3a=3aHTTP.html
が使えるようです。
POSTの使い方はこちらかな
https://qiita.com/seisonshi/items/c23c0154c45ccbfa9999

以下のコード書いて実行してみた。

module ApplicationHelper
    class TS_Zoom
        def initialize
            @api_key = "aaa"
            @secret  = "bbb"
            @user_id = "ccc"
            @jwt = "ddd"
            @meeting_url = "eee"
        end
        def GenerateJWT
            payload = { 
                iss: @api_key,
                exp: Time.now.to_i + 4 * 36000
            }
            token = JWT.encode payload, @secret, 'HS256'
            return token
        end

        def GetUserData(_token)
            uri = URI.parse("https://api.zoom.us/v2/users")
            request = Net::HTTP::Get.new(uri)
            request["Authorization"] = "Bearer "+_token
            req_options = {
                use_ssl: uri.scheme == "https",
            }
            response = Net::HTTP.start(uri.hostname, uri.port, req_options) do |http|
                http.request(request)
            end
            result = JSON.parse(response.body)
            return result["users"][0]["id"].to_s
        end

        def GetMeetingURL
            @jwt = self.GenerateJWT
            @user_id = self.GetUserData(@jwt)
            @meeting_url = "https://api.zoom.us/v2/users/#{@user_id}/meetings"

            uri = URI.parse(@meeting_url)
            http = Net::HTTP.new(uri.host, uri.port)

            http.use_ssl = true
            http.verify_mode = OpenSSL::SSL::VERIFY_NONE

            req = Net::HTTP::Post.new(uri.path)
            req["Authorization"] = "Bearer #{@jwt}"
            aa = "Bearer #{@jwt}"
            puts aa
            req["Content-Type"] = "application/json"
            req.body = {
                "type":1,
                }.to_json
            res = http.request(req)
            puts res.class
            puts res.code
            puts res.body
            return res
        end
    end
end

結果
ホストのURLとJoinのURLが表示されアクセスすると通話成功!