我正在编写一个交易程序,我需要通过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,脚本将无法运行。你们看到我在做什么有什么问题吗?代码是否相同?
答案 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)。