我想连接到此网站后面的网络套接字(单击球员,以便高尔夫球场变得可见)。当我检查客户端和服务器之间的流量时,我看到第一条消息是握手:
{"type": "connection_init",
"payload":
{
"accept-language": "en",
"ec-version": "5.1.88",
"sport": "GOLF",
"referrer": "https://www.europeantour.com/",
"operator": "europeantour"
}
}
根据格式(字典的键),我得出结论,websocket 使用 Apollo websocket 传输协议。
接下来,我将关注 gql
文档中的 websocket-
example。
import asyncio
import logging
from gql import gql, Client
from gql.transport.websockets import WebsocketsTransport
logging.basicConfig(level=logging.INFO)
async def main():
transport = WebsocketsTransport(url='wss://btec-websocket.services.imgarena.com',
init_payload={'accept-language': 'en',
'ec-version': '5.1.88',
'operator': 'europeantour',
'referrer': 'https://www.europeantour.com/',
'sport': 'GOLF'})
async with Client(transport=transport,
fetch_schema_from_transport=False) as session:
# do something
asyncio.run(main())
在阅读有关协议的更多信息后here我仍然不明白如何在我的
Python
脚本中向服务器发送消息
如何将以下消息发送到 websocket?
{
"id": "1073897396",
"type": "start",
"operationName": "SubscribeToGolfTournamentStatus",
"eventId": 488
}
考虑您提供的 JSON 消息:
{
"id": "1073897396",
"type": "start",
"operationName": "SubscribeToGolfTournamentStatus",
"eventId": 488
}
operationName
表明您正在尝试启动名为 SubscribeToGolfTournamentStatus
的订阅。您将需要该名称所引用的实际 GraphQL 订阅查询。
因此,在您的情况下,要将消息发送到 WebSocket,您通常需要执行 GraphQL 订阅。在 Apollo WebSocket 协议的上下文中并使用
gql
库,您将使用 session.subscribe()
方法。
我们假设订阅查询如下所示(这只是一个占位符,您需要真正的订阅查询结构):
subscription SubscribeToGolfTournamentStatus($eventId: Int!) {
golfTournamentStatus(eventId: $eventId) {
...YourDesiredFieldsHere
}
}
以下是使用
gql
发送订阅的方法:
import asyncio
import logging
from gql import gql, Client
from gql.transport.websockets import WebsocketsTransport
logging.basicConfig(level=logging.INFO)
async def main():
transport = WebsocketsTransport(url='wss://btec-websocket.services.imgarena.com',
init_payload={
'accept-language': 'en',
'ec-version': '5.1.88',
'operator': 'europeantour',
'referrer': 'https://www.europeantour.com/',
'sport': 'GOLF'
})
async with Client(transport=transport, fetch_schema_from_transport=False) as session:
# Define the subscription
subscription = gql('''
subscription SubscribeToGolfTournamentStatus($eventId: Int!) {
golfTournamentStatus(eventId: $eventId) {
...YourDesiredFieldsHere
}
}
''')
# Subscribe and handle incoming data
async for result in session.subscribe(subscription, variable_values={"eventId": 488}):
print(result)
asyncio.run(main())
那就:
gql
函数定义 GraphQL 订阅(请记住,您需要将占位符 GraphQL 查询替换为您要定位的实际结构)。leszekhanusz/gql-actioncable
中查看示例。session.subscribe()
方法启动订阅并传递必要的变量(在本例中为 eventId
)。与官方示例相比:
WebsocketsTransport
,然后创建 Client
会话。do something
”部分经过扩展,专门展示了如何使用 gql
库执行订阅查询。