Skip to content

Instantly share code, notes, and snippets.

@xiaohui-zhangxh
Created March 15, 2020 13:53
Show Gist options
  • Select an option

  • Save xiaohui-zhangxh/e21d71d9f90a878ca5b7a5aeb5408077 to your computer and use it in GitHub Desktop.

Select an option

Save xiaohui-zhangxh/e21d71d9f90a878ca5b7a5aeb5408077 to your computer and use it in GitHub Desktop.

Revisions

  1. xiaohui-zhangxh created this gist Mar 15, 2020.
    54 changes: 54 additions & 0 deletions ucloud_api.rb
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,54 @@
    # frozen_string_literal: true

    require 'json'
    require 'net/http'
    require 'digest'

    class UcloudAPI
    API_HOST = 'https://api.ucloud.cn'

    def initialize(public_key, private_key)
    @public_key = public_key
    @private_key = private_key
    end

    def request_api(action, params)
    data = process_params(params).merge('Action' => action, 'PublicKey' => public_key)
    data['Signature'] = signature(data)
    body = Net::HTTP.get(URI(API_HOST + '?' + URI.encode_www_form(data)))
    JSON.parse(body)
    end

    private

    attr_reader :public_key, :private_key

    def process_params(params)
    new_params = {}
    params.each_pair do |key, value|
    if value.is_a?(Array)
    value.each_with_index do |val, idx|
    new_params["#{key}.#{idx}"] = val
    end
    else
    new_params[key] = value
    end
    end
    new_params
    end

    def signature(params)
    sha1 = Digest::SHA1.new
    params.keys.sort_by(&:to_s).each do |key|
    sha1 << key << params[key].to_s
    end
    sha1 << private_key
    sha1.hexdigest
    end
    end

    if $0 == __FILE__
    public_key, private_key = ARGV[0,2]
    client = UcloudAPI.new(public_key, private_key)
    pp client.request_api('DescribeEIP', 'Region' => 'cn-bj2', 'ProjectId' => 'org-hencnd')
    end