使用Python连接到MtGox API 2的问题

时间:2013-04-28 15:44:04

标签: api python-3.x mtgox

我正在编写一个交易程序,我需要通过API v2连接到MtGox(比特币交易所)。但我不断收到以下错误:

  

网址:1 https://data.mtgox.com/api/2/BTCUSD/money/bitcoin/address

     

HTTP错误403:禁止。

我的大多数脚本都是来自here的直接副本(这是一个pastebin链接)。我只需要改变它以使用Python 3.3。

我怀疑它与我使用base64.b64encode的脚本部分有关。 In my code,我必须将我的字符串编码为utf-8才能使用base64.b64encode:

                url = self.__url_parts + '2/' + path
                api2postdatatohash = (path + chr(0) + post_data).encode('utf-8')          #new way to hash for API 2, includes path + NUL
                ahmac = base64.b64encode(str(hmac.new(base64.b64decode(self.secret),api2postdatatohash,hashlib.sha512).digest()).encode('utf-8'))

                # Create header for auth-requiring operations
                header = {
                     "User-Agent": 'Arbitrater',
                     "Rest-Key": self.key,
                     "Rest-Sign": ahmac
                }

然而,对于另一个人的剧本,他也没有:

                url = self.__url_parts + '2/' + path
                api2postdatatohash = path + chr(0) + post_data          #new way to hash for API 2, includes path + NUL
                ahmac = base64.b64encode(str(hmac.new(base64.b64decode(self.secret),api2postdatatohash,hashlib.sha512).digest()))

                # Create header for auth-requiring operations
                header = {
                     "User-Agent": 'genBTC-bot',
                      "Rest-Key": self.key,
                     "Rest-Sign": ahmac
                }

我想知道额外的编码是否导致我的标头凭据不正确。我认为这是另一个Python 2 v.Python 3问题。我不知道另一个人如何在不改为utf-8的情况下离开,因为如果你试图将字符串传递给b64encode或hmac,脚本将无法运行。你们看到我在做什么有什么问题吗?代码是否相同?

2 个答案:

答案 0 :(得分:0)

这条线似乎特别是问题 -

ahmac = base64.b64encode(str(hmac.new(base64.b64decode(self.secret),api2postdatatohash,hashlib.sha512).digest()).encode('utf-8'))

为了澄清,hmac.new()创建了一个对象,然后调用digest()。摘要返回一个字节对象,例如

b.digest()

b'\x92b\x129\xdf\t\xbaPPZ\x00.\x96\xf8%\xaa'

现在,当你打电话给str时,它会转向 b'\\x92b\\x129\\xdf\\t\\xbaPPZ\\x00.\\x96\\xf8%\\xaa'

那么,看看那里发生了什么?字节指示符现在是字符串本身的一部分,然后您可以在其上调用encode()

str(b.digest()).encode("utf-8")
b"b'\\x92b\\x129\\xdf\\t\\xbaPPZ\\x00.\\x96\\xf8%\\xaa'"

要解决这个问题,因为无论如何将字节转换成字符串都是不必要的(除了有问题),我相信这会有效 -

ahmac = base64.b64encode(hmac.new(base64.b64decode(self.secret),api2postdatatohash,hashlib.sha512).digest())

答案 1 :(得分:0)

我相信你可能会在我的相关问题中找到帮助,尽管它涉及WebSocket API:
Authenticated call to MtGox WebSocket API in Python 3

此外,HTTP 403错误似乎表明该请求存在根本性错误。即使您在API上输入了错误的身份验证信息,您也应该收到错误消息作为响应而不是403.我最好的猜测是您使用了错误的HTTP方法,因此请检查您是否使用了相应的方法(GET / POST)。