Tampermonkey 新手求助:捕获请求、修改响应 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
请不要在回答技术问题时复制粘贴 AI 生成的内容
XiiLii
V2EX    程序员

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

  •  
  •   XiiLii 2024-07-06 17:37:15 +08:00 1606 次点击
    这是一个创建于 466 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

    shendaowu
        1
    shendaowu  
       2024-07-06 19:38:58 +08:00
    胡乱建议。MutationObserver 。之前我好像有类似的需求,然后不知道怎么就用这个解决了。
    ns09005264
        2
    ns09005264  
       2024-07-06 20:10:50 +08:00
    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
        3
    LuckyLauncher  
       2024-07-07 00:25:14 +08:00
    @shendaowu #1 建议你不要建议,MutationObserver 是检测 dom 修改的
    LudwigWS
        4
    LudwigWS  
       2024-07-07 11:59:52 +08:00 via iPhone
    我猜 TamperMonkey 做不到这一点,楼主发现方案的时候踢我一脚哈
    NiaoBlush
        5
    NiaoBlush  
       2024-07-07 12:59:01 +08:00 via iPhone
    TamperMonkey 应该是没这能力
    zzwudev
        6
    zzwudev  
       2024-07-07 15:05:54 +08:00
    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
        7
    shendaowu  
       2024-07-07 17:55:18 +08:00
    @LuckyLauncher #3 我最开始是想搞个类似面向切面编程的方法,但是后来好像发现行不通,要么就是太复杂。后来转变了一下思路,反正每次请求之后都会更新 DOM ,不如直接检测 DOM 修改,检测到改了之后我再读取相应的页面内容根据情况改。看起来 OP 最终也是为了修改页面内容,所以就赌了一下,建议了一下。应该是我之前没说明白,现在你感觉我说的东西可以凑合用了吗?如果我没搞错的话,我怀疑你是不是过于关注 OP 提的问题( question )而不是 OP 面对的问题( problem )了?有个相关的东西叫 XY 问题,如果是的话推荐了解一下。
    LuckyLauncher
        8
    LuckyLauncher  
       2024-07-07 19:43:57 +08:00
    @shendaowu #7 即使现在我也不觉得你的方法可以凑合用,也不用扯什么 xy 问题,只是刚好的你的情况可以这样,但不是所有的请求都会反应到 dom 上,就算反应到 dom 上也有可能是被处理过的,比如接口给的是明文但前端混淆了(草台班子真的会这么干,我遇到过好几个系统),只能说具体情况具体分析,但是你上来什么都不说直接说个 MutationObserver 无疑是给 op 增加理解负担,等他花费大力气理解了你的意思然后尝试了一遍后发现并不行,这不是误人子弟么
    dode
        9
    dode  
       2024-07-08 09:28:01 +08:00
    建议你部署一个后台代理劫持服务,前端所有的请求到你的服务器,服务器请求&修改后响应返回给页面
    shendaowu
        10
    shendaowu  
       2024-07-08 17:59:50 +08:00
    @LuckyLauncher #8 好的,接受 90%,以后我会提供适用范围。剩下那 10% 是因为我之前也是类似 OP 的思路,但是好像没找到比较好的实现方式。还有我开头的胡乱建议就是字面意思,不是什么梗。但是你说的建议我不建议我 100% 不接受。因为我这个人很自私,我回复很大成分都是为了练习表达,一小部分才是为了帮别人。
    XiiLii
        11
    XiiLii  
    OP
       2024-07-14 16:09:57 +08:00
    @dode 好像只能这样,无法捕获其他脚本或者浏览器内部发出的请求。GPT 说:这是因为每个页面的 Javascript 环境是隔离的,Tampermonkey 脚本运行在自己的沙盒中,无法直接访问或拦截其他脚本的操作。
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     5298 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 25ms UTC 07:08 PVG 15:08 LAX 00:08 JFK 03:08
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86