2017-02-07 12 views
5

मैं एक क्रिप्टोकुरेंसी एक्सचेंज, poloniex.com पर ट्रेडिंग एपीआई तक पहुंचने के लिए पायथन का उपयोग करने की कोशिश कर रहा हूं। आपकी API कुंजी -मैं एचएमएसी-एसएचए 512 और पायथन अनुरोध पुस्तकालय का उपयोग कर एक POST अनुरोध पर हस्ताक्षर कैसे करूं?

कुंजी: ऐसा करने के लिए मैं इस पर्चे पालन करना होगा:

व्यापार एपीआई के लिए सभी कॉल https://poloniex.com/tradingApi करने के लिए HTTP POST द्वारा भेजे जाने और निम्न हेडर शामिल होना चाहिए।
साइन इन करें - HMAC-SHA512 विधि के अनुसार आपकी कुंजी के "गुप्त" द्वारा हस्ताक्षरित क्वेरी का POST डेटा।

इसके अतिरिक्त, सभी प्रश्नों में एक "nonce" POST पैरामीटर शामिल होना चाहिए। Nonce पैरामीटर एक पूर्णांक है जो हमेशा इस्तेमाल किए गए पिछले गैरसे से अधिक होना चाहिए।

यहां तक ​​कि मेरे पास अब तक है। मेरा वर्तमान मुद्दा यह है कि मुझे नहीं पता कि POST यूआरएल कैसे संकलित करें ताकि इसे अपूर्ण अनुरोध भेजने के बिना पहले हस्ताक्षर किए जा सकें। यह स्पष्ट रूप से काम नहीं करता है।

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) 

मैं data करने के लिए अपने params तर्क बदल दिया; एक POST अनुरोध के लिए यह शरीर में पैरामीटर भेजने के लिए प्रथागत है, यूआरएल नहीं।

गैर के लिए, मैं वर्तमान समय से बीजित itertools.count() object का उपयोग करता हूं, इसलिए पुनरारंभ करने से यह प्रभावित नहीं होता है। Poloniex API documentation (जो आप अपने प्रश्न में उद्धृत) के अनुसार, अस्थायी रूप से पोस्ट शरीर, नहीं हेडर का हिस्सा है, इसलिए 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) का उपयोग करता है ताकि प्रत्येक माइक्रोसॉन्ड के बजाय अनुरोध तैयार किया जा सके, लेकिन अपने स्वयं के monotonically बढ़ते काउंटर (time.time() से बीजित) का उपयोग करना कहीं अधिक मजबूत है।

आप custom authentication object में पाचन हस्ताक्षर प्रक्रिया को भी समाहित कर सकते हैं;

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 

अपने requests कॉल के साथ इस का प्रयोग करें: इस तरह के एक वस्तु तैयार करने में अंतिम चरण के रूप में तैयार अनुरोध में पारित हो जाता है

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

दिया गया तर्क HMAC डाइजेस्ट में इस्तेमाल किया रहस्य है; आप एक अलग हेडर नाम में भी पास कर सकते हैं।

+0

यह इतना तेज़ था, बहुत बहुत धन्यवाद! – Werhli

+0

@MartijnPieters जब मैं इसे चलाता हूं मुझे एक त्रुटि मिलती है: 'अनुरोध' ऑब्जेक्ट में कोई विशेषता 'बॉडी' नहीं है। इस पंक्ति के लिए: हस्ताक्षर = hmac.new (गुप्त, request.body, digestmod = hashlib.sha512) –

+0

@abcla –

संबंधित मुद्दे