Use websockets library to connect to websocket (Python)

Hi guys, I've been trying to connect to the websocket from refinitiv api with a python library called websockets, I know that in the code of example (https://github.com/Refinitiv/websocket-api/tree/master/Applications/Examples/RDP/python) has a library that it uses to make this connection, which in this case is "websocket.WebSocketApp" but this library does not accept making this connection asynchronously. so I wanted to use the websockets library as it makes this connection asynchronously. But when I try to make this connection to the websocket with this lib, I get the message: "websockets.exceptions.InvalidStatusCode: server rejected WebSocket connection: HTTP 400" all the information in my code is correct, because if I change to the lib websocket.WebSocketApp it can connect to the endpoint.

thank you, I'll wait.

My code:


import json
import asyncio
import ssl
from websockets import client

CERT = ssl.SSLContext()

async def connection_to_websocket():

await handler_token.get_request_token() # get de request_token and send to send_login_request function

async with client.connect("link to endpoint websocket", ssl=CERT) as websocket:

login_json = {
"ID": 1,
"Domain": "Login",
"Key": {
"NameType": "AuthnToken",
"Elements": {
"ApplicationId": "256",
"Position": "My_IP",
"AuthenticationToken": f"ACCESS_TOKEN",
},
},
}
await websocket.send(json.dumps(login_json))

await websocket.recv()
asyncio.get_event_loop().run_until_complete(connection_to_websocket())





Best Answer

  • Jirapongse
    Jirapongse admin
    Answer ✓

    @Dhennon Martins

    Sorry for the issue you are facing, let me see if I can help you in resolving this.

    You need to specify subprotocols to ['tr_json2'] and the URL must be "wss://hostname/WebSocket", as shown below.

    CERT = ssl.SSLContext()

    async def hello(uri):


    async with connect(uri, ssl=CERT, subprotocols=['tr_json2']) as websocket:
    print("Connect")
    login_json = {
    "ID": 1,
    "Domain": "Login",
    "Key": {
    "NameType": "AuthnToken",
    "Elements": {
    "ApplicationId": "256",
    "Position": "127.0.0.1",
    "AuthenticationToken": f"ACCESS_TOKEN",
    },
    },
    }
    await websocket.send(json.dumps(login_json))
    await websocket.recv()

    asyncio.run(hello("wss://ap-northeast-1-aws-1-lrg.optimized-pricing-api.refinitiv.net/WebSocket"))

    The output is:

    1666314878211.png

    I hope this will help.

Answers

  • Hello @Jirapongse

    Really, what was missing to be able to send the login was the subprotocols=['tr_json2'] and remove the port from the url.

    Thank you very much, it helped me a lot with the answer.