文章目錄
- POST
-
- URL編碼
- 數字簽名
- api整理
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項不會影響傳回結果