Python 中的 API 调用身份验证(工作 PHP 示例)
Posted
技术标签:
【中文标题】Python 中的 API 调用身份验证(工作 PHP 示例)【英文标题】:API Call Authentication in Python ( Working PHP example ) 【发布时间】:2016-06-04 16:49:39 【问题描述】:我正在尝试编写一个脚本来与在线交易所进行通信。 “公共”请求发送至:https://yobit.net/api/3/ “交易”请求发送至:https://yobit.net/tapi/
我的公开请求效果很好。但是,我的“私人电话”返回 404 错误。 我的密钥 100% 正确。 我目前生成以下 URL:https://yobit.net/tapi/activeorders/ltc_btc/&apikey=MY_APIKEY_HERE&nonce=1456192036
我是否误解了文档?也许是错误的 URL 结构?
文档链接 ---> here 每个 Trade API 请求都应通过身份验证。 通过发送以下 HTTP 标题来完成身份验证: 密钥 - API 密钥,例如:FAF816D16FFDFBD1D46EEF5D5B10D8A2 签名 - 数字签名、POST 参数 (?param0=val0 & ...& nonce=1) 由密钥通过 HMAC-SHA512 签名 后续请求中的参数 nonce(最小 1 到最大 2147483646)应该超过前一个。 要使 nonce 为空,需要生成新的密钥。
我的脚本
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
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
def getactiveorders(self, pair):
return self.query('activeorders', 'pair': pair)
PHP 中的一个工作示例 我相信这是 php 的一个工作示例,不幸的是我无法阅读这种语言。
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;
【问题讨论】:
你有没有让这个工作? 【参考方案1】:我只是自己弄清楚了这一点,并在此过程中遇到了您的问题。交易 API 上的 YoBit 文档在如何格式化请求方面有点欠缺。
您希望向 API 端点发出 POST 请求,并将包括方法本身在内的所有参数包含为 POST 参数。然后,您签署请求正文(POST 参数)并将其与您的公钥一起作为 HTTP 标头包含在内。
这是请求 TradeHistory 的伪代码;我不太了解Python。希望您可以破译或其他人可以对其进行 Python 化!
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 中使用对象作为参考的方法:
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
【讨论】:
你碰巧知道我在哪里可以找到这个的来源? 这对任何人有用吗?在 Ruby 脚本中遇到同样的问题,只有 404,没有错误?以上是关于Python 中的 API 调用身份验证(工作 PHP 示例)的主要内容,如果未能解决你的问题,请参考以下文章
Angular 5 应用程序的任何组件访问数据。正在通过身份验证服务中的 API 调用设置数据
Swagger UI 将身份验证令牌传递给标头中的 API 调用