2

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

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

HTTP 错误 403:禁止。

我的大部分脚本都是从这里直接复制的(即 pastebin 链接)。我只需要更改它以使用 Python 3.3。

我怀疑这与我使用 base64.b64encode 的脚本部分有关。在我的代码中,我必须将我的字符串编码为 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,脚本将不会运行。你们看到我在做什么有什么问题吗?输出代码是否等效?

4

2 回答 2

0

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

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

于 2013-11-12T15:11:35.697 回答
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())
于 2013-04-28T23:11:36.060 回答