For a deeper look into our Elektron API, look into:

Overview |  Quickstart |  Documentation |  Downloads |  Tutorials |  Articles

question

Upvote
Accepted
13 0 0 3

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()) 





pythonwebsocketspython api
icon clock
10 |1500

Up to 2 attachments (including images) can be used with a maximum of 512.0 KiB each and 1.0 MiB total.

Upvotes
Accepted
56.2k 145 45 65

@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.


1666314878211.png (85.2 KiB)
icon clock
10 |1500

Up to 2 attachments (including images) can be used with a maximum of 512.0 KiB each and 1.0 MiB total.

Upvotes
13 0 0 3

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.

icon clock
10 |1500

Up to 2 attachments (including images) can be used with a maximum of 512.0 KiB each and 1.0 MiB total.