上一主题 下一主题
ScriptCat,新一代的脚本管理器脚本站,与全世界分享你的用户脚本油猴脚本开发指南教程目录
返回列表 发新帖
楼主: dawnl-lc - 

如何在脚本中拦截页面加载script

[复制链接]
  • TA的每日心情
    慵懒
    2022-3-8 11:41
  • 签到天数: 2 天

    [LV.1]初来乍到

    22

    主题

    883

    回帖

    1381

    积分

    荣誉开发者

    积分
    1381

    荣誉开发者卓越贡献油中2周年生态建设者油中3周年挑战者 lv2

    发表于 2024-2-13 00:22:05 | 显示全部楼层
    dawnl-lc 发表于 2024-2-12 22:51
    想一站式解决,有没有野路子

    GM_webRequest只在油猴beta版提供,俗称“红猴”,你可以下一个试试。其他实现方式有专门做重定向的插件,比如这个:https://microsoftedge.microsoft. ... fdpfggcogaegfcjdcfp
    这些插件背后的原理都是webRequest这个API,由于谷歌宣布下一代的MV3标准即将废弃掉webRequest,这些插件届时可能会无法工作,如果你对插件开发有兴趣,可以研究下新的declarativeNetRequest,看看这个API怎么实现。
    回复
    订阅

    使用道具 举报

  • TA的每日心情
    慵懒
    2024-11-24 03:27
  • 签到天数: 7 天

    [LV.3]偶尔看看II

    2

    主题

    17

    回帖

    25

    积分

    荣誉开发者

    积分
    25

    新人报道油中2周年油中3周年荣誉开发者

    发表于 2024-2-13 00:29:05 | 显示全部楼层

    李恒道 发表于 2024-2-13 00:08

    哥哥你试一下我提供的代码有没有hook掉AE呗
    我不太会调

    屏幕截图 2024-02-13 002758.png

    回复

    使用道具 举报

  • TA的每日心情
    慵懒
    2024-11-24 03:27
  • 签到天数: 7 天

    [LV.3]偶尔看看II

    2

    主题

    17

    回帖

    25

    积分

    荣誉开发者

    积分
    25

    新人报道油中2周年油中3周年荣誉开发者

    发表于 2024-2-13 00:33:44 | 显示全部楼层

    cxxjackie 发表于 2024-2-13 00:22

    GM_webRequest只在油猴beta版提供,俗称“红猴”,你可以下一个试试。其他实现方式有专门做重定向的插件 ...

    屏幕截图 2024-02-13 003010.png
    专门做重定向的插件我也知道,但是这个脚本目标是开箱即用,尽量减少依赖项,如果拦截加载的方案没法实现的话就只能尝试抢先劫持了,我对抢先劫持如何实现毫无头绪。

    回复

    使用道具 举报

  • TA的每日心情
    慵懒
    1 小时前
  • 签到天数: 822 天

    [LV.10]以坛为家III

    31

    主题

    553

    回帖

    1564

    积分

    荣誉开发者

    积分
    1564

    荣誉开发者新人进步奖油中2周年生态建设者新人报道挑战者 lv2油中3周年喜迎中秋

    发表于 2024-2-13 12:20:24 | 显示全部楼层
    李恒道 发表于 2024-2-12 23:56
    // ==UserScript==
    // @name         New Userscript
    // @namespace    http://tampermonkey.net/

    forEach中throw new Error只会中断剩余forEach
    不会造成剩余js代码中断
    哥哥换个地方大赦天下试试
    回复

    使用道具 举报

  • TA的每日心情
    慵懒
    2024-10-28 07:07
  • 签到天数: 193 天

    [LV.7]常住居民III

    712

    主题

    5992

    回帖

    6780

    积分

    管理员

    非物质文化遗产社会摇传承人

    积分
    6780

    荣誉开发者喜迎中秋油中2周年生态建设者

    发表于 2024-2-13 13:25:15 | 显示全部楼层
    steven026 发表于 2024-2-13 12:20
    forEach中throw new Error只会中断剩余forEach
    不会造成剩余js代码中断
    哥哥换个地方大赦天下试试 ...

    哥哥你在下方打个断点试试
    确实没有执行到
    混的人。
    ------------------------------------------
    進撃!永遠の帝国の破壊虎---李恒道

    入驻了爱发电https://afdian.net/a/lihengdao666
    个人宣言:この世界で私に胜てる人とコードはまだ生まれていません。死ぬのが怖くなければ来てください。
    回复

    使用道具 举报

  • TA的每日心情
    慵懒
    2024-11-24 03:27
  • 签到天数: 7 天

    [LV.3]偶尔看看II

    2

    主题

    17

    回帖

    25

    积分

    荣誉开发者

    积分
    25

    新人报道油中2周年油中3周年荣誉开发者

    发表于 2024-2-13 18:14:55 | 显示全部楼层

    李恒道 发表于 2024-2-13 13:25

    哥哥你在下方打个断点试试
    确实没有执行到

    image.png

    const originalforEach = unsafeWindow.Array.prototype.forEach;
        unsafeWindow.Array.prototype.forEach = function (...args) {
            let err = new Error();
            if (err.stack.match(/main\..*\.js/img)) {
                GM_xmlhttpRequest({
                    url: [...document.head.children].filter((i) => i instanceof HTMLScriptElement && i.src.includes('main')).pop().src,
                    method: 'GET',
                    headers: {
                        'Content-type': 'application/x-www-form-urlencoded'
                    },
                    onload: function (xhr) {
                        GM_addElement('script', {
                            textContent: xhr.responseText.replace('An({', 'false && An({')
                        });
                        unsafeWindow.Array.prototype.forEach = originalforEach;
                        console.clear();
                    }
                });
                throw err;
            }
            return originalforEach.call(this, ...args);
        };

    改了一下生效了

    回复

    使用道具 举报

  • TA的每日心情
    开心
    2023-3-3 14:48
  • 签到天数: 3 天

    [LV.2]偶尔看看I

    1

    主题

    20

    回帖

    18

    积分

    助理工程师

    积分
    18
    发表于 2024-5-5 00:08:23 | 显示全部楼层
    这个方式感觉有点意思啊。我试过so说的beforescriptexecute和MutationObserver,在chrome里都不行
    回复

    使用道具 举报

  • TA的每日心情
    擦汗
    2024-5-7 18:25
  • 签到天数: 12 天

    [LV.3]偶尔看看II

    5

    主题

    23

    回帖

    32

    积分

    助理工程师

    积分
    32
    发表于 2024-5-6 17:52:38 | 显示全部楼层
    最近我也遇到这个问题了,就是通过疯狂构造元素和src属性引入一大堆我不想要的变量很烦,我想直接拦截请求改代码
    回复

    使用道具 举报

  • TA的每日心情
    擦汗
    2024-5-7 18:25
  • 签到天数: 12 天

    [LV.3]偶尔看看II

    5

    主题

    23

    回帖

    32

    积分

    助理工程师

    积分
    32
    发表于 2024-5-6 19:36:46 | 显示全部楼层
    李恒道 发表于 2024-2-13 13:25
    哥哥你在下方打个断点试试
    确实没有执行到

    哥哥可以解释下题主最后的代码吗,看不懂原理,如何做到加载前修改js的
    回复

    使用道具 举报

  • TA的每日心情
    慵懒
    2024-10-28 07:07
  • 签到天数: 193 天

    [LV.7]常住居民III

    712

    主题

    5992

    回帖

    6780

    积分

    管理员

    非物质文化遗产社会摇传承人

    积分
    6780

    荣誉开发者喜迎中秋油中2周年生态建设者

    发表于 2024-5-6 21:22:54 | 显示全部楼层
    granded 发表于 2024-5-6 19:36
    哥哥可以解释下题主最后的代码吗,看不懂原理,如何做到加载前修改js的

    就是找关键的系统一定会执行到的api
    利用基础API hook来执行我们的代码

    当执行到我们的代码之后通过爆出一个错误实现回溯堆栈
    如果发现了是对应js文件

    就主动触发出来一个错误
    根据JS机制错误如果没有被catch到就会一致往上投递

    到顶层还没人处理就直接中断掉了

    我们再直接新搞一个js eval进去修改后的代码就可以了

    但是注入点一定要注意副作用不能太严重

    这个是在智慧树大赦天下的时候发现的很有意思的特性
    还有一个iframe重置也有意思,但是由于CSP和兼容问题不完善

    混的人。
    ------------------------------------------
    進撃!永遠の帝国の破壊虎---李恒道

    入驻了爱发电https://afdian.net/a/lihengdao666
    个人宣言:この世界で私に胜てる人とコードはまだ生まれていません。死ぬのが怖くなければ来てください。
    回复

    使用道具 举报

    发表回复

    本版积分规则

    快速回复 返回顶部 返回列表