v0.3.0 — 身份解析硬化 + 自动拉黑 + UI 重写
v0.3.0 (2026-05-26)
🛡️ 身份解析硬化(治根那条 avatar-id 误判)
- NEW: MAIN-world 内容脚本拦截 X 自家
/i/api/graphql/*响应,直接拿真rest_id,不再依赖头像 URL 反推 - NEW: 读
<script type="application/ld+json">的mainEntity.identifier作为 profile 页规范 ID 源 - NEW: 从
data-testid="<uid>-(follow|unfollow|subscribe)"兜底拿 uid - HARDENED:
legacy.id_strvsrest_id不一致直接丢弃;用 Twitter snowflake epoch 反解 candidate uid 注册时间跟legacy.created_at比对,差异 >2 天且撞 avatar media id → 直接丢弃 + warn - 9 条
ingestGraphqlUsers公开 API 回归测试
🤝 Viewer-scoped 过滤
5 个新 Signal 字段(viewerIsSelf / viewerFollowing / viewerBlocking / viewerMuting / viewerFollowRequestSent)。前端扩展 + 服务端 /v1/classify + /v1/report 双层短路:
- 你自己、你关注的人、你 mute / block 的人 → 永远不会被自己上报
- 公榜信任分不会被自己污染
⚡ 对已确认的垃圾号自动拉黑(设置项,默认 OFF)
新设置 autoBlockListHits。开启后两条路径都进入既有限速拉黑队列:
| 来源 | 触发 | 说明 |
|---|---|---|
list_hit |
/v1/check 命中(无视 verdict.label) |
服务端已过滤 status='human_confirmed',被返回即公榜确认。管理员手动加黑名单(即使 AI 标签是"不确定 35%")也自动拉。修复线上 case Mary @Mary1463962 / Mark @Mark76056378472。 |
cache_hit |
本地缓存 verdict 是 spammy 标签 | 缓存是本机 AI 判断,软信号,仅在 spam / porn_bot / likely_spam 时下手 |
两条 auto 路径都跳过 confirm_spam 再上报(不污染公榜 reporter count)。
管理面板审计标签:公榜命中 / 缓存命中 / 手动 / 一键全部。
🎨 UI 重写
- 浅色主题:
@media (prefers-color-scheme: light)跟系统切换 - 每行勾选:bubble card 内每条 finding 带 checkbox,一键拉黑只对选中
- 异步上报状态机:上报 → 上报中 → 已上报 / 失败(带错误 tooltip)
- Popover 边界 flip:超出 viewport 自动翻到另一侧
- 雷达环进度:pill 用 conic-gradient 可视化扫描进度
- 管理面板左上角图标:通用盾牌 SVG → 小蓝吉祥物 PNG(跟 popup 一致)
🔒 XSS 加固
ui.ts 所有 innerHTML 模板插值统一过 escHtml(),关闭一条真实存在的 prompt-injection 路径——攻击者 X bio 注入 → LLM reasons 字段输出 HTML → 角标悬浮卡 innerHTML → content-script 上下文 RCE。Shadow DOM 不隔离 JS 执行。
工程
- 版本
0.2.0 → 0.3.0 - README、
docs/STATUS.md、docs/CWS_LISTING.md同步更新 - TypeScript strict + Biome + 15 个测试 + WXT 生产构建全绿
如何升级
Chrome Web Store 用户:商店审核通过后会自动推送,无需任何操作。
手动加载 / Edge / Brave / Arc 用户:
- 下载
mxga-extension-0.3.0-chrome.zip - 解压
chrome://extensions→ 「加载已解压的扩展程序」→ 选解压目录