X 的算法:哪些是真的已知,以及怎么在自己账号上做测试
X 的算法:哪些是真的已知,以及怎么在自己账号上做测试
每一篇"X 算法揭秘"都会给出一份自信的排序因素清单。★其中几乎全部是推断,而且很多是从一份多年前的部分代码公开里推断出来的。★
X 之外没有人知道当前的排序规则。 你能做的是在自己账号上做对照实验 —— 而那个答案胜过任何通用答案,因为它讲的是你的受众,不是一个平均值。
哪些是真正确立的
一份很短的清单,因为诚实的清单本来就短。
第一个小时的互动权重不成比例地高。 早期互动是强信号,这也是"时机"和"发完在场回复"都有用的原因。
回复的权重高于点赞。 需要花力气的互动比被动的算得更重。 引用的权重更高 —— 各个比例说明什么。
停留时长是一个信号。 某人在一条帖子上停多久,而不只是有没有点什么。
负面信号存在,而且很重。 静音、拉黑和"不感兴趣"降低分发的幅度,大于同等数量的点赞提升的幅度。
新近度衰减很快。 大部分触达发生在头几个小时。
⚠️ ★哪些没有被确立 —— 尽管到处都在重复:确切权重、链接是否被降权、特定词是否被压制、以及是否存在某种普遍最优的形式。这些被反复断言,而没有任何办法验证。★
可靠的做法不是再读一篇揭秘,而是测量你自己的账号,让数据来定。
为什么通用建议会失效
算法是个性化的。 ★不存在一个排序 —— 而是每个观看者一个排序★,由那个人互动过的内容构建。忽略这一点的建议,描述的是一个不适用于任何具体人的平均值。
它一直在变。 任何几个月前写的东西,描述的都是一个此后已被调整过的系统。
★而最大的一条: 一个 50 万粉丝、某个领域的账号有效的做法,对一个 2,000 粉丝、另一个领域的账号几乎没有参考价值。★ 不同受众、不同的竞争。
用对照实验代替猜测
这才是真正有回报的部分。 你看不到排序规则,但你能测量自己账号上的结果。
只挑一个变量。 形式最容易:纯文字、单图、视频、长贴开头、带链接。
其它条件大致保持不变。 相近的话题范围、相近的发布时间、相近的长度。
每个桶要有足够样本。 ★每种形式至少 5 条★ —— 少于这个你读的是噪音。
比中位数,不要比平均值。 一条爆款会让平均值失去意义。
import requests
from collections import defaultdict
from statistics import median
BASE = "https://api.socialapi.tech"
KEY = "your_api_key"
HDRS = {"X-API-Key": KEY}
def fetch(username, pages=5):
out, cursor = [], None
for _ in range(pages):
params = {"username": username, "limit": 100}
if cursor:
params["cursor"] = cursor
r = requests.get(f"{BASE}/v1/user/last_tweets",
params=params, headers=HDRS, timeout=60)
r.raise_for_status()
b = r.json()
if not b["data"]:
break
out.extend(b["data"])
cursor = b.get("meta", {}).get("next_cursor")
if not cursor:
break
return out
def shape(p):
"""按形式给帖子分类 —— 一次只测一个变量。"""
if p.get("videos"): return "视频"
if p.get("photos"): return "图片"
if "http" in p.get("text", ""): return "带链接"
if p.get("is_reply"): return "回复"
return "纯文字"
def rate(p):
v = p.get("view_count") or 0
if not v:
return None
return (p.get("like_count", 0) + p.get("retweet_count", 0)
+ p.get("reply_count", 0) + p.get("quote_count", 0)) / v
def compare(username, min_sample=5):
buckets = defaultdict(list)
for p in fetch(username):
r = rate(p)
if r is not None:
buckets[shape(p)].append(r)
rows = [(k, median(v), len(v)) for k, v in buckets.items()
if len(v) >= min_sample] # ★样本太少的桶拒绝出结论★
return sorted(rows, key=lambda x: -x[1])
for form, med, n in compare("yourhandle"):
print(f"{form:<8} {med:>7.2%} ({n} 条)")
★诚实地读它:如果你最好的形式和最差的形式相差不到两倍,那形式就不是你的杠杆。★(媒体字段和回复标记随每条推文返回,所以分类不额外花调用。) 那是一个真实结果,不是失败的实验 —— 它意味着力气该花在别处。
⚠️ 它无法隔离什么: 你做的不是真正的 A/B。你的话题、时机和受众在这段时间里都在变。★把"跨越几十条帖子的持续差距"当作信号,把小差距当作没有。★
关于"重置算法"
一个常见搜索,而这个前提略有偏差。
★你无法重置排序。你能重置的是喂给推荐的那些信号。★
- 「正在关注」标签 —— 你关注账号的时间序信息流,完全没有排序。从"为你推荐"滑过去即可
- 「不感兴趣」 —— 对你不想再看的内容点它
- 静音话题和词 —— 设置 → 隐私与安全
- 取关或静音那些占据你信息流的账号
⚠️ 这些改变的是你看到什么,不是你的帖子怎么被分发。 人们一直把这两件事混为一谈 —— 如果是你的触达掉了,那是另一套诊断。
把 feed 嵌到你的网站上
"twitter feed"搜索背后的另一种意图 —— 而它是一件完全不同的任务。
官方嵌入组件免费、不需要密钥、并且处理好了渲染。★如果只是要在页面上展示一条时间线,就用它 —— 自己做是花更多力气得到同样结果。★
自己做才有意义的情况: 你需要过滤(只要带图的、只要互动超过阈值的)、合并多个账号、改造样式超出组件允许的范围,或者做缓存以避免在你页面上引入第三方脚本。
# 一个官方组件做不出来的过滤后 feed
posts = fetch("yourhandle", pages=1)
featured = [p for p in posts
if (p.get("like_count") or 0) >= 50 and not p.get("is_reply")]
★要缓存结果。★ 一个每次页面访问都调接口的网站,既浪费调用又拖慢页面。定时取、从你自己的存储里提供。
大家会问的问题
推特算法怎么运作? 它按观看者做排序,用互动信号、新近度和停留时长。确切权重不公布,所以任何具体的拆解都是推断。
2026 年 X 的算法是什么样? 同样的答案 —— 机制大致已知,权重不已知,而且它一直在变。
推特算法开源了吗? 多年前公开过一部分。它已经过时,而且从来不是完整系统。
怎么打败算法? 在你自己账号上测,而不是照搬通用建议。 什么有效因受众而异。
算法会惩罚链接吗? 流传很广,但没有被确立。 ★在你自己账号上测 —— 比较带链接和不带链接的互动中位数。★
话题标签对触达是帮助还是伤害? 一到两个没问题。塞一堆看起来像垃圾信息 —— 标签衡量。
第一个小时重要吗? 重要,早期互动是强信号。在那个窗口里能回复会有帮助。
回复比点赞权重高吗? 总体是的 —— 花力气的互动权重更高。引用更高。
什么是负面信号? 静音、拉黑和"不感兴趣"。它们降低分发的幅度大于点赞提升的幅度。
怎么重置推特算法? 你无法重置排序,只能重置喂给推荐的信号 —— 关注标签、"不感兴趣"、静音话题。
怎么重置我的信息流? 切到「正在关注」标签看时间序,或者静音那些挤满"为你推荐"的话题和账号。
"为你推荐"和"正在关注"有什么区别? "为你推荐"是排序过且个性化的。"正在关注"是时间序,只显示你关注的账号。
能把推特默认设成时间序吗? 大多数版本里 App 会记住你上次用的标签。没有永久设置项。
我的触达为什么掉了? 比起算法改动,更常见的是波动、形式改变或粉丝清理 —— 怎么测。
算法最近改了吗? 它在持续调整且不公告。 你账号上的突然变化,更可能是你自己的内容变了。
发帖频率影响触达吗? 超过一个点你会和自己竞争。 稳定性比数量更重要。
为了算法该什么时间发? 你自己的数据说什么就是什么 —— 算出你自己的胜过任何公布的数字。
视频触达更好吗? 常常是,但不普遍。 去测 —— 上面的代码就是在你账号上比较各种形式。
长贴表现更好吗? 开头那条承载触达,后面各部分只有零头。 拿第 7 条比第 1 条量到的是注意力衰减,不是质量。
编辑帖子会伤害触达吗? 没有任何方向的证据。 编辑是订阅功能且有时间窗口。
投票能提升互动吗? 它们能低成本地产生互动,而那是一个信号。对你的账号有没有用是可测的。
算法怎么决定我看到什么? 从你过去的互动、你关注的账号,以及相似用户互动过的内容。个性化的,所以没有两个信息流是一样的。
能看到一条帖子为什么被推荐吗? 看不到细节。 有些帖子会显示一个简短理由,但没有完整解释。
算法偏爱付费账号吗? 订阅包含一些触达相关功能。它是否主导排序并不公布。
删旧帖对触达有帮助吗? 没有证据,而且删除不可逆 —— 什么能找回。
什么是停留时长? 某人在一条帖子上停留多久。它是一个信号,也是为什么一条帖子可以在没什么可见互动的情况下表现不错。
怎么上"为你推荐"? 没有投稿入口。 是来自你现有受众的强早期互动把一条帖子推得更远。
算法会压制某些词吗? 经常被声称,但没有被确立。 任何断言存在某个"违禁词表"的说法都是在猜。
怎么把推特 feed 嵌到网站? 官方嵌入组件,免费且不需要密钥。只有需要过滤或改样式时才自己做。
能嵌入一个过滤后的 feed 吗? 官方组件不行。 那需要你自己取推文并在渲染前过滤。
怎么拿到推特的 RSS? X 不提供 RSS。 你需要从取到的推文自己生成。
能在一个 feed 里显示多个账号吗? 官方组件不行 —— 合并账号需要你自己取数据。
嵌入的 feed 该多久刷新? 做缓存并定时刷新。 每次页面访问都调接口既浪费又慢。
有官方的算法接口吗? 没有。排序不对外暴露。 你测量的是结果,不是机制。
推特上怎么做 A/B 测试? 做不到真正的 A/B —— 同一份内容你没法发两次。改用几周内跨形式桶比较中位数。
测一种形式需要多少条帖子? 每种至少 5 条,越多越好。低于这个读的是噪音。
算法对回复的处理不同吗? 回复是在对话串内部竞争排序,而不是在时间线里 —— 回复怎么浮现。
简短版
不要相信算法揭秘,包括这一篇。 ★机制大致已知;权重不已知,而且会变。★
在你自己账号上测。 一个变量、每种至少 5 条、比中位数。跨越几十条帖子的持续差距是信号;更小的不是。
要嵌入 feed,除非需要过滤或多账号,否则用官方组件。
我们的 API 返回带互动数据、媒体字段和回复标记的推文 —— 足够一次扫描就按形式分类并比较中位数。只读、固定按次价格、没有属于你的限流要管。
延伸阅读:正确衡量互动 · 算出你自己的最佳发帖时间 · 测试可见性限制 · 为什么引用比回复权重高。