Несоответствие конечной точки Python3 в API Gemini Sandbox

Я создаю приложение для алгоритмической торговли на Python3 для торговли валютой. Я пытаюсь вызвать API-интерфейс Gemini Exchange Sandbox в Python3, чтобы получить текущие балансы. Каждый раз, когда я отправляю свой почтовый запрос, я получаю следующее сообщение об ошибке:

{
 "result":"error",
 "reason":"EndpointMisatch",
 "message":"EndpointMisatch"
}

В ответ на это я изменил свою конечную точку на рабочий URL-адрес https://api.gemini.com/v1/balances ', что приводит к ошибке InvalidSignature.

Я удалил свой API из песочницы и создал новый, гарантируя, что у меня есть доступ управляющего фондами и трейдера как с тактом, так и без него, но безрезультатно. Документация находится здесь: https://docs.sandbox.gemini.com/rest-api/?python#error-codes

Вот моя функция: запросы на импорт импорт json время импорта импорт base64 импорт hmac импорт hashlib

def checkBalance(self):
    '''
        function calls private gemini method
        to return account balances.  Update with
        production or sandbox keys/secrets depending on 
        environment running.
    '''
    #set increment for unique session
    nonce = int(round(time.time()*1000))

    #sandbox api endpoint
    url = 'https://api.sandbox.gemini.com/v1/balances'

    #build the dict payload object
    payload = {
        'request':'v1/balances',
        'nonce': nonce
    }

    #endcode payload as a json object for hashing
    payload = str.encode(json.dumps(payload))

    #base64 encode the payload
    b64 = base64.b64encode(payload)

    #create the signature using sandbox secret and encoded payload in sha384 hash
    signature = hmac.new(str.encode(self.s_secret), b64, hashlib.sha384).hexdigest()

    #build headers as required for contacting api endpoint
    headers = {
        'Content-Type':'text/plain',
        'X-GEMINI-APIKEY': self.s_key,
        'X-GEMINI-PAYLOAD': b64,
        'X-GEMINI-SIGNATURE': signature
    }

    #retrieve data from POST request as response
    response = requests.request("POST", url, headers=headers)

    #return text of response
    return response.text

Я новичок в работе с библиотеками b64, hmac и hashlib. Спасибо заранее за вашу помощь.


person Fergus    schedule 25.12.2017    source источник


Ответы (1)


После долгих испытаний я обнаружил проблему. В моем словаре данных полезной нагрузки конечная точка была указана как «v1 / balances» вместо «/ v1 / balances». Мои новые данные полезной нагрузки выглядят следующим образом (создана функция для работы с nonce):

payload = dict(request = '/v1/balances', nonce = str(self.nonce()))

Когда я обновил полезную нагрузку этой информацией и опубликовал данные, мой ответ песочницы выглядит следующим образом:

[{
    'type': 'exchange', 
    'currency': 'BTC', 
    'amount': '1000', 
    'available': '1000', 
    'availableForWithdrawal': '1000'
 }, 
 {
    'type': 'exchange', 
    'currency': 'USD', 
    'amount': '100000.00', 
    'available': '100000.00', 
    'availableForWithdrawal': '100000.00'
 }, 
 {
    'type': 'exchange', 
    'currency': 'ETH', 
    'amount': '20000', 
    'available': '20000', 
    'availableForWithdrawal': '20000'
}]
person Fergus    schedule 26.12.2017