简短回答:不,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-global.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();面向交易机器人的 X 过滤流与 WebSocket 数据流对比
X 过滤流通过一条长连接 HTTP 响应推送符合你所写规则的帖子,按量付费方案按每次 Post 读取计费。TweetStream 通过 WebSocket 推送你所跟踪 X 账号的帖子,按固定月费计价,并为每条帖子附加富化数据。下表依据 X 公开文档(2026-09-30 核对),对比交易机器人依赖的几个方面。
| 对比项 | X 过滤流(按量付费) | TweetStream WebSocket 数据流 |
|---|---|---|
| 连接方式 | 一条长连接 HTTP 响应,内容为按行分隔的 JSON;按量付费方案只允许 1 个连接 | WebSocket,JSON 信封格式;Minimum 含 3 个连接,Pro 含 10 个 |
| 如何选择账号 | 用 from:username 等运算符编写规则;按量付费方案最多 1,000 条规则,每条不超过 1,024 个字符 | 在控制台、Discord 机器人或账号 API 中添加 X 账号,上限由套餐决定 |
| 重连与补数 | 20 秒内没有收到数据或保活信号就重连;补发和恢复错过的帖子需要 Enterprise 权限 | 连接关闭后按退避策略重连;Pro、Scale 和 Ultra Speed 可通过 History API 取回错过的帖子 |
| 计费方式 | 每次 Post 读取 $0.005,每个计费周期最多 300 万次 Post 读取 | 固定月费:Minimum $199/月含 50 个账号,Pro $499/月含 250 个账号 |
| 富化数据 | 你请求的帖子字段和扩展字段 | OCR 文本、检测到的代币和合约、代币价格和预测市场上下文,通过后续 meta 信封发送 |
Twitter WebSocket API 页面介绍了载荷格式和接入步骤。
WebSocket 服务作为 Twitter 流式替代方案
多个第三方服务通过真正的 WebSocket 连接中继 Twitter 数据,弥合了 Twitter HTTP 流式传输与大多数实时应用偏好的 WebSocket 协议之间的差距。
例如 TweetStream 通过标准 WebSocket 连接将受监控的 X/Twitter 提醒推送到你的应用。这让你使用熟悉的 WebSocket API(onopen、onmessage、onclose)加上 OCR、代币检测和实时价格等富化数据。
- 标准 WebSocket API — 无需 HTTP 流式传输解析
- 自动重连与消息缓冲
- 滚动服务端检测,富化信息随后补充
- 起步 $199/月
- 双向:在同一连接上订阅账号和更改过滤条件
更快把这个工作流投入生产
这篇文章介绍了这类工作流。TweetStream 负责受监控帖子的接入、代币检测和 OCR,并通过 WebSocket 投递帖子、更新、删除、置顶、资料变化、关注、取消关注和富化 JSON 载荷。支持的套餐还提供历史回放。你的客户端负责按文档重连 WebSocket,并把收到的事件路由到下游。你可以用自己的账号开始 3 天试用。
开始 3 天试用