autobahn.twisted.websocket握手错误400:Bitfinex WebSocket API连接异常求助
我之前在对接Bitfinex WebSocket API时也碰到过一模一样的400握手错误,折腾了好一阵才搞定。结合官方文档和踩坑经验,给你梳理几个最可能的原因和修复方法:
1. 先确认API端点是否正确
Bitfinex的WebSocket API v2版本的正确端点是wss://api.bitfinex.com/ws/2,如果你用了旧版的wss://api.bitfinex.com/ws或者不小心写成了HTTP协议(http://),直接就会返回400。先检查代码里的连接URL是不是完全匹配这个地址。
2. 初始订阅/认证消息格式必须严格符合规范
Bitfinex对WebSocket初始发送的第一条消息格式要求非常严格,哪怕一个字段大小写错了、漏了逗号,都会触发400错误。举两个正确的例子:
- 订阅公开ticker频道的正确格式:
{"event": "subscribe", "channel": "ticker", "symbol": "tBTCUSD"}
- 私有频道认证的正确格式(需要提前生成签名):
{ "event": "auth", "apiKey": "你的API密钥", "authSig": "生成的HMAC签名", "authPayload": "AUTH" + str(int(time.time() * 1000)), "authNonce": str(int(time.time() * 1000)) }
重点检查:字段名都是小写(比如event不能写成Event)、所有引号都是英文半角、没有语法错误,symbol格式要正确(比如BTCUSD要写成tBTCUSD)。
3. 认证参数错误(如果用私有频道)
如果是连接私有频道(比如账户、订单相关),签名生成逻辑很容易出错:
- 必须用HMAC-SHA384算法生成签名
authPayload必须是AUTH字符串加上毫秒级时间戳,不能用秒级- API密钥必须在Bitfinex后台开启了WebSocket权限
可以把生成签名的代码单独拿出来测试,对比官方文档的示例,确保每一步都正确。
4. 检查Autobahn/Twisted的客户端配置
有时候Autobahn的默认配置可能和Bitfinex的要求不兼容,比如WebSocket版本:
from autobahn.twisted.websocket import WebSocketClientFactory, WebSocketClientProtocol class BitfinexProtocol(WebSocketClientProtocol): def onOpen(self): # 这里发送订阅消息 self.sendMessage(json.dumps({"event": "subscribe", "channel": "ticker", "symbol": "tBTCUSD"}).encode('utf8')) factory = WebSocketClientFactory("wss://api.bitfinex.com/ws/2") factory.setProtocolOptions(version=18) # RFC6455对应版本18,Bitfinex支持这个版本 factory.protocol = BitfinexProtocol
另外,不要随便加自定义HTTP头部,Bitfinex的WebSocket握手不需要额外头部,多余的头部可能导致400。
5. 排查网络环境问题
有时候不是代码的锅,是防火墙、代理拦截了WebSocket连接。可以用curl命令测试一下:
curl -i -N -H "Connection: Upgrade" -H "Upgrade: websocket" -H "Sec-WebSocket-Version: 13" -H "Sec-WebSocket-Key: SGVsbG8sIHdvcmxkIQ==" https://api.bitfinex.com/ws/2
如果curl返回400,那大概率是网络问题;如果curl能正常返回握手响应,那还是代码的问题。
最后,建议开启Autobahn的DEBUG日志,能看到握手过程中服务器返回的具体错误信息,定位问题更高效:
import logging logging.basicConfig(level=logging.DEBUG)
内容的提问来源于stack exchange,提问作者Alex

