如何使用Python 2.7对YoBit API进行身份验证?

问题描述 投票:2回答:4

我试图使用使用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')

然而,这并没有返回任何东西。

python python-2.7 authentication
4个回答
0
投票

将“activeorders”更改为“ActiveOrders”。代码将正常工作。

self.trade = ['ActiveOrders']

0
投票

我遇到了问题,默认用户代理的请求被阻止了。这是交易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'})


0
投票

修改以下内容:

   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
}

0
投票

我使用下面的代码进行调用。

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
© www.soinside.com 2019 - 2024. All rights reserved.