2014-03-19 65 views
2

我想在Python 3中使用請求和請求oauthlib庫編寫我自己的Cryptsy API包裝器。我對API調用和Python都很陌生。既然這樣,我得到這個錯誤:在Python 3.3中使用請求和請求驗證API調用-oauthlib 3.3

{'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

任何幫助將不勝感激。

+0

查看Cryptsy API文檔似乎表明Cryptsy根本不使用OAuth。我沒有看到他們的文檔中提到它。 – Lukasa

回答

1

Cryptsy不使用OAuth(至少他們的文檔不要求他們這樣做)。相反,他們推出自己的認證。暫且拋開這種方法的安全性,讓我們來看看你需要什麼。

他們的文檔不是很大,但是從我ityYou的閱讀需要:

  • 兩個額外的頭:重點(包含您的公共API密鑰)和登錄(含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') 
+0

這很好用!非常感謝。我必須做的唯一改變是將hmac參數編碼爲字節。 'h = hmac.new(bytes(self.secret,'utf-8'),bytes(r.body,'utf-8'),hashlib.sha512).hexdigest()' –