Xtags
September 20, 2026 · View on GitHub
English | 简体中文
在 X 的时间线上,给每条帖子标出它想让你干什么。
默认服务的判断来自 Jev——TypeSafe 的 System One 模型。它不生成文本、不给推理过程,只返回带概率的具名判断。所以标签是一个词加一个数,没有半句分析。

作者提供的实际使用截图;红色箭头标出标签位置。标签为 AI 概率判断,可能存在误差。
⚠️ 使用范围与免责声明
本工具仅供个人本地浏览辅助使用。 它在你自己的浏览器里,读取你正在浏览的页面。
本项目独立开发,与 X Corp 无任何关联,未获其授权或认可:
This project is independent and not affiliated with, authorized, or endorsed by X Corp.
分类结果由 AI 模型生成,可能存在误差,不代表作者立场。 标签是对帖子文本的一种概率判断,不是事实陈述,也不构成对任何账号、观点或事件的评价。请勿将标签作为事实依据。
你需要自行确认这种用法在你所在司法辖区和你的使用场景下是否合规。 X 的服务条款禁止通过其官方接口以外的方式自动化访问其服务。本项目只读取你自己浏览器里已经渲染出来的内容,不绕过任何技术限制,但这不表示它自动合规。
本项目按「原样」提供,不附带任何形式的明示或暗示担保,包括但不限于对适销性、特定用途适用性及不侵权的担保。在任何情况下,作者均不对因使用本软件而产生的任何索赔、损害或其他责任负责。完整条款见 LICENSE。
安装
加载已解压的 Chrome 扩展
git clone <this-repo> && cd xtags
- Chrome 打开
chrome://extensions - 右上角开启开发者模式
- 点加载已解压的扩展程序,选
extension/目录 - 点工具栏上的图标,点击设置,阅读数据上传说明和隐私政策,勾选同意项并点击同意并启用。
- 填入所选服务的 API key。默认使用 TypeSafe(在 https://console.typesafe.ai/settings/keys 获取);如需第三方服务,先按配置说明保存兼容的 HTTPS API URL,再同意向该地址传输数据。
界面语言
默认选择“自动(跟随系统)”:以 Chrome 的界面语言为准,中文环境使用简体中文,其他语言环境使用英文。在扩展弹窗的“语言”菜单中,也可以手动选择 中文 或 English,或切回自动。
选择会保存在本地,并立即同步到已打开的 X 页面。帖子标签、悬浮说明、状态面板和扩展自身的错误提示都会切换语言;已有概率缓存和进行中的判断保持不变,不会因切换语言重新调用 API。Chrome 扩展管理页中的描述由浏览器语言控制。
它做什么
对每条帖子问四个问题,全部是「知识渊博的人一秒能答」的判断,没有一条需要慢推理:
| 判断 | 形态 | 回答什么 |
|---|---|---|
intent | choice | 这条帖子主要在干什么:告知 / 说服 / 挑拨 / 推销 / 娱乐 / 其他 |
rage_bait | noul | 是不是在靠激起愤怒换互动 |
synthetic | noul | 读起来像不像批量生成的 |
undisclosed_ad | noul | 有没有收钱推广而不披露 |
意图每条都显示(它总有一个答案,只是需要读一眼);三个信号只有在超过阈值时才标出来。这样调阈值的时候,意图标签稳定不动,只有警示部分在变。
颜色不是随手配的
按严重度排成一条单调的线,越往下越醒目:
| 标签 | 颜色 | |
|---|---|---|
| 告知 | 中性灰 | 低段三种是平级的 |
| 娱乐 | 绿 | 颜色只区分种类, |
| 其他 | 青绿 | 不表示谁更严重 |
| 说服 | 蓝 | ↓ 从这里往上 |
| 推销 | 琥珀 | 颜色同时表示严重度 |
| 机器生成 | 紫 | |
| 未披露推广 | 橙 | |
| 挑拨 / 诱导愤怒 | 红 |
八种颜色已经接近人眼能排序的上限,所以真正承载信息的是文字,颜色是辅助——色觉不同或截图转成灰度,读到的信息不该变。橙、红两档另外加了字重就是这个道理。
怎么工作
content.js 读 DOM、提取帖子、按当前阈值渲染标签
↓ chrome.runtime.sendMessage
background.js (service worker) 请求队列、去重、持久化缓存
↓ fetch
api.typesafe.ai
为什么请求必须走 service worker:MV3 的内容脚本虽然跑在隔离世界,但网络请求仍用页面的源,因此受 CORS 约束。TypeSafe 的 API 不会给 x.com 发 Access-Control-Allow-Origin,内容脚本里直接 fetch 必然被拦,而且报错被抹成一句没用的 Failed to fetch。service worker 有 host_permissions,不受这个限制。
其他几个设计点:
- 后台统一按 status ID 缓存和去重。多个标签页共享结果,全局最多 3 个并发请求,不再互相覆盖缓存。标签记录所属 status ID,虚拟列表复用节点时会检查并更新。
- 改阈值不重新请求。缓存保存原始概率,每次渲染都按当前阈值组合标签,刷新页面也保持一致。支持 0–1 的阈值。
- 暂停会停止队列并取消在途请求。清缓存、换模型或 key 后,旧请求结果不能写回;已经发送到服务端的请求无法保证撤回或免除费用。
- 失败恢复有边界。每次请求超时 20 秒;网络故障、429 和 5xx 最多尝试 3 次,401 等错误不自动重试。修正 key 或暂停后恢复可以重新尝试失败帖子。
- 面板不驱动扫描。只处理页面本身的变化,插件标签和 HUD 的更新不会触发循环。
- 回复用文本前缀识别,不用
data-testid。因为 action bar 里那个「回复」按钮的 testid 恰好也叫reply,按 testid 匹配会把每一条帖子都当成回复。 - 缓存带版本号。改了字段名必须 +1,否则旧缓存渲染成一堆
undefined,而且因为不重发请求,你只会看到空白标签,看不出原因。
隐私
- 页面文本会发送到所选 API 服务(默认 TypeSafe) 做判断——这是它工作的必要部分。发送的是帖子正文和作者 handle。
- API key 存在浏览器本地(
chrome.storage.local),不会同步到任何账号;只在请求当前所选 API 服务时作为认证凭证发送。注意它未加密,以你的用户身份运行的进程可以读到。 - 没有开发者分析、遥测或分类服务器。所选 API 服务会接收请求正文、作者账号和 IP 等连接信息;本地缓存含帖子 ID、判断结果和时间戳。统计数字只在当前标签页内存中保留;费用为该页实际请求的估算,不含其他标签页和失败请求可能产生的费用。完整说明见隐私政策发布稿。
开发与验证
需要 Node.js 20+;浏览器回归还需要本机 Chrome 或 Chromium,无须安装 npm 依赖。
npm test # 后台队列、并发、缓存、超时和配置竞态
npm run test:browser # 真实 DOM / MutationObserver 回归
非默认安装路径可通过 CHROME_BIN 指定浏览器可执行文件。测试使用独立临时浏览器配置和模拟 API,不使用真实 key,不产生 API 费用;不能替代真实 X 页面的端到端验证。
0.1.1 使用新的原始概率缓存格式,升级后旧缓存会自动失效,首次浏览时重新判断帖子。
Chrome Web Store 提交准备
商店文案、图片、权限申报、审核说明和发布检查见 store/README.md。GitHub Pages 已上线:英文隐私政策、中文隐私政策、支持页,网站源码位于 docs/。运行包可通过 python3 scripts/package-store.py 重建;独立设置页中的披露已接入;提交前仍需完成真实环境验证和审核访问准备。
许可
MIT © 2026 yishan
按「原样」提供,不附带任何担保。
0.1.3 增加数据上传说明、未预选的同意入口及撤回按钮。新装和旧版升级均须明确同意后才会分类;中英文隐私政策随扩展打包,无需等待网站上线即可阅读。
0.1.4 将数据上传说明、同意/撤回、API key、缓存清理和版本信息集中到独立设置页。点击 popup 的“设置”,或从 Chrome 扩展管理页打开“扩展程序选项”。popup 保留语言、启停、阈值和显示开关;页面间设置即时同步。
0.1.5 增加自定义 API URL:默认官方 TypeSafe,可在设置页切换到兼容的第三方 HTTPS 服务。保存新地址后重新同意并填写该服务的 key。配置及接口格式。