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

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

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

POSTはHTTPプロトコルのリクエストメソッドです。ファイルをアップロードしたときや入力フォームが送信されたときなど、クライアントがデータをサーバに送る際に利用されます。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

529閲覧

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

bobby2128

総合スコア42

POST

POSTはHTTPプロトコルのリクエストメソッドです。ファイルをアップロードしたときや入力フォームが送信されたときなど、クライアントがデータをサーバに送る際に利用されます。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

1クリップ

投稿2018/08/05 10:44

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

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

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

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

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

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

python

1import hashlib 2import hmac 3import requests 4import datetime 5import json 6 7 8api_key = "**********" 9api_secret = "*********" 10#上記どちらも取得済みです。セキュリティ上隠させていただいております。 11base_url = "https://bx.in.th" 12path_url = "/api/order/" 13method = "POST" 14 15timestamp = str(datetime.datetime.today()) 16 17param = { 18 "pairing" : "25", 19 "type" : "buy", 20 "amount" : 1.1, 21 "rate" : 16.1, 22} 23body = json.dumps(param) 24 25message = api_key + timestamp + api_secret + body 26 27signature = hmac.new(bytearray(api_secret.encode('utf-8')), message.encode('utf-8') , digestmod = hashlib.sha256 ).hexdigest() 28 29headers = { 30 'ACCESS-KEY' : api_key, 31 'ACCESS-TIMESTAMP' : timestamp, 32 'ACCESS-SIGN' : signature, 33 'Content-Type' : 'application/json' 34} 35 36response = requests.post( base_url + path_url , data = body , headers = headers) 37print( response.status_code ) 38print( response.json() ) 39

以下結果となります。

result

1200 2{'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.'}

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

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

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

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

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

guest

回答1

0

ベストアンサー

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

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

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

Python

1timestamp = 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で送るヘッダーフィールド名が違います。

Python

1'ACCESS-KEY' : api_key, 2'ACCESS-TIMESTAMP' : timestamp, 3'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

Python

1signature = 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データの送り方が違います。(質問文のエラー)

Python

1body = json.dumps(param) 2response = 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/05 11:23

編集2018/08/05 21:19
umyu

総合スコア5846

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

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

bobby2128

2018/08/06 10:30

umyu 様 早々のご回答をいただきありがとうございます。 また、エラーの多い中、項目別にわかりやすくご解説いただきありがとうございました。 アドバイスいただいた内容をよく見て、自分で実行したのち、またこちらに戻ってきます。 ありがとうございます。
bobby2128

2018/08/06 14:04 編集

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() )
umyu

2018/08/06 15:13

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問