V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
XiiLii
V2EX  ›  程序员

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

  •  
  •   XiiLii · 63 天前 · 931 次点击
    这是一个创建于 63 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

    11 条回复
    shendaowu
        1
    shendaowu  
       63 天前
    胡乱建议。MutationObserver 。之前我好像有类似的需求,然后不知道怎么就用这个解决了。
    ns09005264
        2
    ns09005264  
       63 天前
    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  
       63 天前
    @shendaowu #1 建议你不要建议,MutationObserver 是检测 dom 修改的
    LudwigWS
        4
    LudwigWS  
       62 天前 via iPhone
    我猜 TamperMonkey 做不到这一点,楼主发现方案的时候踢我一脚哈
    NiaoBlush
        5
    NiaoBlush  
       62 天前 via iPhone
    TamperMonkey 应该是没这能力
    zzwudev
        6
    zzwudev  
       62 天前
    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  
       62 天前
    @LuckyLauncher #3 我最开始是想搞个类似面向切面编程的方法,但是后来好像发现行不通,要么就是太复杂。后来转变了一下思路,反正每次请求之后都会更新 DOM ,不如直接检测 DOM 修改,检测到改了之后我再读取相应的页面内容根据情况改。看起来 OP 最终也是为了修改页面内容,所以就赌了一下,建议了一下。应该是我之前没说明白,现在你感觉我说的东西可以凑合用了吗?如果我没搞错的话,我怀疑你是不是过于关注 OP 提的问题( question )而不是 OP 面对的问题( problem )了?有个相关的东西叫 XY 问题,如果是的话推荐了解一下。
    LuckyLauncher
        8
    LuckyLauncher  
       62 天前
    @shendaowu #7 即使现在我也不觉得你的方法可以凑合用,也不用扯什么 xy 问题,只是刚好的你的情况可以这样,但不是所有的请求都会反应到 dom 上,就算反应到 dom 上也有可能是被处理过的,比如接口给的是明文但前端混淆了(草台班子真的会这么干,我遇到过好几个系统),只能说具体情况具体分析,但是你上来什么都不说直接说个 MutationObserver 无疑是给 op 增加理解负担,等他花费大力气理解了你的意思然后尝试了一遍后发现并不行,这不是误人子弟么
    dode
        9
    dode  
       61 天前
    建议你部署一个后台代理劫持服务,前端所有的请求到你的服务器,服务器请求&修改后响应返回给页面
    shendaowu
        10
    shendaowu  
       61 天前
    @LuckyLauncher #8 好的,接受 90%,以后我会提供适用范围。剩下那 10% 是因为我之前也是类似 OP 的思路,但是好像没找到比较好的实现方式。还有我开头的胡乱建议就是字面意思,不是什么梗。但是你说的建议我不建议我 100% 不接受。因为我这个人很自私,我回复很大成分都是为了练习表达,一小部分才是为了帮别人。
    XiiLii
        11
    XiiLii  
    OP
       55 天前
    @dode 好像只能这样,无法捕获其他脚本或者浏览器内部发出的请求。GPT 说:这是因为每个页面的 JavaScript 环境是隔离的,Tampermonkey 脚本运行在自己的沙盒中,无法直接访问或拦截其他脚本的操作。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1191 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 23:57 · PVG 07:57 · LAX 16:57 · JFK 19:57
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.