2017-06-29 153 views
3

我想做一個基本的身份驗證API調用他們的新的V2 API和得到一個無效的API密鑰錯誤返回。bitfinex api v2錯誤,無效的密鑰

我重新發布了api密鑰只是爲了驗證,同樣的錯誤。

from time import time 
import urllib.request 
import urllib.parse 
import hashlib 
import hmac 

APIkey = b'myapikeyyouarenotsupposedtosee' 
secret = b'myceeeeecretkeyyyy' 

url = 'https://api.bitfinex.com/v2/auth/r/wallets' 

payload = { 
    #'request':'/auth/r/wallets', 
    'nonce': int(time() * 1000), 
} 

paybytes = urllib.parse.urlencode(payload).encode('utf8') 
print(paybytes) 

sign = hmac.new(secret, paybytes, hashlib.sha512).hexdigest() 
print(sign) 

headers = { 
    'Key': APIkey, 
    'Sign': sign 
} 

req = urllib.request.Request(url, headers=headers, data=paybytes) 
with urllib.request.urlopen(req) as response: 
    the_page = response.read() 
    print(the_page) 

如何爲bitfinex對新的v2 API進行身份驗證的API調用?

+0

如果你需要它的PHP或者想用PHP進行比較:https://stackoverflow.com/a/46851626/2635490 – Phil

回答

7

您的標題是錯誤的。我也在嘗試這樣做,並嘗試使用bitfinex v2 api文檔中的example code,但是他們的示例包含一個錯誤,因爲他們需要首先將字符串編碼爲UTF-8字節數組。所以我修復了它併發布了下面的整個示例。

# 
# Example Bitfinex API v2 Auth Python Code 
# 
import requests # pip install requests 
import json 
import base64 
import hashlib 
import hmac 
import os 
import time #for nonce 

class BitfinexClient(object): 
    BASE_URL = "https://api.bitfinex.com/" 
    KEY = "API_KEY_HERE" 
    SECRET = "API_SECRET_HERE" 

    def _nonce(self): 
     # Returns a nonce 
     # Used in authentication 
     return str(int(round(time.time() * 10000))) 

    def _headers(self, path, nonce, body): 
     secbytes = self.SECRET.encode(encoding='UTF-8') 
     signature = "/api/" + path + nonce + body 
     sigbytes = signature.encode(encoding='UTF-8') 
     h = hmac.new(secbytes, sigbytes, hashlib.sha384) 
     hexstring = h.hexdigest() 
     return { 
      "bfx-nonce": nonce, 
      "bfx-apikey": self.KEY, 
      "bfx-signature": hexstring, 
      "content-type": "application/json" 
     } 

    def req(self, path, params = {}): 
     nonce = self._nonce() 
     body = params 
     rawBody = json.dumps(body) 
     headers = self._headers(path, nonce, rawBody) 
     url = self.BASE_URL + path 
     resp = requests.post(url, headers=headers, data=rawBody, verify=True) 
     return resp 

    def active_orders(self): 
     # Fetch active orders 
     response = self.req("v2/auth/r/orders") 
     if response.status_code == 200: 
      return response.json() 
     else: 
      print('error, status_code = ', response.status_code) 
      return '' 

# fetch all your orders and print out 
client = BitfinexClient() 
result = client.active_orders() 
print(result)