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

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

ただいまの
回答率

90.12%

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

解決済

回答 2

投稿

  • 評価
  • クリップ 1
  • VIEW 1,024
退会済みユーザー

退会済みユーザー

 前提・実現したいこと

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(価格取得など)はうまくいきました。

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

checkベストアンサー

+1

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/03/21 22:43

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

    キャンセル

  • 2018/03/21 23: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 23:47

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

    キャンセル

0

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/03/21 21:14

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

    キャンセル

  • 2018/03/21 23:22

    既にRubyでZaifへのAPIアクセスを行うコードを書いた人がいるようです。
    https://qiita.com/monamour555/items/e2776cf0ff6699e26446

    エンドポイントが現在のURLと異なってはいるようですが

    キャンセル

  • 2018/03/21 23:53

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

    キャンセル

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

  • ただいまの回答率 90.12%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る