简短回答:不,Twitter 不使用 WebSocket
官方 X(Twitter)API 的流式端点不使用 WebSocket。而是使用 HTTP 流式传输 — 一种长连接 HTTP 请求,服务器通过分块传输编码逐步发送数据。这与 WebSocket(RFC 6455)是根本不同的协议。
这个区别对构建实时应用的开发者很重要。你使用的协议会影响延迟、重连行为、双向通信以及客户端代码架构。
Twitter 的 HTTP 流式传输实际如何工作
连接到 X API 的过滤流端点(GET /2/tweets/search/stream)时,客户端发起标准 HTTP 请求。服务器响应 200 状态码并开始逐行写入 JSON — 每条推文一行,无限持续。可以理解为下载一个无限长的文件。
在推文之间,X 大约每 20 秒发送保活信号(空行)。如果客户端超过 20 秒未收到数据,应假定连接中断并重新连接。
- 协议:HTTP/1.1 分块传输编码
- 数据格式:换行分隔的 JSON(NDJSON)
- 方向:仅服务器到客户端(单向)
- 保活:约每 20 秒一个空行
- 认证:HTTP Authorization 头中的 Bearer token
- 连接:一个长连接 HTTP 响应,永不关闭(直到错误或断开)
WebSocket 与 HTTP 流式传输的区别
WebSocket(RFC 6455)是一个独立协议,以 HTTP 升级请求开始,然后切换为帧化的双向通信通道。与 HTTP 流式传输不同,WebSocket 在同一连接上支持服务器到客户端和客户端到服务器的消息。
| 特性 | HTTP 流式传输(X API) | WebSocket(RFC 6455) |
|---|---|---|
| 初始握手 | 标准 HTTP 请求 | HTTP 升级 → ws:// 协议切换 |
| 方向 | 仅服务器 → 客户端 | 双向 |
| 数据帧 | 换行分隔的块 | 带长度头的二进制/文本帧 |
| 保活 | 空行(约 20 秒) | Ping/Pong 帧(协议内置) |
| 客户端可发送数据 | 否(需新 HTTP 请求) | 是(同一连接) |
| 断连检测 | 基于超时(手动) | 关闭帧 + ping/pong(自动) |
| 浏览器支持 | 需要 ReadableStream API | 原生 WebSocket API |
| 重连 | 需手动实现 | 库自动处理 |
为什么这对实时应用很重要
对于交易机器人和提醒系统,协议选择有实际影响:
- 延迟:两种协议原始延迟相似。区别在于开销 — WebSocket 帧有 2-14 字节开销,而 HTTP 分块编码的开销是可变的。
- 重连:HTTP 流式传输没有内置机制检测中断连接。你必须实现超时逻辑。WebSocket 的 ping/pong 协议自动处理。
- 双向:使用 HTTP 流式传输时,订阅新账号或更改过滤条件需要单独的 HTTP 请求。使用 WebSocket,你可以在同一连接上发送订阅变更。
- 浏览器兼容性:HTTP 流式传输需要 ReadableStream API 进行增量解析。WebSocket 有原生浏览器支持和更简单的 API。
- 基础设施:HTTP 流式连接可能被期望标准请求/响应模式的代理、负载均衡器和 CDN 中断。WebSocket 连接专为长连接设计。
代码对比:HTTP 流式传输 vs WebSocket
// HTTP streaming — X API filtered stream
const needle = require('needle');
const STREAM_URL = 'https://api.x.com/2/tweets/search/stream';
function connect() {
const stream = needle.get(STREAM_URL, {
headers: { Authorization: `Bearer ${BEARER_TOKEN}` },
});
// Must parse incrementally — standard fetch() won't work
stream.on('data', (chunk) => {
const line = chunk.toString().trim();
if (!line) return; // Keep-alive newline
const tweet = JSON.parse(line);
console.log(tweet.data.text);
});
// No built-in reconnect — you must handle this yourself
stream.on('error', () => {
console.error('Connection lost, reconnecting...');
setTimeout(connect, 5000);
});
}
connect();// WebSocket — TweetStream (from $199/mo)
function connect() {
const ws = new WebSocket('wss://ws.tweetstream.io/ws', [
'tweetstream.v1',
`tweetstream.auth.token.${API_KEY}`,
]);
ws.onmessage = (event) => {
const envelope = JSON.parse(event.data);
if (envelope.t === 'tweet' && envelope.op === 'content') {
console.log(envelope.d.text);
// Enrichment data (tokens, OCR, prices) in meta messages
}
};
// Reconnect in application code when the socket closes
ws.onclose = () => {
console.log('Reconnecting...');
setTimeout(connect, 1000);
};
}
connect();WebSocket 服务作为 Twitter 流式替代方案
多个第三方服务通过真正的 WebSocket 连接中继 Twitter 数据,弥合了 Twitter HTTP 流式传输与大多数实时应用偏好的 WebSocket 协议之间的差距。
例如 TweetStream 在服务器端连接 Twitter 数据源,并通过标准 WebSocket 连接将推文提醒推送到你的应用。这让你使用熟悉的 WebSocket API(onopen、onmessage、onclose)加上 OCR、代币检测和实时价格等富化数据。
- 标准 WebSocket API — 无需 HTTP 流式传输解析
- 自动重连与消息缓冲
- 约 200 毫秒检测,富化信息随后补充
- 起步 $199/月
- 双向:在同一连接上订阅账号和更改过滤条件
用 TweetStream 更快上线
这篇文章讲的是这类工作流,但真正上线时不应该重新搭建推文接入、重连、代币检测、OCR 和下游投递。TweetStream 是更好的生产起点:账号级实时事件、富化 JSON 载荷、支持套餐的历史回放,以及可以直接用自己账号验证的 3 天试用。
开始 3 天试用常见问题
TweetStream 团队
最近更新:2026 年 3 月
立即开启实时 Twitter WebSocket 提醒
内置 WebSocket 交付、OCR 与代币检测的 Twitter API 替代方案。
开始 3 天试用起价 $199/月 · Basic/Elite 含 3 天试用 · OCR + 代币检测
