如何使用Python 2.7对YoBit API进行身份验证?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何使用Python 2.7对YoBit API进行身份验证?相关的知识,希望对你有一定的参考价值。
我试图使用使用YoBit api(https://yobit.net/en/api/)的python来修改交易机器人。唯一的问题是我似乎无法弄清楚如何使用私有API进行身份验证。我想知道是否有人可以给我一个私人YoBit API工作电话的例子。我找到了一篇帖子,其中有人声称对Python 3进行了有效的身份验证。我尽力将其转换为Python 2.7并提出了这个......
from urllib2 import Request, urlopen
from pprint import pprint
import json
import time
import requests
import hmac
import hashlib
from urllib import urlencode
class yobit(object):
def __init__(self, key, secret):
self.key = 'mykey'
self.secret = b'mysecret'
self.public = ['info', 'ticker', 'depth', 'trades']
self.trade = ['activeorders']
def query(self, method, values={}):
if method in self.public:
url = 'https://yobit.net/api/3/'+method
for i, k in values.iteritems():
url += '/'+k
req = requests.get(url)
return json.loads(req.text)
elif method in self.trade:
url = 'https://yobit.net/tapi'
values['method'] = method
values['nonce'] = str(int(time.time()))
body = urlencode(values)
signature = hmac.new(self.secret, body, hashlib.sha512).hexdigest()
headers = {
'Content-Type': 'application/x-www-form-urlencoded',
'Key': self.key,
'Sign': signature
}
req = requests.post(url,data=values,headers=headers)
return json.loads(req.text)
return false
yobit('activeorders','liv_btc')
然而,这并没有返回任何东西。
将“activeorders”更改为“ActiveOrders”。代码将正常工作。
self.trade = ['ActiveOrders']
我遇到了问题,默认用户代理的请求被阻止了。这是交易api的有效实现:
import hmac
import hashlib
import time
import json
from urllib.request import urlopen, Request
from urllib.parse import urlencode
TRADE_API = 'https://yobit.net/tapi'
class YobitConnection:
def __init__(self, api_key, secret):
self.api_key = api_key
self.secret = secret
def execute_query(self, method, params=None):
if params is None:
params = {}
params['method'] = method
params['nonce'] = str(int(time.time()))
post_data = urlencode(params).encode()
signature = hmac.new(
self.secret.encode(),
post_data,
hashlib.sha512).hexdigest()
headers = {
'Sign': signature,
'Key': self.api_key,
'User-Agent': "Mozilla/5.0"
}
request = Request(TRADE_API, post_data, headers=headers)
response = urlopen(request)
return json.loads(response.read())
你可以像这样使用它:
connection = YobitConnection(“你的密钥”,“你的秘密”)connection.execute_query('ActiveOrders',{'pair':'eth_btc'})
修改以下内容:
def __init__(self, key, secret):
self.key = 'mykey'
self.secret = b'mysecret'
self.public = ['info', 'ticker', 'depth', 'trades']
self.trade = ['activeorders']
至
def __init__(self, key, secret):
self.key = key
self.secret = secret
self.public = ['info', 'ticker', 'depth', 'trades']
self.trade = ['ActiveOrders']
请注意self.key , self.secret, self.trade
线条中的差异!
并改变最后一行
yobit('activeorders','liv_btc')
至
yb = yobit('your_key','your_secret')
print yb.execute_query('ActiveOrders', {'pair': 'eth_btc'})
注意上面的your_key, your_secret
可以从yobit.net用户中心获得。
我做了以上更改,并测试它工作正常。通常,您可以得到这样的输出:
{
"success": 1
}
我使用下面的代码进行调用。
import hmac
import hashlib
import requests
from urllib import urlencode
BASE_URL = 'https://yobit.net/'
MARKET_METHODS = ('Trade', 'CancelOrder')
ACCOUNT_METHODS = ('getInfo', 'OrderInfo')
class YobitExchange(ExchangeBase):
def __init__(self, api_key=API_KEY, api_secret=API_SECRET, base_url=BASE_URL, market_methods=MARKET_METHODS,
account_methods=ACCOUNT_METHODS:
self.api_key = api_key
self.api_secret = api_secret
self.base_url = base_url
self.market_methods = market_methods
self.account_methods = account_methods
def _api_query(self, method, options):
request_url, post_data = self._get_request_url(method, options)
headers = self._get_headers(post_data)
try:
return requests.post(request_url, data=options, headers=headers).json()
except ValueError as ve:
raise Exception('Exchange has not responded with JSON: %s' % ve)
def _get_method_type(self, method):
if method in self.market_methods or method in self.account_methods:
return 'tapi/'
else:
return 'api/3/'
def _get_request_url(self, method, options):
nonce = str(int(time.time()))
method_type = self._get_method_type(method)
request_url = self.base_url + method_type
if method_type == 'tapi/':
options['method'] = method
options['nonce'] = nonce
return request_url, urlencode(options).encode()
else:
return request_url + method + '/' + options.values()[0]
def _get_headers(self, post_data):
hmac_hash = hmac.new(self.api_secret.encode(), post_data, hashlib.sha512)
return {'Key': self.api_key, 'Sign': hmac_hash.hexdigest()}
你可以用下面的电话来测试它:
def submit_order_interface(self):
details = {'pair': 'btc_usd', 'type': 'sell', 'rate': 10000, 'amount': 1}
raw_result = self._api_query('Trade', {'pair': details['pair'],
'type': details['type'],
'rate': details['rate'],
'amount': details['amount']})
if raw_result.get('error'):
print raw_result.get('error')
return raw_result
以上是关于如何使用Python 2.7对YoBit API进行身份验证?的主要内容,如果未能解决你的问题,请参考以下文章
Python 中的 API 调用身份验证(工作 PHP 示例)
带有 Adwords API 的 Python 2.7:ImportError: cannot import name AdWordsClient