Python连接Socket.IO获取x13.bet数据失败,请求技术帮助
解决Socket.io连接成功但无法获取数据的问题
针对你遇到的情况,以下是几个关键的排查和修复方向:
1. 确保客户端与服务端Socket.io版本兼容
你的接口使用EIO=4,对应Socket.io v4.x版本。需要确保python-socketio客户端版本匹配,建议安装指定版本:
pip install "python-socketio[client]==4.6.1"
2. 添加必要的请求头(Referer、User-Agent)
多数网站会校验请求来源和客户端标识,缺失这些头会导致服务端拒绝推送数据。修改连接代码,添加自定义头:
import socketio url = "https://s.x13.bet:2053" sio = socketio.Client() @sio.event def connect(): print("Connected.") # 替换为抓包得到的实际事件名(比如'game_update') @sio.event def game_update(data): print("Received game data:", data) @sio.event def disconnect(): print("Disconnected.") # 添加请求头,模拟浏览器环境 headers = { 'Referer': 'https://x13.bet/double', 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36' } sio.connect(url, transports=['polling'], headers=headers) sio.wait()
3. 确认正确的事件监听名
浏览器预览中的真实数据,是通过服务端发送的自定义事件推送的,不是默认的message事件。你需要:
- 打开浏览器开发者工具(F12)→ 网络标签
- 过滤
socket.io请求,查看服务端发送的消息格式(比如42["game_update", {...}],其中game_update就是事件名) - 将代码中的
game_update替换为实际捕获的事件名
4. 检查是否需要指定命名空间
如果目标接口属于特定的Socket.io命名空间(比如/double),连接时需要明确指定:
sio.connect(url, transports=['polling'], headers=headers, namespaces='/double')
5. 模拟完整的握手流程
有些服务端会在连接后要求发送认证信息(比如携带页面的session token),你需要抓包浏览器的完整Socket.io交互流程,包括:
- 初始握手请求的响应参数
- 连接后发送的认证消息(比如
40["auth", {"token": "..."}]) - 在代码中模拟发送这些消息:
@sio.event def connect(): print("Connected.") # 发送认证消息(替换为抓包得到的实际内容) sio.emit('auth', {'token': 'your_session_token'})
内容的提问来源于stack exchange,提问作者Guilherme Gobbo
相关产品推荐
相关产品推荐

