Python 3中对MtGox WebSocket API的经过身份验证的调用



我正在尝试使用MtGox.com WebSocket API进行身份验证,并在很长一段时间后成功完成了JSON数据所需的"调用"属性。然而,我意识到我正在使用Python 2来运行我的代码样本,API最终将在其中实现的应用程序是用Python 3编写的。当我试图在Python3中实现它时,我遇到了几个问题,尽管我做了几次长时间的尝试,但都无法解决。

我也尝试过2to3,但它似乎没有针对这类问题的内置修复程序。

通过身份验证的API调用的API规范可在此处找到:https://en.bitcoin.it/wiki/MtGox/API/Streaming#Authenticated_commands

以下是我用于生成JSON调用的Python2工作脚本,然后我通过为Chrome找到的WebSocket控制台扩展运行了该脚本。

import hashlib
import time
import hmac
import json
import base64
import binascii
apikey = ""
apisecret = ""
def _nonce():
    """produce a unique nonce that is guaranteed to be ever increasing"""
    microtime = int(time.time() * 1E6)
    return microtime
def _reqid(nonce):
    return hashlib.md5(str(nonce)).hexdigest()
def send_signed_call(api_endpoint, params):
    nonce = _nonce()
    reqid = _reqid(nonce)
    call = json.dumps({
        "id"       : reqid,
        "nonce"    : nonce,
        "call"     : api_endpoint,
        "params"   : params,
    })
    sign = hmac.new(base64.b64decode(apisecret), call, hashlib.sha512).digest()
    signedcall = apikey.replace("-", "").decode("hex") + sign + call
    return json.dumps({
        "op"      : "call",
        "call"    : base64.b64encode(signedcall),
        "id"      : reqid,
        "context" : "mtgox.com"
    })
msg = send_signed_call("private/info", {})
print(msg)

我遇到的一些错误与不再存在的String.decode("hex")有关,我也遇到过一些错误,但不幸的是,由于我尝试了很多不同的方法,我没有跟踪所有错误。我还查看了其他语言中相同功能的代码示例,但找不到任何与Python3问题有关的线索。这似乎与Python3中对字节和字符串编码和解码所做的更改有很大关系。

提前感谢!

终于解决了!

这是send_signed_call功能的工作版本,享受:

def send_signed_call(api_endpoint, params):
    nonce = _nonce()
    reqid = _reqid(nonce)
    call = json.dumps({
        "id"       : reqid,
        "nonce"    : nonce,
        "call"     : api_endpoint,
        "params"   : params,
    })
    callByte = bytes(call, "utf-8")
    sign = hmac.new(base64.b64decode(api_secret), callByte, hashlib.sha512).digest()
    skey = bytes.fromhex(api_key.replace("-",""))
    signedcall = skey + sign + callByte
    return json.dumps({
        "op"      : "call",
        "call"    : base64.b64encode(signedcall).decode("utf-8"),
        "id"      : reqid,
        "context" : "mtgox.com"
    })

你们根本不知道我现在是一只多么快乐的熊猫!

相关内容

  • 没有找到相关文章

最新更新