【问题标题】:Python Poloniex API CallPython Poloniex API 调用
【发布时间】:2017-12-24 07:11:49
【问题描述】:

我有以下代码,我正在尝试根据their instructions 对 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')

当我运行它时,我会收到此错误消息

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

有人可以帮忙吗?

【问题讨论】:

    标签: python-3.x api urllib poloniex


    【解决方案1】:
    • 您可以使用urllib.error.HTTPError 捕获HTTP 错误
    • POST数据应该是字节,所以你必须编码parms
    • urllib.request.urlopen 返回一个 HTTPResponse 对象,它没有 request 方法。
      如果你想设置标题和其他参数,你应该使用urllib.request.Request
    • 根据api docs,post 参数应该是'nonce' 和'command',所以我修改了你的函数以接受'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")
    

    【讨论】:

    • 这真是个漂亮的代码人,非常感谢您清理它,非常有帮助。但是,当我运行脚本时,我似乎仍然收到“TypeError:JSON 对象必须是 str,而不是 'bytes'”,我假设这必须转换为字节流,如果是这样,如何做到这一点?跨度>
    • 这很奇怪,json.loads 接受字符串或字节(假设异常是由json.loads(conn.read()) 引发的)。不过,您可以将响应解码为字符串,请参阅更新的代码
    • 好的,已经解决了,谢谢!这次没有错误,但是 403 Forbidden :-(
    • print(balances) 有什么用?
    • 哦,对了..我得到“{'error': 'Invalid API key/secret pair.'}”我假设我需要生成一个新的?
    猜你喜欢
    • 2018-01-02
    • 2017-11-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-24
    相关资源
    最近更新 更多