[英]Authenticating API calls using requests and requests-oauthlib in Python 3.3
我正在嘗試使用request和requests-oauthlib庫在Python 3中編寫自己的Cryptsy API包裝器。 我是API調用和Python的新手。 就目前而言,我得到這個錯誤:
{'error': 'Unable to Authorize Request - Check Your Post Data', 'success': '0'}
這不足為奇,因為我很難找到有關使用這些庫調用/簽名經過身份驗證的API請求的文檔。 我不太確定從哪里開始。
這是我的代碼片段:
import time
import requests
from requests-oauthlib import OAuth1Session
class Cryptsy:
def __init__(self, APIKey, Secret):
self.APIKey = APIKey
self.Secret = Secret
self.privateBaseURL = 'https://api.cryptsy.com/api'
def private_api_query(self, method, payload={}):
url = self.privateBaseURL
session = OAuth1Session(self.APIKey, client_secret=self.Secret)
payload['method'] = method
payload['nonce'] = int(time.time())
response = session.post(url, data=payload)
js = response.json()
return js
def getMarkets(self):
return self.private_api_query('getmarkets')
如您所見,我模糊地意識到現時,但是我不確定在使用這些庫時是否有必要。 我知道需要對請求進行簽名,但是不確定如何使這些庫以我所需的方式執行。
當然,我總是可以嘗試使用urllib,但是自從切換到Python 3以來,我一直遇到麻煩,而且我喜歡請求庫的(應該是)簡單性。
可以在以下位置找到有關Cryptsy API的更多信息: https ://www.cryptsy.com/pages/api
任何幫助將不勝感激。
加密不使用OAuth(至少他們的文檔不聲明使用OAuth)。 相反,他們滾動自己的身份驗證。 暫時忽略該方法的安全性,讓我們看一下您需要什么。
他們的文檔不是很好,但是根據我對ity的閱讀,您需要:
application/x-www-form-urlencoded
,其中包含方法名稱,方法參數和隨機數。 在請求中進行此工作比平時要簡單一些,但是最簡單的方法可能是編寫您自己的自定義Authentication處理程序 。 這是一個例子:
from requests.auth import AuthBase
import hmac
import hashlib
import time
class CryptsyAuth(AuthBase):
"""Authenticates a given HTTP request using the Cryptsy Auth scheme"""
def __init__(self, api_key, api_secret):
self.key = api_key
self.secret = api_secret
def __call__(self, r):
r.body += '&nonce=%d' % int(time.time())
h = hmac.new(self.secret, r.body, hashlib.sha512).hexdigest()
r.headers['Key'] = self.key
r.headers['Sign'] = h
return r
請注意,如果您不提供請求主體,則此auth處理程序將失敗,但這沒關系,因為Cryptsy要求您這樣做。 使用方法如下:
class Cryptsy:
def __init__(self, APIKey, Secret):
self.APIKey = APIKey
self.Secret = Secret
self.privateBaseURL = 'https://api.cryptsy.com/api'
self.session = requests.Session()
def private_api_query(self, method, payload={}):
url = self.privateBaseURL
payload['method'] = method
response = self.session.post(url, data=payload, auth=CryptsyAuth(self.APIKey, self.Secret))
js = response.json()
return js
def getMarkets(self):
return self.private_api_query('getmarkets')
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.