1

MtGox.com WebSocket API で認証しようとしていますが、長い間、JSON データの必要な「呼び出し」属性を完了することができました。しかし、コードサンプルを実行するために Python 2 を使用していて、最終的に API が実装されるアプリケーションが Python 3 で記述されていることに気付きました。Python 3 で動作させようとしたときに、いくつかの問題に遭遇しました。何度か試みても解決できませんでした。

も試し2to3ましたが、この種の問題に対する修正プログラムが組み込まれていないようです。

認証済み API 呼び出しの API 仕様は、 https ://en.bitcoin.it/wiki/MtGox/API/Streaming#Authenticated_commands で確認できます 。

これは、JSON 呼び出しを生成するために使用した Python 2 スクリプトです。その後、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") に関連して遭遇したエラーのいくつかは、他にもいくつかありましたが、残念ながら、さまざまなアプローチをたくさん試したので、それらすべてを追跡できていません。 . 他の言語の同じ機能のコードサンプルも調べましたが、Python 3 の問題に関連する手がかりは見つかりませんでした。Python 3 でバイトと文字列のエンコードとデコードに加えられた変更に多くのことが関係しているようです。

よろしくお願いします!

4

1 に答える 1

5

ついに解決!

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"
    })

私が今どれほど幸せなパンダなのか、あなたたちは知らないでしょう!

于 2013-09-06T19:14:43.167 に答える