Comment signer la connexion OKEx API version 5 avec websockets ?

Bien que cette question ait reçu une réponse pour les versions précédentes de l'API OKEx utilisant REST, elle ne l'a pas été pour la dernière version 5 de l'API utilisant des websockets. Les docs sont ici.

Je reçois l'erreur suivante {"event":"error","msg":"Invalid sign","code":"60007"}, il doit donc y avoir un problème avec l'algorithme de chaîne de signature, mais je n'arrive pas à identifier où je fais une erreur.

import hmac
import json
import time
import hashlib
import asyncio
import websockets
passphrase = "XXXX"
secret_key = b"XXXX"
api_key = "XXXX"
timestamp = int(time.time())
print("timestamp: " + str(timestamp))
sign = str(timestamp) + 'GET' + '/users/self/verify'
total_params = bytes(sign, encoding= 'utf-8')
signature = hmac.new(bytes(secret_key, encoding= 'utf-8'), total_params, digestmod=hashlib.sha256).digest()
signature = base64.b64encode(signature)
print("signature = {0}".format(signature))
async def main():
msg = \
{
"op": "login",
"args": [
{
"apiKey": f'{api_key}',
"passphrase": f'{passphrase}',
"timestamp": f'{timestamp}',
"sign": f'{signature}'
}
]
}
async with websockets.connect('wss://wspap.okx.com:8443/ws/v5/private?brokerId=9999') as websocket:
print(msg)
await websocket.send(json.dumps(msg))
response = await websocket.recv()
print(response)
if __name__ == '__main__':
loop = asyncio.get_event_loop()
loop.run_until_complete(main())


Solution du problème

Je l'ai compris. La signature doit être reconvertie de variable de chaîne d'octets en variable de chaîne avant d'être envoyée.

La ligne de code suivante fait cela:signature = str(signature, 'utf-8')

Commentaires

Posts les plus consultés de ce blog

La fonction GCP Cloud pour écrire des données dans BigQuery s'exécute avec succès, mais les données n'apparaissent pas dans la table BigQuery

Erreur Symfony : "Une exception a été levée lors du rendu d'un modèle"