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

Comment convertir une interface{} qui est vraiment une tranche de types dont le genre est reflect.Int32 en tranche de int32 ?

Créer un fichier CSV à partir d'un fichier texte avec des jetons d'en-tête à l'aide de scripts shell