Python 中的 API 调用身份验证(工作 PHP 示例) [英] API Call Authentication in Python ( Working PHP example )
问题描述
我正在尝试编写一个脚本来与在线交换进行通信.
公开"请求发送至:https://yobit.net/api/3/
交易"请求发送至:https://yobit.net/tapi/
I'm trying to write a script to communicate with an online exchange.
'Public' requests are sent to : https://yobit.net/api/3/
'Trade' requests are sent to: https://yobit.net/tapi/
我的公开请求效果很好.然而,我的私人电话"返回 404 错误.我的密钥 100% 正确.
我目前生成以下 URL:https://yobit.net/tapi/activeorders/ltc_btc/&apikey=MY_APIKEY_HERE&nonce=1456192036
My public requests work great. My 'private calls' however return a 404 error.
My keys are 100% correct.
I currently produce the following URL: https://yobit.net/tapi/activeorders/ltc_btc/&apikey=MY_APIKEY_HERE&nonce=1456192036
我是否误解了文档?也许是错误的 URL 结构?
Did I missinterpret the documentation? Perhaps a false URL structure?
文档链接 ---> 此处
每个 Trade API 请求都应该通过身份验证.通过发送以下 HTTP 标题来完成身份验证:密钥 - API 密钥,例如:FAF816D16FFDFBD1D46EEF5D5B10D8A2签名 - 数字签名,POST 参数 (?param0=val0 & ...& nonce=1) 由密钥通过 HMAC-SHA512 签名后续请求中的参数 nonce(最小 1 到最大 2147483646)应超过前一个请求中的参数.为 null nonce 需要生成新的 key.
Documentation Link ---> here
Each Trade API request should pass authentication.
Authentication is fulfilled by sending the following HTTP-titles:
Key - API-key, example: FAF816D16FFDFBD1D46EEF5D5B10D8A2
Sign - digital signature, POST-parameters (?param0=val0 & ...& nonce=1) signed by secret key through HMAC-SHA512
Parameter nonce (1 minimum to 2147483646 maximum) in succeeding request should exceed that in the previous one.
To null nonce it is necessary to generate new key.
我的脚本
class yobit(object):
def __init__(self, key, secret):
self.key = key
self.secret = secret
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/'
elif method in self.trade:
url = 'https://yobit.net/tapi/'
else:
return 'You're doing it wrong'
urlString = ''
for i, k in values.iteritems():
urlString += k+'/'
url += method + '/' + urlString
print url
if method not in self.public:
url += '&apikey=' + self.key
url += '&nonce=' + str(int(time.time()))
signature = hmac.new(self.secret, url, hashlib.sha512).hexdigest()
headers = {'apisign': signature}
else:
headers = {}
print url
req = requests.get(url, headers=headers)
response = json.loads(req.text)
return response
#######公共API
####### PUBLIC API
def getinfo(self):
return self.query('info')
def getticker(self, currency):
return self.query('ticker', {'currency': currency})
def getdepth(self, currency):
return self.query('depth', {'currency': currency})
def gettrades(self, currency):
return self.query('trades', {'currency': currency})
##### 贸易 API
##### TRADE API
def getactiveorders(self, pair):
return self.query('activeorders', {'pair': pair})
PHP 中的一个工作示例
我相信这是 PHP 的一个工作示例,不幸的是我无法阅读这种语言.
A working example in PHP
I believe this to be a working example of PHP, unfortunately I can't read this language.
function yobit_api_query2($method, $req = array())
{
$api_key = '';
$api_secret = '';
$req['method'] = $method;
$req['nonce'] = time();
$post_data = http_build_query($req, '', '&');
$sign = hash_hmac("sha512", $post_data, $api_secret);
$headers = array(
'Sign: '.$sign,
'Key: '.$api_key,
);
$ch = null;
$ch = curl_init();
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/4.0 (compatible; SMART_API PHP client; '.php_uname('s').'; PHP/'.phpversion().')');
curl_setopt($ch, CURLOPT_URL, 'https://yobit.net/tapi/');
curl_setopt($ch, CURLOPT_POSTFIELDS, $post_data);
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_ENCODING , 'gzip');
$res = curl_exec($ch);
if($res === false)
{
$e = curl_error($ch);
debuglog($e);
curl_close($ch);
return null;
}
curl_close($ch);
$result = json_decode($res, true);
if(!$result) debuglog($res);
return $result;
}
推荐答案
我刚刚自己弄明白了这一点,并在此过程中遇到了您的问题.关于如何格式化请求,YoBit 交易 API 文档有点缺乏.
I just figured this out myself and came across your question in the process. The YoBit documentation on the trade API is a bit lacking as far as how to format the request.
您想向 API 端点发出 POST 请求,并包含所有参数,包括方法本身作为 POST 参数.然后,您签署请求正文(POST 参数)并将其与您的公钥一起包含为 HTTP 标头.
You want to make a POST request to the API endpoint and include all params including the method itself as POST params. Then, you sign the request body (POST params) and include that along with your public key as HTTP headers.
这是请求 TradeHistory 的伪代码;我不太了解Python.希望你可以破译,或者其他人可以将它 Python 化!
This is pseudocode for a request for TradeHistory; I don't quite know Python. Hopefully you can decipher or someone else can Pythonize it!
request_url = "https://yobit.net/tapi";
request_body = "method=TradeHistory&pair=ltc_btc&nonce=123";
signature = hmac_sha512(request_body,yobit_secret);
http_headers = {
"Content-Type":"application/x-www-form-urlencoded",
"Key":yobit_public_key,
"Sign":signature
}
response = http_post_request(request_url,request_body,http_headers);
result = json_decode(response.text);
更新:以下是在 Python 3 中使用对象作为参考的方法:
Update: here's how you might do it in Python 3, using your object as reference:
import time,hmac,hashlib,requests,json
from urllib.parse import urlencode
class yobit(object):
def __init__(self, key, secret):
self.key = 'KEY'
self.secret = b'SECRET'
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
这篇关于Python 中的 API 调用身份验证(工作 PHP 示例)的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!