Python中的API调用身份验证(使用PHP示例)

前端之家收集整理的这篇文章主要介绍了Python中的API调用身份验证(使用PHP示例)前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

我正在尝试编写一个脚本来与在线交流进行通信.
“公共”请求发送至: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
符号 – 通过HMAC-SHA512通过密钥签名的数字签名,POST参数(?param0 = val0& …& nonce = 1)
后续请求中的参数nonce(最小值为1至2147483646)应超过前一个请求.
要使nonce无效,必须生成新密钥.

我的剧本

  1. class yobit(object):
  2. def __init__(self,key,secret):
  3. self.key = key
  4. self.secret = secret
  5. self.public = ['info','ticker','depth','trades']
  6. self.trade = ['activeorders']
  7. def query(self,method,values={}):
  8. if method in self.public:
  9. url = 'https://yobit.net/api/3/'
  10. elif method in self.trade:
  11. url = 'https://yobit.net/tapi/'
  12. else:
  13. return 'You're doing it wrong'
  14. urlString = ''
  15. for i,k in values.iteritems():
  16. urlString += k+'/'
  17. url += method + '/' + urlString
  18. print url
  19. if method not in self.public:
  20. url += '&apikey=' + self.key
  21. url += '&nonce=' + str(int(time.time()))
  22. signature = hmac.new(self.secret,url,hashlib.sha512).hexdigest()
  23. headers = {'apisign': signature}
  24. else:
  25. headers = {}
  26. print url
  27. req = requests.get(url,headers=headers)
  28. response = json.loads(req.text)
  29. return response

####### PUBLIC API

  1. def getinfo(self):
  2. return self.query('info')
  3. def getticker(self,currency):
  4. return self.query('ticker',{'currency': currency})
  5. def getdepth(self,currency):
  6. return self.query('depth',{'currency': currency})
  7. def gettrades(self,currency):
  8. return self.query('trades',{'currency': currency})

##### TRADE API

  1. def getactiveorders(self,pair):
  2. return self.query('activeorders',{'pair': pair})

PHP中的一个工作示例
我相信这是PHP的一个工作示例,遗憾的是我无法阅读这种语言.

  1. function yobit_api_query2($method,$req = array())
  2. {
  3. $api_key = '';
  4. $api_secret = '';
  5. $req['method'] = $method;
  6. $req['nonce'] = time();
  7. $post_data = http_build_query($req,'','&');
  8. $sign = hash_hmac("sha512",$post_data,$api_secret);
  9. $headers = array(
  10. 'Sign: '.$sign,'Key: '.$api_key,);
  11. $ch = null;
  12. $ch = curl_init();
  13. curl_setopt($ch,CURLOPT_RETURNTRANSFER,true);
  14. curl_setopt($ch,CURLOPT_USERAGENT,'Mozilla/4.0 (compatible; SMART_API PHP client; '.PHP_uname('s').'; PHP/'.PHPversion().')');
  15. curl_setopt($ch,CURLOPT_URL,'https://yobit.net/tapi/');
  16. curl_setopt($ch,CURLOPT_POSTFIELDS,$post_data);
  17. curl_setopt($ch,CURLOPT_HTTPHEADER,$headers);
  18. curl_setopt($ch,CURLOPT_SSL_VERIFYPEER,false);
  19. curl_setopt($ch,CURLOPT_ENCODING,'gzip');
  20. $res = curl_exec($ch);
  21. if($res === false)
  22. {
  23. $e = curl_error($ch);
  24. debuglog($e);
  25. curl_close($ch);
  26. return null;
  27. }
  28. curl_close($ch);
  29. $result = json_decode($res,true);
  30. if(!$result) debuglog($res);
  31. return $result;
  32. }
最佳答案
我只是自己想出来并在这个过程中遇到了你的问题.关于如何格式化请求,关于交易API的YoBit文档有点缺乏.

您希望向API端点发出POST请求,并包括所有参数,包括方法本身作为POST参数.然后,您签署请求正文(POST参数)并将其与您的公钥一起包含为HTTP标头.

这是TradeHistory请求的伪代码;我不太了解Python.希望你可以解密或其他人可以Python化它!

  1. request_url = "https://yobit.net/tapi";
  2. request_body = "method=TradeHistory&pair=ltc_btc&nonce=123";
  3. signature = hmac_sha512(request_body,yobit_secret);
  4. http_headers = {
  5. "Content-Type":"application/x-www-form-urlencoded","Key":yobit_public_key,"Sign":signature
  6. }
  7. response = http_post_request(request_url,request_body,http_headers);
  8. result = json_decode(response.text);

更新:这是你在Python 3中如何使用你的对象作为参考:

  1. import time,hmac,hashlib,requests,json
  2. from urllib.parse import urlencode
  3. class yobit(object):
  4. def __init__(self,secret):
  5. self.key = 'KEY'
  6. self.secret = b'SECRET'
  7. self.public = ['info','trades']
  8. self.trade = ['activeorders']
  9. def query(self,values={}):
  10. if method in self.public:
  11. url = 'https://yobit.net/api/3/'+method
  12. for i,k in values.iteritems():
  13. url += '/'+k
  14. req = requests.get(url)
  15. return = json.loads(req.text)
  16. elif method in self.trade:
  17. url = 'https://yobit.net/tapi'
  18. values['method'] = method
  19. values['nonce'] = str(int(time.time()))
  20. body = urlencode(values)
  21. signature = hmac.new(self.secret,body,hashlib.sha512).hexdigest()
  22. headers = {
  23. 'Content-Type': 'application/x-www-form-urlencoded','Key': self.key,'Sign': signature
  24. }
  25. req = requests.post(url,data=values,headers=headers)
  26. return json.loads(req.text)
  27. return false

猜你在找的Python相关文章