复现Veikkaus网站EventStream(SSE)请求无返回,求问题排查
问题:Veikkaus网站SSE请求无法获取数据的排查
我在Veikkaus网站的页面上发现它通过EventStream(Server Side Events,SSE)从服务器获取数据。尝试将该网络请求复制为CURL导入Postman后,EventStream没有任何返回;随后用Python代码调试,结果还是一样。请问我哪里操作有误?
用户提供的调试代码:
import requests from sseclient import SSEClient # URL of the SSE endpoint sse_url = "https://api-fip.sbtech.com/veikkaus/sportsdata/v2/stream/events?query=%24filter%3Did%20eq%20%2729185250%27&locale=fi&initialData=true&includeMarkets=all&jwt=eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE2OTE1MjQ1NjEsImlzcyI6IlZlaWtrYXVzIiwiU2l0ZUlkIjozNTksIklzQW5vbnltb3VzIjp0cnVlLCJTZXNzaW9uSWQiOiI5MTNkZjc2My02ODdmLTQzOWUtYmZhYy01YjVkODg3NjM4NWQiLCJuYmYiOjE2OTE1MTczNjEsImlhdCI6MTY5MTUxNzM2MX0.aARFZpjCI-4PAX9UHVE6P5fb_g2eRn8N3DAcX7xIS_DYDSU4yCk3eWYHuDsPd3dCTTskTsYg39_bw0VOOqNj-vln8EWYsCVDe5nH0aqudWSm-ly9YZ6ecA9Bb014OJbS4oBl1l11DTyoEVXdpK6wZLwikcdCyQyqPZGO0qz4RhQbG91KnGSzv64BbEcyWop6f0-DE6rjPthwhi2w0OXaYSIhFLL83STLP_EHmd6VadXLCk5fvBWcRDeApy-gIkLzlD8XwFcMXQj02YL2jV1DNe2_VUz7Qzb4mJjpoy3iuZGjGQbHKhQzTOrjr8MmJAKY_2_GXt8AEY-MSf3kU7VozA" headers = { 'authority': 'api-fip.sbtech.com', 'accept': 'text/event-stream', 'accept-language': 'en-GB,en-US;q=0.9,en;q=0.8', 'cache-control': 'no-cache', 'origin': 'https://www.veikkaus.fi', 'referer': 'https://www.veikkaus.fi/', 'sec-ch-ua': '"Not/A)Brand";v="99", "Google Chrome";v="115", "Chromium";v="115"', 'sec-ch-ua-mobile': '?0', 'sec-ch-ua-platform': '"macOS"', 'sec-fetch-dest': 'empty', 'sec-fetch-mode': 'cors', 'sec-fetch-site': 'cross-site', 'user-agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/115.0.0.0 Safari/537.36', 'Cookie': 'lb_sess=c76e48e72ae4aee2c9c3031bc3f7ede4' } # Make a GET request to establish the SSE connection response = requests.get(sse_url, headers=headers, stream=True) print(response.status_code) if response.status_code == 200: # Create an SSE client sse_client = SSEClient(response.content) # Iterate through SSE events for event in sse_client: print("Received update:", event.data) else: print("Failed to establish SSE connection.")
核心问题及修复方案
- JWT令牌过期:URL中的
jwt参数具有时效性,从令牌的exp字段可看出已过期,必须从当前浏览器的真实请求中复制最新的JWT值。 - SSEClient初始化错误:代码中用
response.content初始化客户端,这会把响应内容全部加载到内存,破坏流式传输特性。应改为直接传入response对象:sse_client = SSEClient(response) - 请求头转义错误:
sec-ch-ua等字段中的"是HTML转义的双引号,需替换为实际双引号,否则服务器无法正确解析。比如将"Not/A)Brand";v="99"改为"Not/A)Brand";v="99"。 - Cookie失效:
lb_sess是负载均衡会话标识,一段时间后会失效,同样需要从浏览器当前请求中复制最新值。
修复后的示例代码
import requests from sseclient import SSEClient # 注意:替换成从浏览器获取的最新JWT和Cookie值 sse_url = "https://api-fip.sbtech.com/veikkaus/sportsdata/v2/stream/events?query=%24filter%3Did%20eq%20%2729185250%27&locale=fi&initialData=true&includeMarkets=all&jwt=你的最新JWT令牌" headers = { 'authority': 'api-fip.sbtech.com', 'accept': 'text/event-stream', 'accept-language': 'en-GB,en-US;q=0.9,en;q=0.8', 'cache-control': 'no-cache', 'origin': 'https://www.veikkaus.fi', 'referer': 'https://www.veikkaus.fi/', 'sec-ch-ua': '"Not/A)Brand";v="99", "Google Chrome";v="115", "Chromium";v="115"', 'sec-ch-ua-mobile': '?0', 'sec-ch-ua-platform': '"macOS"', 'sec-fetch-dest': 'empty', 'sec-fetch-mode': 'cors', 'sec-fetch-site': 'cross-site', 'user-agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/115.0.0.0 Safari/537.36', 'Cookie': 'lb_sess=你的最新Cookie值' } response = requests.get(sse_url, headers=headers, stream=True) print(response.status_code) if response.status_code == 200: # 修复:直接传入response对象 sse_client = SSEClient(response) for event in sse_client: if event.data: print("Received update:", event.data) else: print(f"Failed to establish SSE connection. Status code: {response.status_code}")
内容的提问来源于stack exchange,提问作者Sander Bakker
相关产品推荐
相关产品推荐

