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

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

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

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

SSL

SSL(Secure Sockets Layer)とは、暗号化されたプロトコルで、インターネット上での通信セキュリティを提供しています。

API

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

Q&A

解決済

2回答

265閲覧

Rubyでのエラー。APIで情報取得をしたい。。

退会済みユーザー

退会済みユーザー

総合スコア0

Ruby

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

SSL

SSL(Secure Sockets Layer)とは、暗号化されたプロトコルで、インターネット上での通信セキュリティを提供しています。

API

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

0グッド

1クリップ

投稿2018/03/21 10:48

前提・実現したいこと

ZAIFという仮想通貨取引所でAPIを使い、自分の資産状況の取得を試みています。
しかし、どこを変えてもエラーメッセージが出てしまします。
ZAIFのAPIドキュメント(https://techbureau-api-document.readthedocs.io/ja/latest/trade/1_common.html)によると、

「signはPOSTする全てのパラメータ(nonceとmethodおよびメソッド毎のパラメータ)を URLエンコードしたクエリ形式(param1=val1&param2=val2)のメッセージとして、Secret Keyを用いてHMAC-SHA512で署名します。」

と記載がありこれが上手く実現できていないのかもしれません。
プログラミング初心者で上手く理解していないところがあり、わかる方なら簡単なことかもしれません。
お力添え頂けると幸いです。

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

{"success": 0, "error": "signature mismatch"}

該当のソースコード

require 'net/http' require 'uri' require 'json' require "date" require "openssl" require "./Key" key = API_KEY_ZF secret = API_SECRET_ZF timestamp = Time.now.to_i.to_s method1 = "get_info" uri = URI.parse("https://api.zaif.jp/tapi") text = "method=" + method1 + "&nonce=" + timestamp sign = OpenSSL::HMAC.hexdigest(OpenSSL::Digest.new("sha512"), secret, text) initheader = { "key" => key, "sign" => sign, } options = Net::HTTP::Get.new(uri.request_uri, initheader) https = Net::HTTP.new(uri.host, uri.port) https.use_ssl = true response = https.request(options) puts response.body

試したこと

APIキー、シークレットは何度も確認しました。
同様なコードでBitFlerではうまくできました。
ZAIFでもPOSTではなくGET(価格取得など)はうまくいきました。

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

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

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

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

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

guest

回答2

0

ベストアンサー

textがシグネチャを求めることだけに使われていて、実際にデータとして送信されていません。

投稿2018/03/21 12:48

otn

総合スコア84505

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

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

退会済みユーザー

退会済みユーザー

2018/03/21 12:53

ありがとうございます。 実際にデータとして送信するためにはどうしたら良いでしょうか?
otn

2018/03/21 13:01

API仕様を見てないので、具体的にはアドバイスできません。 API仕様を見てください。
退会済みユーザー

退会済みユーザー

2018/03/21 13:03

かしこまりました。ご回答ありがとうございます。
otn

2018/03/21 13:17

そもそも、コードではGETしようとしているようですが、質問文を見るとPOSTしたいようだし、どちらが正しいのでしょうか?コードのコピペミスですか?
退会済みユーザー

退会済みユーザー

2018/03/21 13:43

APIドキュメントにはPOSTと書いてありPOSTをしたいです。元となった別の命令のコードを参考に、今回のを書いてみたのですが、元になったのはGETでした。どこを修正するとPOSTになるのかもわからない状況です。。
otn

2018/03/21 14:06

こういうNet::HTTPの使い方をしたこと無いですが、おそらく、 options = Net::HTTP::Post.new(uri.request_uri, initheader) https = Net::HTTP.new(uri.host, uri.port) https.use_ssl = true response = https.request(options,text) puts response.body
退会済みユーザー

退会済みユーザー

2018/03/21 14:47

ありがとうございます。無事に正しい結果がエラーなしで取得できました! 何日間も悩んでいたことが、otnさんのおかげで数時間で解決しました。 正しい結果が返ってきたときはとても気持ちいいですね。 ありがとうございました!
guest

0

textを捨ててるようですが?

投稿2018/03/21 11:30

asm

総合スコア15147

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

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

退会済みユーザー

退会済みユーザー

2018/03/21 12:14

どういうことでしょうか・・・? 具体的な修正点を教えて頂けると助かります。
退会済みユーザー

退会済みユーザー

2018/03/21 14:53

そちらの記事も参考にしていたのですが、構造がまったく違うようで理解が出来ませんでした。。 TEXTとGET・POSTを変え無事に解決しました。お忙しい中ありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問