2017-02-07 4 views
5

파이썬을 사용하여 암호화 API 인 poloniex.com에서 거래 API에 액세스하려고합니다. 이를 위해 나는이 처방 따라야합니다HMAC-SHA512 및 Python 요청 라이브러리를 사용하여 POST 요청을 서명하려면 어떻게합니까?

거래 API에 대한 모든 호출이 https://poloniex.com/tradingApi에 HTTP POST를 통해 전송을 다음과 같은 헤더를 포함해야합니다

키 - 당신의 API 키를.
Sign - HMAC-SHA512 방법에 따라 키의 "secret"에 의해 서명 된 쿼리의 POST 데이터입니다.

또한 모든 쿼리에는 "nonce"POST 매개 변수가 포함되어야합니다. nonce 매개 변수는 항상 사용 된 이전의 nonce보다 큰 정수 여야합니다.

여기까지 제가 지금까지 있습니다. 현재 문제는 불완전한 요청을 먼저 보내지 않고 서명 할 수 있도록 POST URL을 컴파일하는 방법을 모른다는 것입니다. 이것은 분명히 작동하지 않습니다.

import requests 
import hmac 
import hashlib 
import time 

headers = { 'nonce': '', 
      'Key' : 'myKey', 
      'Sign': '',} 
payload = { 'command': 'returnCompleteBalances', 
      'account': 'all'} 
secret = 'mySecret' 

headers['nonce'] = int(time.time()) 
response = requests.post('https://poloniex.com/tradingApi', params= payload, headers= headers) 
headers['Sign'] = hmac.new(secret, response.url, hashlib.sha512) 

답변

11

prepared request; 몸을 만든 후 해당에 헤더를 추가 할 수 있습니다

import requests 
import hmac 
import hashlib 


request = requests.Request(
    'POST', 'https://poloniex.com/tradingApi', 
    data=payload, headers=headers) 
prepped = request.prepare() 
signature = hmac.new(secret, prepped.body, digestmod=hashlib.sha512) 
prepped.headers['Sign'] = signature.hexdigest() 

with requests.Session() as session: 
    response = session.send(prepped) 

내가 dataparams 인수를 변경; POST 요청의 경우 URL이 아닌 본문에 매개 변수를 보내는 것이 일반적입니다.

nonce는 itertools.count() object을 사용 했으므로 현재 시간부터 시드하여 재시작해도 영향을받지 않습니다. (당신이 당신의 질문에서 인용)이 Poloniex API documentation에 따르면, 비표가 POST 본문이 아닌 헤더의 일부이므로, payload 사전에 넣어 :

from itertools import count 
import time 

# store as a global variable 
NONCE_COUNTER = count(int(time.time() * 1000)) 

# then every time you create a request 
payload['nonce'] = next(NONCE_COUNTER) 

는 것 int(time.time())를 사용하여 동일한 번호를 다시 사용 초당 둘 이상의 요청을 작성한 경우 example code provided by Poloniexint(time.time()*1000)을 사용하여 매초마다 요청을 만들 수 있지만 자신 만의 증가하는 카운터 (시드 : time.time())를 사용하면 훨씬 강력합니다.

custom authentication object에 다이제스트 서명 프로세스를 캡슐화 할 수도 있습니다. 당신의 requests 통화와

import hmac 
import hashlib 

class BodyDigestSignature(object): 
    def __init__(self, secret, header='Sign', algorithm=hashlib.sha512): 
     self.secret = secret 
     self.header = header 
     self.algorithm = algorithm 

    def __call__(self, request): 
     body = request.body 
     if not isinstance(body, bytes): # Python 3 
      body = body.encode('latin1') # standard encoding for HTTP 
     signature = hmac.new(self.secret, body, digestmod=self.algorithm) 
     request.headers[self.header] = signature.hexdigest() 
     return request 

사용이 : 이러한 객체는 준비의 마지막 단계로 준비된 요청에 전달되는 전달 인수는 HMAC 다이제스트에 사용되는 비밀이

response = requests.post(
    'https://poloniex.com/tradingApi', 
    data=payload, headers=headers, auth=BodyDigestSignature(secret)) 

; 다른 헤더 이름을 전달할 수도 있습니다.

+0

너무 빨랐습니다. 정말 고마워요! – Werhli

+0

@MartijnPieters 내가 이것을 실행하면 'Request'객체에 'body'속성이 없다는 오류가 발생합니다. 이 줄의 경우 : signature = hmac.new (secret, request.body, digestmod = hashlib.sha512) –

+0

@abcla가 수정되었습니다. –