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

[油猴脚本开发指南]理解fetch劫持

[复制链接]
  • TA的每日心情
    慵懒
    2024-10-28 07:07
  • 签到天数: 193 天

    [LV.7]常住居民III

    712

    主题

    5992

    回帖

    6780

    积分

    管理员

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

    积分
    6780

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

    发表于 2021-8-28 01:17:04 | 显示全部楼层
    cxxjackie 发表于 2021-8-25 21:22
    [md]我还是不喜欢Proxy这种劫持整个对象的做法,效率问题先放一边,看你的代码逻辑也显得非常复杂。像这个 ...

    大概调试了一下,我返回的明明是proxy对象,不知道什么鬼,网页能拿到proxy代理之前的对象进行访问,日
    我没怎么用过fetch
    按道理xhr很难有人没事去挂载属性
    但是fetch为什么还可以当存储对象存一堆乱七八糟玩应???
    这个哥哥知道么

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

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

    使用道具 举报

  • TA的每日心情
    慵懒
    2022-3-8 11:41
  • 签到天数: 2 天

    [LV.1]初来乍到

    22

    主题

    883

    回帖

    1381

    积分

    荣誉开发者

    积分
    1381

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

    发表于 2021-8-28 08:41:21 | 显示全部楼层

    李恒道 发表于 2021-8-28 01:17

    大概调试了一下,我返回的明明是proxy对象,不知道什么鬼,网页能拿到proxy代理之前的对象进行访问,日
    我 ...

    我没怎么用过Proxy,所以你说的问题我也不太了解,试着调试了一下,你说的属性获取不到应该是Reflect.get在获取function时没有处理this指向导致的,相当于我的代码里用oldJson保存response.json,如果直接调用oldJson()肯定是不行的。

    let handler = {
        get: function(target, prop, receiver) {
            if (prop in target) {
                if (prop === 'json') {
                    return () => Promise.resolve({ a: 6, b: 6, c: 6 });
                } else {
                    let getter = Reflect.get(target, prop);
                    if (typeof getter === 'function') {
                        getter = getter.bind(target);
                    }
                    return getter;
                }
            }
        }
    };
    let proxy = new Proxy(response, handler);

    这样就可以成功改变json的结果,也不影响其他属性的读取(其实我也不理解你的Proxy里面为什么还要再套一层Proxy)。如果要先等json出结果,在原数据的基础上修改,那可能还是要嵌套Promise,思路就跟我前面的代码一样了。或许Proxy在处理Promise上有更好的做法?这方面我是真的不了解,就不乱说了。

    回复

    使用道具 举报

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

    [LV.7]常住居民III

    712

    主题

    5992

    回帖

    6780

    积分

    管理员

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

    积分
    6780

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

    发表于 2021-8-28 14:20:56 | 显示全部楼层
    cxxjackie 发表于 2021-8-28 08:41
    [md]我没怎么用过Proxy,所以你说的问题我也不太了解,试着调试了一下,你说的属性获取不到应该是Reflect ...

    一开始是想对所有函数做个通用劫持然后改变指向
    然后发现网页好像会对fetch挂载函数然后返回this???
    但是xhr目前没碰到过这个问题

    有些网页玩这种骚操作导致我的proxy过滤直接gg了
    哥哥你的方式劫持我晚上试试
    混的人。
    ------------------------------------------
    進撃!永遠の帝国の破壊虎---李恒道

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

    使用道具 举报

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

    [LV.7]常住居民III

    712

    主题

    5992

    回帖

    6780

    积分

    管理员

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

    积分
    6780

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

    发表于 2021-8-28 14:21:32 | 显示全部楼层
    cxxjackie 发表于 2021-8-28 08:41
    [md]我没怎么用过Proxy,所以你说的问题我也不太了解,试着调试了一下,你说的属性获取不到应该是Reflect ...

    计算机太难了,我日
    混的人。
    ------------------------------------------
    進撃!永遠の帝国の破壊虎---李恒道

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

    使用道具 举报

  • TA的每日心情
    慵懒
    2022-3-8 11:41
  • 签到天数: 2 天

    [LV.1]初来乍到

    22

    主题

    883

    回帖

    1381

    积分

    荣誉开发者

    积分
    1381

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

    发表于 2021-8-28 14:33:41 | 显示全部楼层
    李恒道 发表于 2021-8-28 14:20
    一开始是想对所有函数做个通用劫持然后改变指向
    然后发现网页好像会对fetch挂载函数然后返回this???
    但 ...

    是因为你的Proxy挂在response上了吧,fetch本身没有被劫持,不过fetch是个函数,函数能被Proxy代理吗?这我就不了解了,xhr是因为本身是个对象,代理的时候整个都被劫持了。
    回复

    使用道具 举报

  • TA的每日心情
    开心
    2024-7-30 00:00
  • 签到天数: 122 天

    [LV.7]常住居民III

    29

    主题

    601

    回帖

    542

    积分

    专家

    积分
    542

    油中2周年生态建设者油中3周年挑战者 lv2

    发表于 2021-8-28 14:49:30 | 显示全部楼层
    李恒道 发表于 2021-8-28 14:21
    计算机太难了,我日

    纯小白发表感慨,纵观见到的网页,哪家网页会老老实实的一个功能写成一个函数,全他娘的碎片化,里面各种骚操作。一个小小事项都能分到几个js文件里。我们想用最短的代码去做最多的事情,难度可想而知。加油。。。
    回复

    使用道具 举报

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

    [LV.7]常住居民III

    712

    主题

    5992

    回帖

    6780

    积分

    管理员

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

    积分
    6780

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

    发表于 2021-8-28 17:25:36 | 显示全部楼层
    cxxjackie 发表于 2021-8-28 14:33
    是因为你的Proxy挂在response上了吧,fetch本身没有被劫持,不过fetch是个函数,函数能被Proxy代理吗?这 ...

    确定问题了
    网页使用fetch返回的response对象
    如果我对这个对象形成Proxy对象后
    网页通过一些步骤可以获取到Proxy代理之前的对象,然后写入写出数据
    直接对reponse代理就没问题了
    但是代理方法绝对可以确定是不可靠的了
    谢谢哥哥了
    哥哥牛逼!
    混的人。
    ------------------------------------------
    進撃!永遠の帝国の破壊虎---李恒道

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

    使用道具 举报

  • TA的每日心情
    慵懒
    2022-3-8 11:41
  • 签到天数: 2 天

    [LV.1]初来乍到

    22

    主题

    883

    回帖

    1381

    积分

    荣誉开发者

    积分
    1381

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

    发表于 2021-8-28 20:33:09 | 显示全部楼层
    李恒道 发表于 2021-8-28 17:25
    确定问题了
    网页使用fetch返回的response对象
    如果我对这个对象形成Proxy对象后

    我也不太理解为什么你要用一个新对象包住response再去Proxy新对象的做法,还有 prop+'proxy' 这种看起来很别扭的做法真的有必要吗?Reflect.get(target, prop)这里的target指向的是原对象吧,而Proxy是在劫持后的对象上操作的(按我的理解Proxy的本质是对象的深拷贝,这也是导致性能问题的主要原因,不知道对不对),receiver才是被劫持后的对象,直接取target[prop]是完全没有问题的吧,为什么你还要再套一层Proxy进去把问题复杂化呢?这样做有什么特别的意义吗?
    回复

    使用道具 举报

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

    [LV.7]常住居民III

    712

    主题

    5992

    回帖

    6780

    积分

    管理员

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

    积分
    6780

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

    发表于 2021-8-28 21:08:47 | 显示全部楼层
    cxxjackie 发表于 2021-8-28 20:33
    我也不太理解为什么你要用一个新对象包住response再去Proxy新对象的做法,还有 prop+'proxy' 这种看起来 ...

    没错!哥哥提的这两点都是我脑子进水了搞的,最近几天修正一下
    混的人。
    ------------------------------------------
    進撃!永遠の帝国の破壊虎---李恒道

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

    使用道具 举报

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

    [LV.7]常住居民III

    712

    主题

    5992

    回帖

    6780

    积分

    管理员

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

    积分
    6780

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

    发表于 2021-8-30 10:04:22 | 显示全部楼层
    cxxjackie 发表于 2021-8-28 20:33
    我也不太理解为什么你要用一个新对象包住response再去Proxy新对象的做法,还有 prop+'proxy' 这种看起来 ...

    哥哥,话说哥哥有没有写过什么有意思的脚本,想嫖一下代码看看骚操作
    混的人。
    ------------------------------------------
    進撃!永遠の帝国の破壊虎---李恒道

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

    使用道具 举报

    发表回复

    本版积分规则

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