質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

API

APIはApplication Programming Interfaceの略です。APIはプログラムにリクエストされるサービスがどのように動作するかを、デベロッパーが定めたものです。

Q&A

解決済

3回答

1358閲覧

Rubyでのエラー。APIの認証が上手くいかない

退会済みユーザー

退会済みユーザー

総合スコア0

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

API

APIはApplication Programming Interfaceの略です。APIはプログラムにリクエストされるサービスがどのように動作するかを、デベロッパーが定めたものです。

0グッド

0クリップ

投稿2018/05/15 23:10

前提・実現したいこと

Rubyを使いAPI経由で取引所で注文をしようと思っています。
しかし、どこを修正しても次のようなエラーメッセージが出てしまいます。(GETを使った残高取得はうまくいきました)
なにが原因でAPIのユーザー認証ができていないのでしょうか?わかる方ご教授頂けますと助かります。

発生している問題・エラーメッセージ

{"error"=>{"code"=>1002, "message"=>"Authorization failed", "description"=>""}}

該当のソースコード

Ruby

1key = API_KEY_HB 2secret = API_SECRET_HB 3 4base = "https://api.hitbtc.com" 5path = '/api/1/trading/new_order' 6timestamp = (DateTime.now.strftime('%Q')).to_s 7postData = "clientOrderId=#{timestamp} 8 &symbol=BTCUSD 9 &side=buy 10 &price=8000 11 &quantity=0.003 12 &type=limit" 13 14url = path + "?nonce=" + timestamp + "&apikey=" + key 15message = url + postData 16 17signature = OpenSSL::HMAC.hexdigest(OpenSSL::Digest.new("sha512"), secret, message) 18 19header = {"X-Signature" => signature, } 20 21uri = URI.parse(base+url) 22options = Net::HTTP::Post.new(uri.request_uri, header) 23https = Net::HTTP.new(uri.host, uri.port) 24https.use_ssl = true 25response = https.request(options,message) 26response_hash = JSON.parse(response.body) 27puts response_hash

試したこと

APIのキーとシークレット(API_KEY_HBとAPI_SECRET_HB)が正しいことは何度も確認しました。
上手くいったGETの残高取得との違いは、次の3点です
・postDataを入れている
・Net::HTTP::Postにした
・https.request(options,message)にした。

補足情報(FW/ツールのバージョンなど)

APIドキュメントは次になりますが、情報が少なく参考になりません。
https://github.com/hitbtc-com/hitbtc-api/blob/master/APIv1.md

また、Javaのサンプルコード等も見てみましたが、Rubyと構成が違うようでレバレッジできませんでした。
https://gist.github.com/hitbtc-com/9808530
https://gist.github.com/hitbtc-com/2765a1431a2384975c01

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

postData = "clientOrderId=#{timestamp} &symbol=BTCUSD &side=buy &price=8000 &quantity=0.003 &type=limit" url = path + "?nonce=" + timestamp + "&apikey=" + key message = url + postData

POSTとGETはパラメータの送信方法が違います
(そもそも、改行・空白混じりってどうなるかちょっと怖い)

message = url + postData

の行を消して後半部分を

ruby

1options = Net::HTTP::Post.new(uri.request_uri, header) 2options.set_form_data clientOrderId: timestamp, 3 symbol: "BTCUSD", 4 side: "buy", 5 price: 8000, 6 quantity: "0.003", 7 type: "limit" 8 9https = Net::HTTP.new(uri.host, uri.port) 10https.use_ssl = true

こんな感じ

投稿2018/05/16 01:22

編集2018/05/16 01:23
asm

総合スコア15147

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2018/05/16 11:04

回答ありがとうございます。 やってみましたが同じエラーが出てしましました。。 構文的にoptions.set_form_data は正しいでしょうか?
umyu

2018/05/16 15:15

>asmさんへ message = url + postDataの行を消してしまうと、X-Signatureヘッダーで送りたい部分が上手く動作しなくなるかと。
guest

0

header = {"X-Signature" => signature, }
この最後の,は必要なのでしょうか?構文エラーになりそうな・・・

投稿2018/05/15 23:16

space-hippy

総合スコア136

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2018/05/15 23:38

回答ありがとうございます。最後の,はあっても問題ありませんでした。(APIでGETの残高取得のときも,はあったままで問題なくデータ取得ができました)
otn

2018/05/16 04:05

matsuihidetoshiさん これは、 xx = { "foo" => 1, "bar" => 2, } のように複数行で書くときに、行の追加削除時に行末のカンマの有無を気にしないでも良いように末尾のカンマはエラーになりません。Cも確かそう。 (1行で書くときは普通は付けませんが)
space-hippy

2018/05/16 04:09

otnさん そうなんですね!僕も勉強になりました!
guest

0

ベストアンサー

postData = "clientOrderId=#{timestamp}

をクエリ形式にするために、

postData = "&clientOrderId=#{timestamp}

と変更したら無事に接続できました。

皆様アドバイスありがとうございました。

投稿2018/05/17 12:11

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問