簡體   English   中英

使用Python連接到MtGox API 2的問題

[英]Problems Connecting to MtGox API 2 with Python

我正在編寫一個交易程序,我需要通過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訴Python 3問題。 我不知道另一個人是如何在不更改為utf-8的情況下逃脫的,因為如果您嘗試將字符串傳遞給b64encode或hmac,則腳本將無法運行。 你們看到我的工作有任何問題嗎? 輸出代碼是否等效?

這行似乎是問題所在-

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())

我相信您可能會在我的一個相關問題中找到幫助,盡管它涉及WebSocket API:
在Python 3中對MtGox WebSocket API的經過身份驗證的調用

同樣,HTTP 403錯誤似乎表明請求根本存在問題。 即使您在API上輸入了錯誤的身份驗證信息,您也應該得到一條錯誤消息作為響應,而不是403。我的最佳猜測是您使用了錯誤的HTTP方法,因此請檢查您是否使用了適當的方法(GET / POST)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM