Greasy Fork

来自缓存

Greasy Fork is available in English.

X/Twitter 去除页面广告 + 推文来源自动展示

自动在每条推文下方显示“Twitter for ...”来源,支持登录用户请求头,还原 iOS 插件逻辑;并在页面内改写 HomeTimeline / TweetDetail 响应体,去除广告

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Greasemonkey 油猴子Violentmonkey 暴力猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Violentmonkey 暴力猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Userscripts ,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展后才能安装此脚本。

(我已经安装了用户脚本管理器,让我安装!)

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

(我已经安装了用户样式管理器,让我安装!)

作者
ookamiame
日安装量
19
总安装量
32
评分
2 0 0
版本
1.2.2
创建于
2026-04-30
更新于
2026-04-30
大小
40.8 KB
许可证
MIT
适用于

X/Twitter 去除页面广告 + 推文来源自动展示

一个用于 X / Twitter 的油猴脚本:

  • 在帖子详情页显示推文来源(如 Twitter for iPhone
  • 在页面内部改写 HomeTimeline / TweetDetail GraphQL 响应体
  • 去除页面广告

功能简介

这个脚本主要做两件事:

  1. 显示推文来源
    在帖子详情页中,为主推文补充来源标签,例如:

    • 📱 来源:Twitter for iPhone
    • 📱 来源:Twitter Web App
    • 📱 来源:Twitter for Android
  2. 通过修改GraphQL响应体去除页面广告
    脚本会在页面内部拦截并处理:

    • HomeTimeline
    • TweetDetail
      以便过滤部分推广内容,并尽量保证前端拿到的是处理后的数据。

适用环境

- 运行时机:document-start,也就是页面脚本很早阶段就开始生效。

安装方式

方式一:手动新建脚本

  1. 安装油猴类扩展:
    • Tampermonkey
    • Violentmonkey
    • ScriptCat
  2. 新建一个脚本。
  3. 将脚本源码完整粘贴进去。
  4. 保存。
  5. 打开 x.comtwitter.com 测试。

方式二:从本地文件导入

如果你已经有脚本文件,可以直接在扩展中导入或粘贴文件内容。


脚本权限说明

这份脚本需要以下权限:

  • GM_xmlhttpRequest
    用于跨域请求 api.twitter.com,获取推文来源

  • @connect api.twitter.com
    明确允许连接来源接口域名

  • @run-at document-start
    让脚本尽可能早于页面业务脚本运行,这对 GraphQL 响应体改写很关键


使用方法

1. 查看推文来源

打开任意帖子详情页,例如:

https://x.com/<用户名>/status/<tweetID>

脚本会自动:

  1. 识别当前详情页的 tweetID
  2. 请求 conversation 接口
  3. 解析 source 字段
  4. 将来源标签插入到详情页中

如果一切正常,你会在详情页看到类似:

📱 来源:Twitter for iPhone

2. 响应体改写自动生效

脚本不需要手动按钮。

只要页面请求命中了以下 GraphQL 接口之一:

  • /i/api/graphql/.../HomeTimeline
  • /i/api/graphql/.../TweetDetail

脚本就会自动尝试改写响应体。它通过包装页面上下文中的:

  • fetch
  • XMLHttpRequest
  • Promise.prototype.then

来尽量保证前端消费到的对象也是处理后的


工作原理

一、推文来源显示原理

脚本会请求这个接口:

https://api.twitter.com/2/timeline/conversation/<tweetID>.json?include_ext_alt_text=true&include_reply_count=true&tweet_mode=extended

然后从响应里读取:

globalObjects.tweets[tweetID].source

这个字段通常是一段 HTML,例如:

<a href="http://twitter.com/download/iphone" rel="nofollow">Twitter for iPhone</a>

脚本会去掉 HTML 标签,只保留纯文本


二、GraphQL 改写原理

Userscript 本身不能像 MITM 代理那样在系统网络层直接改包,所以这份脚本采取的是:

  1. 向页面上下文注入脚本
  2. 在页面真实执行环境中包装网络与 Promise 逻辑
  3. 对命中的 HomeTimeline / TweetDetail 数据结构做过滤。

这意味着它更接近“前端运行时修正”,而不是代理级响应体替换。


主要特性

1. 来源抓取缓存

脚本使用 Map 做简单缓存,避免同一个 tweetID 被重复请求

2. 请求失败自动重试

当来源接口出现:

  • 404
  • 网络错误

脚本会自动重试一次,尽量减少偶发失败导致的来源不显示

3. SPA 路由支持

X / Twitter 是单页应用,普通脚本只在首次加载执行往往不够 这份脚本会通过轮询 pathname 的方式监听路由变化,在切换到新的帖子详情页后重新初始化来源标签逻辑

4. DOM 观察恢复

脚本使用 MutationObserver 观察详情页变化。 如果来源标签因为页面重渲染被移除,会尝试重新挂回去


适合谁使用

这份脚本更适合这些用户:

  • 想查看某条推文究竟是从什么客户端发出的用户
  • 想研究 X / Twitter 前端接口结构的用户
  • 想在浏览器侧尝试做局部响应体改写的用户
  • 想在不使用代理工具的前提下做页面层实验的用户

常见问题

1. 为什么有时来源标签不显示?

可能原因包括:

  • 当前详情页 DOM 结构发生变化
  • 来源接口返回异常
  • 页面重渲染时标签被移除
  • 主推文 article 未被正确定位

脚本内部已经通过:

  • findTweetArticle(tweetID)
  • MutationObserver
  • 自动重试

来尽量缓解这些问题,但仍可能受 X 前端结构变化影响。


2. 为什么广告过滤可能不完全稳定?

因为这不是系统代理层改包,而是浏览器页面内改写。
如果 X 的前端实现、字段路径、Promise 链、缓存逻辑发生变化,可能会影响改写效果。脚本已经同时处理了:

  • fetch
  • XMLHttpRequest
  • Promise.prototype.then

但它仍然属于页面级方案,不等同于网络代理工具。

3. 为什么脚本需要很早运行?

因为如果脚本在页面主逻辑之后才注入,首批 GraphQL 请求可能已经完成,这会导致改写层错过最关键的响应。
因此脚本使用了:

// @run-at       document-start

来尽量提前生效。


已知限制

  • 只明确支持 x.com / twitter.com
  • 来源标签逻辑主要针对帖子详情页
  • 广告过滤效果依赖当前 GraphQL 返回结构
  • 如果 X 页面大改版,脚本需要同步调整选择器与过滤路径

开源说明

  • 许可证:MIT
  • 作者:狼小雨