Tampermonkey 新手求助:捕获请求、修改响应

120 天前
 XiiLii

请教下各位大佬,如何捕获页面的所有请求(页面最开始就监听),并且在页面响应完成后再修改页面的内容?而且可以在之后的异步请求发出后依然可以捕获和感知?

1013 次点击
所在节点    程序员
11 条回复
shendaowu
120 天前
胡乱建议。MutationObserver 。之前我好像有类似的需求,然后不知道怎么就用这个解决了。
ns09005264
120 天前
https://www.tampermonkey.net/documentation.php#meta:run_at
脚本可以通过该声明选择加载时机。
至于请求拦截就不清楚了,也许可以试试修改 window.fetch ,不知道有没有用
service worker 可以很好的拦截请求,但我不确定在用户脚本中能否注册 service worker.
https://stackoverflow.com/questions/1549779/is-it-possible-to-use-workers-in-a-greasemonkey-script
LuckyLauncher
119 天前
@shendaowu #1 建议你不要建议,MutationObserver 是检测 dom 修改的
LudwigWS
119 天前
我猜 TamperMonkey 做不到这一点,楼主发现方案的时候踢我一脚哈
NiaoBlush
119 天前
TamperMonkey 应该是没这能力
zzwudev
119 天前
MV2 的 Tampermonkey 提供了一个 GM_webRequest API 是可以以[声明式]( https://www.tampermonkey.net/documentation.php?locale=en#meta:webRequest) 或者 [API 调用式]( https://www.tampermonkey.net/documentation.php?locale=en#api:GM_webRequest) 的方式拦截、重定向请求或者触发回调的。可惜的是 Chrome 今年就会把 MV3 标准铺开了,MV3 不再提供 webRequest 这样的 API ,有一个 declarativeNetRequest ,但是会有更多的限制,导致 Tampermonkey MV3 版本目前去掉了 GM_webRequest API 。
shendaowu
119 天前
@LuckyLauncher #3 我最开始是想搞个类似面向切面编程的方法,但是后来好像发现行不通,要么就是太复杂。后来转变了一下思路,反正每次请求之后都会更新 DOM ,不如直接检测 DOM 修改,检测到改了之后我再读取相应的页面内容根据情况改。看起来 OP 最终也是为了修改页面内容,所以就赌了一下,建议了一下。应该是我之前没说明白,现在你感觉我说的东西可以凑合用了吗?如果我没搞错的话,我怀疑你是不是过于关注 OP 提的问题( question )而不是 OP 面对的问题( problem )了?有个相关的东西叫 XY 问题,如果是的话推荐了解一下。
LuckyLauncher
119 天前
@shendaowu #7 即使现在我也不觉得你的方法可以凑合用,也不用扯什么 xy 问题,只是刚好的你的情况可以这样,但不是所有的请求都会反应到 dom 上,就算反应到 dom 上也有可能是被处理过的,比如接口给的是明文但前端混淆了(草台班子真的会这么干,我遇到过好几个系统),只能说具体情况具体分析,但是你上来什么都不说直接说个 MutationObserver 无疑是给 op 增加理解负担,等他花费大力气理解了你的意思然后尝试了一遍后发现并不行,这不是误人子弟么
dode
118 天前
建议你部署一个后台代理劫持服务,前端所有的请求到你的服务器,服务器请求&修改后响应返回给页面
shendaowu
118 天前
@LuckyLauncher #8 好的,接受 90%,以后我会提供适用范围。剩下那 10% 是因为我之前也是类似 OP 的思路,但是好像没找到比较好的实现方式。还有我开头的胡乱建议就是字面意思,不是什么梗。但是你说的建议我不建议我 100% 不接受。因为我这个人很自私,我回复很大成分都是为了练习表达,一小部分才是为了帮别人。
XiiLii
112 天前
@dode 好像只能这样,无法捕获其他脚本或者浏览器内部发出的请求。GPT 说:这是因为每个页面的 JavaScript 环境是隔离的,Tampermonkey 脚本运行在自己的沙盒中,无法直接访问或拦截其他脚本的操作。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/1055318

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX