我正在尝试使用 requests 和 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 后我就遇到了麻烦,而且我喜欢 requests 库的(假定的)简单性。
有关 Cryptsy API 的更多信息可以在这里找到: https://www.cryptsy.com/pages/api
任何帮助将不胜感激。
最佳答案
Cryptsy 不使用 OAuth(至少他们的文档没有声称他们使用)。相反,他们推出自己的身份验证。暂时抛开该方法的安全性,让我们看看您需要什么。
他们的文档不是很好,但是根据我对 ity 的阅读,您需要:
- 两个额外 header :Key(包含您的公共(public) API key )和 Sign(包含正文的 HMAC-SHA512 签名)
- 内容类型为
application/x-www-form-urlencoded
的请求正文,其中包含方法名称、方法参数和随机数。
在请求中进行这项工作比平常要简单一些,但最简单的方法可能是编写您自己的自定义 Authentication handler 。这是一个例子:
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
请注意,如果您不提供请求正文,此身份验证处理程序将会崩溃,但这没关系,因为 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')
关于python - 在 Python 3.3 中使用 requests 和 requests-oauthlib 验证 API 调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22512054/