POST
与行情查询这个简单的html网页请求相比, 实盘交易包含了至关重要的身份验证环节, 这是通过修改request的url来实现的
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项不会影响返回结果