- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我在尝试向 OKEx API 进行身份验证时不断收到无效签名错误,但我无法理解为什么我的签名没有通过。换一只眼睛会有帮助吗?
以下是 OKEx API 文档中的一些上下文:
*---签署消息---
OK-ACCESS-SIGN header 生成如下:create a prehash时间戳字符串 + 方法 + requestPath + 正文(其中 +代表字符串连接)准备 Secret 标志 prehash使用 HMAC SHA256 将签名编码为 Secret 的字符串Base64 格式示例:sign=CryptoJS.enc.Base64.stringify(CryptoJS.HmacSHA256(timestamp + 'GET' + '/users/self/verify', SecretKey))
时间戳值与 OK-ACCESS-TIMESTAMP header 相同,精度为纳秒。
请求方法应该是大写,即 GET 和 POST。
requestPath 是请求端点的路径。例子:/orders?before=2&limit=30
body是指请求体的String。如果没有请求体可以省略(通常是 GET 请求的情况)。例子:{"product_id":"BTC-USD-0309","order_id":"377454671037440"}
SecretKey 是在您创建 APIKey 时生成的。例子:22582BD0CFF14C41EDBF1AB98506286D*
import hmac
import base64
import requests
import json
from Secrets import okex_key
from Secrets import okex_secret
from Secrets import okex_pass
#get time
def get_time():
urltime= 'https://www.okex.com/api/general/v3/time'
response=requests.get(urltime)
time=response.json()
time=time['iso']
return time
# signature
def signature(timestamp, method, request_path, body,secret_key):
if str(body) == '{}' or str(body) == 'None':
body = ''
message = str(timestamp) + str.upper(method) + request_path + str(body)
mac = hmac.new(bytes(secret_key, encoding='utf8'), bytes(message, encoding='utf-8'), digestmod='sha256')
d = mac.digest()
return base64.b64encode(d)
# set request header
def get_header():
body= {}
request= 'GET'
endpoint= '/api/spot/v3/accounts'
header = dict()
header['CONTENT-TYPE'] = 'application/json'
header['OK-ACCESS-KEY'] = okex_key
header['OK-ACCESS-SIGN'] = signature(get_time(), request, endpoint , body, okex_secret)
header['OK-ACCESS-TIMESTAMP'] = str(get_time())
header['OK-ACCESS-PASSPHRASE'] = okex_pass
return header
url = 'http://www.okex.com/api/spot/v3/accounts'
header = get_header()
response= requests.get(url, headers=header)
response.json()
最佳答案
问题是您在计算 OK-ACCESS-SIGN
和 OK-ACCESS-TIMESTAMP
的值时给出了两个不同的时间值。将 get_time()
放入一个变量中,并在两个地方都使用它。
current_time = get_time()
header['OK-ACCESS-SIGN'] = signature(current_time, request, endpoint , body, okex_secret)
header['OK-ACCESS-TIMESTAMP'] = str(current_time)
另请注意,目前,在 get_time
中,您询问 OKEx 的服务器现在几点了。但是,如果您的计算机的本地时间相当正确(例如,您可以在 https://time.is 中查看),您可以避免执行该 HTTP 请求而只使用本地时间。
import datetime
def get_time():
now = datetime.datetime.utcnow()
t = now.isoformat("T", "milliseconds")
return t + "Z"
关于python - 如何签署 OKEx API 请求?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66486374/
我在尝试向 OKEx API 进行身份验证时不断收到无效签名错误,但我无法理解为什么我的签名没有通过。换一只眼睛会有帮助吗? 以下是 OKEx API 文档中的一些上下文: *---签署消息--- O
我想向 Okex 发送一个签名的 POST 请求:Authentication Docs POST Request Docs . 我总是收到“无效符号”错误。 我成功发送了签名的 GET 请求。对于
我是一名优秀的程序员,十分优秀!