python - 在 Python 3.3 中使用 requests 和 requests-oauthlib 验证 API 调用

标签 python api oauth python-requests

我正在尝试使用 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/

相关文章:

api - 是否可以从 Google+ ID 创建头像/个人资料图片链接?

android - 谁能解释为什么这些 "Inappropriate blocking method call"警告会从我的代码中弹出?

oauth - 这个 OAuth header 有什么问题?

oauth - 我如何解决 AspNet.Security.OpenIdConnect.Server 的 '"对类型 'BaseControlContext"声明的引用...

ajax - AJAX 样式应用程序中的 XSRF 保护

Python3 pip3 无法安装requests

php - AES-128 OFB 使用 mcrypt (PHP) 和 pycryptodome (Python) 的不同之处

python - 远程服务器上的 Node 错误 spawn/bin/sh ENOENT

angularjs - 使用但不公开 API (AngularJs/NodeJs)

python - 在 Eclipse + Pydev 中使用 WinPython 发行版?