2017-12-24 6 views
1

私はtheir instructionsPythonのPoloniex APIコール

import urllib 
import urllib.request 
import json 
import time 
import hashlib 
import codecs 
import hmac 
import time 


Key = "whatever your key is" 
Sign = "whatever your secret is" 

def returnBalances(balances): 
    nonce = int(round(time.time()-599900000)*10) 
    parms = {"returnBalances":balances, 
      "nonce":nonce} 

    parms = urllib.parse.urlencode(parms) 
    hashed = hmac.new(b'Sign',digestmod=hashlib.sha512) 
    signature = hashed.hexdigest() 

    headers = {"Content-type":"application/x-www-form-urlencoded", 
       "Key":Key, 
       "Sign":signature} 

    conn = urllib.request.urlopen("https://poloniex.com") 
    conn.request("POST","/tradingApi",parms,headers) 

    response = conn.getresponse() 
    print(response.status,response.reason) 

returnBalances('balances') 

に応じてPoloniexするAPI呼び出しを行うにしようとしています次のコードを持って、私はこれを実行すると、私は、このエラーメッセージが表示されます

HTTPError(req.full_url, code, msg, hdrs, fp) 
urllib.error.HTTPError: HTTP Error 403: Forbidden 

缶誰か助けてください?

答えて

1
  • あなたは何requestメソッドを持っていないHTTPResponseオブジェクトを返しurllib.request.urlopenparms
  • をエンコードする必要がありますのでurllib.error.HTTPError
  • POSTデータは、バイトであるべきでHTTPエラーをキャッチすることができます。
    あなたは、ヘッダーやその他のパラメータを設定する場合はapi docsによると、ポストパラメータは「ナンス」と「」コマンドでなければなりませんurllib.request.Request
  • を使用する必要がありますので、私は、パラメータや使用など「returnBalances」を受け入れるように機能を変更それparms["command"]
、非常に役立つことをクリアするために多く見コードの男のおかげで本当にうれしいです
def api_call(command): 
    nonce = int(round(time.time()-599900000)*10) 
    parms = {"command":command, "nonce":nonce} 
    parms = urllib.parse.urlencode(parms).encode() 

    hashed = hmac.new(Sign.encode(), parms, digestmod=hashlib.sha512) 
    signature = hashed.hexdigest() 
    headers = {"Key":Key, "Sign":signature} 

    req = urllib.request.Request("https://poloniex.com/tradingApi", headers=headers) 
    try: 
     conn = urllib.request.urlopen(req, data=parms) 
    except urllib.error.HTTPError as e: 
     conn = e 
    print(conn.status,conn.reason) 
    return json.loads(conn.read().decode()) 

balances = api_call("returnBalances") 
+0

インチしかしスクリプトを実行すると、まだ "TypeError"が出ているようです:JSONオブジェクトはstrでなく 'bytes'でなければなりません。 "これはバイトストリームに変換されなければならないと仮定しています。 – Jo3Dirt

+0

これは奇妙なことですが、[json.loads](https://docs.python.org/3/library/json.html#json.loads)は文字列またはバイトを受け入れます(例外は 'json.loads(conn .read()) ')。それでも、あなたは文字列への応答をデコードすることができます。更新されたコード –

+0

を参照してください。今度はエラーはありませんが、403禁止されています:-( – Jo3Dirt

関連する問題