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

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

ただいまの
回答率

90.12%

プライベートAPIにポストしたいです。アドバイスお願いいたします。

解決済

回答 1

投稿

  • 評価
  • クリップ 1
  • VIEW 762

bobby2128

score 40

pythonを用いたAPIの利用について勉強中の者です。
この度、プライベートAPIを用いて、ポストによって注文をしたいと考えております。(ライブラリ利用ではなく)

こちらのサイトを参考にさせていただき、
以下のようにpythonコードを書き、Jupyter上で実行すると、resultに示すような結果となり、うまくいきませんでした。

対象とする取引所のAPIドキュメントはこちらのようになっております。

それぞれの構文の意味はなんとなく理解しているつもりではございますが、
失敗続きで悲しんでおります。

アイデアやアドバイスいただけますと幸甚に存じます。

よろしくお願いいたします。

import hashlib
import hmac
import requests
import datetime
import json


api_key = "**********"
api_secret = "*********"
#上記どちらも取得済みです。セキュリティ上隠させていただいております。
base_url = "https://bx.in.th"
path_url = "/api/order/"
method = "POST"

timestamp = str(datetime.datetime.today())

param = {
    "pairing" : "25",
    "type" : "buy",
    "amount" : 1.1,
    "rate" : 16.1,
}
body = json.dumps(param)

message = api_key + timestamp + api_secret + body

signature = hmac.new(bytearray(api_secret.encode('utf-8')), message.encode('utf-8') , digestmod = hashlib.sha256 ).hexdigest()

headers = {
    'ACCESS-KEY' : api_key,
    'ACCESS-TIMESTAMP' : timestamp,
    'ACCESS-SIGN' : signature,
    'Content-Type' : 'application/json'
}

response = requests.post( base_url + path_url , data = body , headers = headers)
print( response.status_code )
print( response.json() )

以下結果となります。

200
{'success': False, 'order_id': 0, 'error': 'You did not set any API key. Make sure you send your request as POST form-data, and not as GET or JSON body request.'}
  • 気になる質問をクリップする

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 1

checkベストアンサー

+5

参考にしているページの取引所はbifFlyerで対象とする取引所bx.in.thなので送り方まず違います。

プライベートAPIを一回も叩いたことがない場合は
ライブラリを利用してそのライブラリのリクエスト内容をFiddlerで確認するのが一番早いのですが。

APIを使った事はないですが、ドキュメントを見て、コード上違ってそうな部分を指摘します。
1, ノンスの型と送る値 unixタイム(要するに数値です)、以下は文字列です。
ノンスは相手の取引所APIが許容する桁数がドキュメントに一切記載されていないので
いろいろ試してください。A取引所のAPIはノンスはこの桁までOK、B取引所はこの桁までOKと取引所で違います。そしてその件はAPIドキュメントに一切書かれていません。

timestamp = str(datetime.datetime.today())

Nonce
This is an integer value that must increase with every API call you make, for example if your first API call uses nonce=1 then the next API call must use a nonce of 2 or greater

A common practice is to use unix time for that parameter.

2, Postで送るヘッダーフィールド名が違います。

'ACCESS-KEY' : api_key,
'ACCESS-TIMESTAMP' : timestamp,
'ACCESS-SIGN' : signature,

Every query to the private API must include the following POSTed fields:

key - API Key
nonce - Nonce
signature - Signature

3, 署名部分HMACが不要です、そしてパラメータが違います。
署名形式:HMAC-256 → SHA-256
パラメータ:api_key、nonce、api_secret

signature = hmac.new(bytearray(api_secret.encode('utf-8')), message.encode('utf-8') , digestmod = hashlib.sha256 ).hexdigest()

Signature
A SHA-256 hash of the following data api_key + nonce + api_secret

4, jsonデータの送り方が違います。(質問文のエラー)

body = json.dumps(param)
response = requests.post( base_url + path_url , data = body , headers = headers)

requestsを使った正しいjsonの送り方はjson = paramです。


5, 回答した後思い出したのですが、質問文のコードはJSON文字列で送っていますが。
相手のAPIがjson文字列で送信しなさいってAPIドキュメントのどこに書いてありましたか?
仮想通貨のAPIはbodyにURLエンコード(クエリ文字列形式)で送ることが多いのですが。

6, bodyデータをpostしていますが、keynoncesignatureが含まれていません。

Create Order
POST: https://bx.in.th/api/order/

POSTed fields (in addition to the standard key, nonce, signature fields:

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2018/08/06 19:30

    umyu 様
    早々のご回答をいただきありがとうございます。
    また、エラーの多い中、項目別にわかりやすくご解説いただきありがとうございました。

    アドバイスいただいた内容をよく見て、自分で実行したのち、またこちらに戻ってきます。
    ありがとうございます。

    キャンセル

  • 2018/08/06 23:01 編集

    umyu 様
    多くのアドバイスをいただきありがとうございました。
    いただいたアドバイスをもとに、自身でも検索しながら、ひとつひとつを理解しながら進めることができました。実際に動いたとき、感動しました。

    この度は誠にありがとうございました。

    下記、同様に悩まれている方の参考になれば幸いです。

    import hashlib
    import hmac
    import requests
    import datetime
    import json

    import time
    import urllib.parse

    api_key = "*********"
    api_secret = "************"

    base_url = "https://bx.in.th"
    path_url = "/api/order/"
    method = "POST"

    unix=int(time.time())
    nonce=str(unix)
    print(nonce)

    message = api_key + nonce + api_secret

    signature = hashlib.sha256(message.encode('utf-8')).hexdigest()

    params = {
    "pairing" : "25",
    "type" : "buy",
    "amount" : 11.0,
    "rate" : 10.1,
    'key' : api_key,
    'nonce' : nonce,
    'signature' : signature,
    }

    response = requests.post( base_url + path_url , data = params)
    print( response.status_code )
    print( response.json() )

    キャンセル

  • 2018/08/07 00:13

    @bobby2128さんへ
    解決してよかったですー。

    キャンセル

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

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