使用 Ruby 和 运行 连接到 Coinbase API 进入连接问题。法拉第
Connecting to Coinbase API with Ruby and running into connection issue. Faraday
正在尝试使用 Ruby 连接到 Coinbase GDAX 沙箱 API。
目前正在使用 Faraday,但欢迎 HTTParty 或 Ruby Core API 建议。
我在发出 post 请求时遇到了困难,似乎无法分辨我在哪里搞砸了。
出现了一大堆错误,但最重要的是:
/System/Library/Frameworks/Ruby.framework/Versions/2.3/usr/lib/ruby/2.3.0/net/http/header.rb:18:in
block in initialize_http_header': undefined method
strip' for
1556021965:Fixnum (NoMethodError)
Coinbase 文档:https://docs.pro.coinbase.com/?ruby#signing-a-message
我的 api 电话简而言之。
payload = {
"data": "DATA"
}
url = 'https://api-public.sandbox.gdax.com/orders'
conn = Faraday.new
response = conn.post do |req|
req.url url
req.headers['REQ-HEADER-1'] = "FOO",
req.headers['REQ-HEADER-1'] = "BAR",
req.body = payload
end
puts response
完整代码
require 'Faraday' require 'base64' require 'openssl' require 'json'
class foo
def initialize
@api_key = '25b1d259417d159443c03ed14eb9ee49'
@api_secret = 'trBTZUj4zLfHEBfbQy3+LeLOaAeAbfG/zCqIvzu3RyiKhqf5y85NYqqZi7GUSBCzhryud1pyOs5idibzdOx/tw=='
@api_pass = '7zkf0bvr6q4'
end
def signature(request_path='', body='', timestamp=nil, method='POST')
body = body.to_json if body.is_a?(Hash)
timestamp = Time.now.to_i if !timestamp
what = "#{timestamp}#{method}#{request_path}#{body}";
# create a sha256 hmac with the secret
secret = Base64.decode64(@api_secret)
hash = OpenSSL::HMAC.digest('sha256', secret, what)
Base64.strict_encode64(hash)
end
def post_buy
usd = get_usd_available
usd = usd / 2
payload = {
"funds": usd.to_s,
"product_id": "BTC-USD",
"side": "buy",
"type": "market"
}
url = 'https://api-public.sandbox.gdax.com/orders'
conn = Faraday.new
response = conn.post do |req|
req.url url
req.headers['CB-ACCESS-KEY'] = @api_key,
req.headers['CB-ACCESS-SIGN'] = signature( url, payload),
req.headers['CB-ACCESS-TIMESTAMP'] = Time.now.to_i,
req.headers['CB-ACCESS-PASSPHRASE'] = @passphrase,
req.body = payload
end
puts response
end
end
foo.new.post_buy
您可以查看 http/header.rb 处的代码:它在每个 header 上调用 strip
,因此每个 header 值都应该是一个字符串。
我认为这是有问题的行,您在这里提供一个整数作为 header 值:
req.headers['CB-ACCESS-TIMESTAMP'] = Time.now.to_i
将其转换为字符串应该可以修复它:
req.headers['CB-ACCESS-TIMESTAMP'] = Time.now.to_i.to_s
正在尝试使用 Ruby 连接到 Coinbase GDAX 沙箱 API。 目前正在使用 Faraday,但欢迎 HTTParty 或 Ruby Core API 建议。
我在发出 post 请求时遇到了困难,似乎无法分辨我在哪里搞砸了。
出现了一大堆错误,但最重要的是:
/System/Library/Frameworks/Ruby.framework/Versions/2.3/usr/lib/ruby/2.3.0/net/http/header.rb:18:in
block in initialize_http_header': undefined method
strip' for 1556021965:Fixnum (NoMethodError)
Coinbase 文档:https://docs.pro.coinbase.com/?ruby#signing-a-message
我的 api 电话简而言之。
payload = {
"data": "DATA"
}
url = 'https://api-public.sandbox.gdax.com/orders'
conn = Faraday.new
response = conn.post do |req|
req.url url
req.headers['REQ-HEADER-1'] = "FOO",
req.headers['REQ-HEADER-1'] = "BAR",
req.body = payload
end
puts response
完整代码
require 'Faraday' require 'base64' require 'openssl' require 'json'
class foo
def initialize
@api_key = '25b1d259417d159443c03ed14eb9ee49'
@api_secret = 'trBTZUj4zLfHEBfbQy3+LeLOaAeAbfG/zCqIvzu3RyiKhqf5y85NYqqZi7GUSBCzhryud1pyOs5idibzdOx/tw=='
@api_pass = '7zkf0bvr6q4'
end
def signature(request_path='', body='', timestamp=nil, method='POST')
body = body.to_json if body.is_a?(Hash)
timestamp = Time.now.to_i if !timestamp
what = "#{timestamp}#{method}#{request_path}#{body}";
# create a sha256 hmac with the secret
secret = Base64.decode64(@api_secret)
hash = OpenSSL::HMAC.digest('sha256', secret, what)
Base64.strict_encode64(hash)
end
def post_buy
usd = get_usd_available
usd = usd / 2
payload = {
"funds": usd.to_s,
"product_id": "BTC-USD",
"side": "buy",
"type": "market"
}
url = 'https://api-public.sandbox.gdax.com/orders'
conn = Faraday.new
response = conn.post do |req|
req.url url
req.headers['CB-ACCESS-KEY'] = @api_key,
req.headers['CB-ACCESS-SIGN'] = signature( url, payload),
req.headers['CB-ACCESS-TIMESTAMP'] = Time.now.to_i,
req.headers['CB-ACCESS-PASSPHRASE'] = @passphrase,
req.body = payload
end
puts response
end
end
foo.new.post_buy
您可以查看 http/header.rb 处的代码:它在每个 header 上调用 strip
,因此每个 header 值都应该是一个字符串。
我认为这是有问题的行,您在这里提供一个整数作为 header 值:
req.headers['CB-ACCESS-TIMESTAMP'] = Time.now.to_i
将其转换为字符串应该可以修复它:
req.headers['CB-ACCESS-TIMESTAMP'] = Time.now.to_i.to_s