与行情查询这个简单的html网页请求相比, 实盘交易包含了至关重要的身份验证环节, 这是通过修改request的url来实现的
URL中常见%20这种意义不明的数字, 其实际上就是普通字符串经URL转换得到的. URL只能使用英文字母、阿拉伯数字和某些标点符号,不能使用其他文字和符号.
import urllib #以下将在连接参数的同时将其转化为URL编码 urllib.parse.urlencode(params)制造数字签名需要遵循官方格式
host = 'api.hbdm.com' method= '/api/v1/contract_order' # 随方法不同, 可能会添加新的参数 params0 = {'AccessKeyId':accessid, 'SignatureMethod':HmacSHA256, 'SignatureVersion':2, 'Timestamp':datetime.datetime.utcnow().strftime('%Y-%m-%dT%H:%M:%S')} #注意是utcnow()不是now(), 否则会报错 sorted_params = sorted(params0.items(), key=lambda d: d[0], reverse=False) paramurl = urllib.parse.urlencode(sorted_params) signatureraw = '\n'.join(['POST',host,method,paramurl])之后是密码学过程
import base64 import hmac import hashlib digest = hmac.new(secret_key.encode(encoding='UTF8'), signatureraw.encode(encoding='UTF8'), digestmod=hashlib.sha256).digest() signature = base64.b64encode(digest) signature = signature.decode()加入签名, 生成目标URL
sorted_params.append(('Signature',signature)) # 在requests中https://不可省略 URL = 'https://' + host + method + '?' + urllib.parse.urlencode(sorted_params) import requests response = requests.post(url=URL, timeout=2) result = response.json() print(result)这时已经能返回正常信息了
需要注意的是, params的变动虽然会改变数字签名, 但并不会影响服务器端的识别 增加无法识别的param项不会影响返回结果