两人团队如何在不支付 X 按次读取费用的情况下监控四个客户账号的私信和提及 — UnifyPort
2026 年 1 月,里斯本一家两人社交媒体代运营公司同时管理着四个客户的 X(Twitter)账号——两个跨境电商品牌、一个 SaaS 初创公司和一家本地连锁餐饮。工作内容很简单:监控每个账号的私信和提及,几小时内回复,需要客户本人处理的内容则升级转发。技术方案也很简单:一个 Node.js 服务每 30 秒轮询一次每个账号的 X API,检查新消息,然后把消息路由到一个共享的 Slack 频道做分拣。
在 X 的旧定价体系下——从 2023 年沿用至今的固定月费方案——这套架构每月花费 100 美元的 Basic 档位。可预测、好预算,客户按月付的代运营费轻松覆盖,根本不需要单独解释。
然后二月来了。
计费表开始跳字
2026 年 2 月 3 日,X 把固定档位定价换成了按次计费。每次 API 调用——读取和写入都算——都有了单独的价格标签。不再有月度封顶。团队那套为”档位内调用不限”设计的轮询架构,一夜之间开始持续跑表。
数字立刻摆在面前。四个客户账号,每个每 30 秒轮询一次私信和提及。每分钟 8 次读取(每账号 2 个端点 × 4 个账号),每天 11,520 次,每月约 345,600 次——这只是监控的成本,一条消息都还没收到。
4 月 20 日 X 调整了费率,自有资源读取降到每次 $0.001——月度监控读取成本降到了约 346 美元。但同一次调整把写入请求(回复)从 $0.010 涨到了 $0.015。团队每月跨四个账号大约发送 400–600 条回复;按 $0.015 算,增加了 $6–$9。单独看不算多,但趋势让人不安:每多接一个客户账号就多一个轮询循环,每多一条回复就在两头推高账单。
真正贵的不是费率,而是架构
团队创始人算了一笔 Q3 的账:如果再接两个客户(按现有管线完全现实),光轮询读取就要翻倍。单次费率确实低,但调用量是结构性的——由服务检查新消息的频率决定,而不是实际收到了多少条消息。周日一条私信都没有的时候,轮询循环照样全速运转,成本和产品上线当天一模一样。
这就是 X 按次计费模型里那些定价对比文章不会告诉你的部分:等待消息的成本不是零,而且它随你的监控架构扩展,不随你的实际消息量扩展。四个账号每 30 秒轮询一次,无论收到 10 条消息还是 10,000 条,都是每月 345,600 次读取。
降低轮询频率是最直觉的办法。团队试了一周 2 分钟一次的间隔。响应时间明显下降——一条私信最坏情况下可能 4 分钟才被读到,而其中两个客户合同里明确写了”2 小时内响应”的 SLA。延迟没有违反 SLA,但服务体感从”接近实时”变成了”最终会看到”。三天后他们就改回来了。
从拉取切换到推送
正确的做法不是优化轮询频率——而是消灭轮询。团队把四个客户的 X 账号全部接入了 UnifyPort,私信和提及在到达时直接推送到 webhook。没有轮询循环,没有按次读取计费,没有随检查频率增长的成本。
架构变化如下:
之前(轮询):
服务 ──► X API(读私信) ×4 账号 ×2次/分钟 = 345,600 次读取/月
服务 ──► X API(读提及) ×4 账号 ×2次/分钟 = 345,600 次读取/月
合计:~691,200 次计费 API 读取/月
之后(webhook 推送):
X 账号 ──► UnifyPort ──► POST /webhook ──► Slack(客户 A)
X 账号 ──► UnifyPort ──► POST /webhook ──► Slack(客户 B)
X 账号 ──► UnifyPort ──► POST /webhook ──► Slack(客户 C)
X 账号 ──► UnifyPort ──► POST /webhook ──► Slack(客户 D)
合计:0 次 X API 读取
每个账号的入站消息以 message.received 事件的形式送达——和这个团队后续为同一批客户接入 WhatsApp 或 Telegram 时会收到的格式完全一致:
{
"event": "message.received",
"account_id": "acct_client_a",
"provider": "twitter",
"from": "user_7d2e1f",
"text": "Hey, is the summer sale still on? Saw a post but the link was broken",
"timestamp": 1750320000,
"message_id": "x_msg_8a3b2c"
}
webhook 处理函数用 HMAC-SHA256 验证每次投递的签名,然后根据 account_id 路由到对应客户的 Slack 频道:
app.post("/webhook", (req, res) => {
if (!verifySignature(req)) return res.sendStatus(401);
const evt = req.body;
if (evt.event === "message.received") {
const channel = clientChannelMap[evt.account_id];
slack.postMessage(channel, {
text: `[${evt.provider}] ${evt.from}: ${evt.text}`,
metadata: { messageId: evt.message_id },
});
}
res.sendStatus(200);
});
四个账号,一个端点,一个签名密钥。轮询服务直接关停。
变了什么
团队在 X 上的 API 成本从每月约 350 美元(且随客户增长)降到了零计费读取。响应延迟反而改善了——事件在消息发出后几秒内送达,不用再等下一个轮询周期。接入新客户账号也不再意味着往账单里加一个轮询循环,而只是在 clientChannelMap 里多加一行。
这个两人团队回复 X 私信和提及的方式没变——还是从 Slack 出发,通过 UnifyPort 的回复端点路由回去。变的是”监控四个 X 账号”不再是一项需要建模、需要向客户解释、需要担心扩展性的 API 成本。Q3 如果管线里再来两个账号,webhook 从收四个变成收六个,账单看不出区别。
对于管理多个 X 账号的代运营团队——尤其是那些 X API 成本随轮询频率而非消息量增长的团队——真正的架构问题不是”轮询间隔调到多少最划算”,而是当一个推送式 webhook 能在不跑表的情况下送达同样的消息时,拉取模式本身是否还有必要。