簡體   English   中英

使用請求和請求驗證API調用-Python 3.3中的oauthlib

[英]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的閱讀,您需要:

  • 兩個額外的標頭: 密鑰 (包含公共API密鑰)和符號 (包含主體的HMAC-SHA512簽名)
  • 請求主體,其內容類型為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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM