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

vue3 proxy [[target]]怎么取值

[复制链接]
  • TA的每日心情
    开心
    2024-7-30 00:00
  • 签到天数: 122 天

    [LV.7]常住居民III

    29

    主题

    601

    回帖

    542

    积分

    专家

    积分
    542

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

    发表于 2023-4-3 11:27:59 | 显示全部楼层 | 阅读模式
    悬赏60油猫币已解决
    // ==UserScript==
    // @name         vue3 proxy [[target]]怎么取值
    // @namespace    http://tampermonkey.net/
    // @version      0.1
    // @description  try to take over the world!
    // @author       You
    // @match        https://pan.baidu.com/pfile/video*
    // @icon         https://www.google.com/s2/favicons?sz=64&domain=baidu.com
    // @grant        none
    // ==/UserScript==
    
    (function() {
        'use strict';
    
        const proxy = window.Proxy;
        window.Proxy = function () {
            let app = arguments[0]._
            if (app?.uid === 30) {
                console.log("app.attrs", app.attrs);
                let videoinfo = app.attrs.videoinfo;
                console.log("videoinfo", videoinfo);
                console.log("videoinfo", JSON.parse(JSON.stringify(videoinfo)));
            }
            return new proxy(...arguments);
        };
    
        // Your code here...
    })();

    最佳答案

    查看完整内容

    [md]```js const originObjects=[]; //建一个数组储存原始对象 const proxy = window.Proxy; window.Proxy = function () { let app = arguments[0]._ if (app?.uid === 30) { originObjects.push(arguments[0]) //暴露Proxy的原始对象 console.log("target",originObjects) console.log("app.attrs", app.attrs); let videoinfo = app.attrs.video ...
  • TA的每日心情
    慵懒
    11 小时前
  • 签到天数: 811 天

    [LV.10]以坛为家III

    31

    主题

    552

    回帖

    1555

    积分

    荣誉开发者

    积分
    1555

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

    发表于 2023-4-3 11:28:00 | 显示全部楼层
        const originObjects=[]; //建一个数组储存原始对象
    
        const proxy = window.Proxy;
        window.Proxy = function () {
            let app = arguments[0]._
            if (app?.uid === 30) {
                originObjects.push(arguments[0]) //暴露Proxy的原始对象
                console.log("target",originObjects)
                console.log("app.attrs", app.attrs);
                let videoinfo = app.attrs.videoinfo;
                console.log("videoinfo", videoinfo);
                console.log("videoinfo", JSON.parse(JSON.stringify(videoinfo)));
            }
            return new proxy(...arguments);
        };

    建议阅读一下MDN文档
    https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Proxy

    语法
    const p = new Proxy(target, handler)
    
    参数
    target
    要使用 Proxy 包装的目标对象(可以是任何类型的对象,包括原生数组,函数,甚至另一个代理)。
    
    handler
    一个通常以函数作为属性的对象,各属性中的函数分别定义了在执行各种操作时代理 p 的行为。

    Proxy劫持里,arguments[0]实际上就是原始对象,原始对象只能在劫持过程中暴露出来,劫持完成后是获取不到的
    随便加一行把arguments[0]暴露出来就行 比如originObjects.push(arguments[0])

    回复

    使用道具 举报

  • TA的每日心情
    开心
    3 小时前
  • 签到天数: 213 天

    [LV.7]常住居民III

    305

    主题

    4188

    回帖

    4055

    积分

    管理员

    积分
    4055

    管理员荣誉开发者油中2周年生态建设者喜迎中秋油中3周年挑战者 lv2

    发表于 2023-4-3 22:45:28 | 显示全部楼层
    可以给个地址看看么?

    哥哥是参考的这个库?

    Hook Vue3 app v1.0.3 [Vue3 app劫持 油猴库]
    https://bbs.tampermonkey.net.cn/thread-2886-1-1.html
    (出处: 油猴中文网)


    上不慕古,下不肖俗。为疏为懒,不敢为狂。为拙为愚,不敢为恶。
    回复

    使用道具 举报

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

    [LV.1]初来乍到

    22

    主题

    881

    回帖

    1379

    积分

    荣誉开发者

    积分
    1379

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

    发表于 2023-4-3 22:50:15 | 显示全部楼层
    这个videoinfo也是个Proxy,[[target]]是原对象,你既然劫持了Proxy,取原对象不是很简单的嘛,加个判断就好了:
    1. if ('videotag' in arguments[0]) {}
    复制代码
    回复

    使用道具 举报

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

    [LV.7]常住居民III

    29

    主题

    601

    回帖

    542

    积分

    专家

    积分
    542

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

    发表于 2023-4-4 08:13:54 | 显示全部楼层
    本帖最后由 脚本体验师001 于 2023-4-4 08:34 编辑
    王一之 发表于 2023-4-3 22:45
    可以给个地址看看么?

    哥哥是参考的这个库?

    嗯是的有参考 @steven026 大佬的这个库,但是取到的值是proxy[object]类型,拿不出来呀
    上面代码可以直接运行看到结果,在 百*盘 里主页打开个视频。哥哥有空的时候帮忙看看
    回复

    使用道具 举报

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

    [LV.7]常住居民III

    29

    主题

    601

    回帖

    542

    积分

    专家

    积分
    542

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

    发表于 2023-4-4 08:18:23 | 显示全部楼层
    本帖最后由 脚本体验师001 于 2023-4-4 08:24 编辑
    cxxjackie 发表于 2023-4-3 22:50
    这个videoinfo也是个Proxy,[[target]]是原对象,你既然劫持了Proxy,取原对象不是很简单的嘛,加个判断就 ...

    就是[[target]]对象里的值拿不出来呀,老师教教我怎么操作取值,直接打印是 '' 值
    回复

    使用道具 举报

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

    [LV.7]常住居民III

    29

    主题

    601

    回帖

    542

    积分

    专家

    积分
    542

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

    发表于 2023-4-4 10:32:15 | 显示全部楼层
    steven026 发表于 2023-4-4 09:08
    [md]```js
        const originObjects=[]; //建一个数组储存原始对象

    我还是不明白,这个videoinfo是个Proxy对象,是不能够直接读取的。如何转为普通object类型?
    回复

    使用道具 举报

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

    [LV.7]常住居民III

    29

    主题

    601

    回帖

    542

    积分

    专家

    积分
    542

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

    发表于 2023-4-4 11:37:38 | 显示全部楼层

    steven026 发表于 2023-4-4 09:08

    [md]```js
    const originObjects=[]; //建一个数组储存原始对象

    原来还得延迟一秒才能拿到值,这emmm的,不好玩

    
        const proxy = window.Proxy;
        window.Proxy = function () {
            let app = arguments[0]._
            if (app?.uid === 30) {
                originObjects.push(arguments[0]) //暴露Proxy的原始对象
                console.log("target",originObjects);
                setTimeout(() => {
                    Object.keys(originObjects[0]._.attrs.videoinfo).forEach(function (value, index) {
                        console.log("videokeys", value, index);
                    });
                }, 1000);
            }
            return new proxy(...arguments);
        };
    回复

    使用道具 举报

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

    [LV.10]以坛为家III

    31

    主题

    552

    回帖

    1555

    积分

    荣誉开发者

    积分
    1555

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

    发表于 2023-4-4 13:53:46 | 显示全部楼层
    脚本体验师001 发表于 2023-4-4 10:32
    我还是不明白,这个videoinfo是个Proxy对象,是不能够直接读取的。如何转为普通object类型? ...

    我没视频测试去测试,
    如果是Proxy套Proxy,而你只要获取内层的Proxy,你可以忽略外层Proxy,直接去劫持内层Proxy,
    如果内层Proxy不是Vue的app,可以不判断app.uid,通过其他方式判断去劫持

    我以前写的Hook Vue3 app只是劫持了整个页面所有Proxy的其中一部分即app,因为我的目的是劫持Vue,所以非app的Proxy我并不需要,就没有去劫持了。
    回复

    使用道具 举报

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

    [LV.7]常住居民III

    29

    主题

    601

    回帖

    542

    积分

    专家

    积分
    542

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

    发表于 2023-4-4 14:34:15 | 显示全部楼层
    本帖最后由 脚本体验师001 于 2023-4-4 14:40 编辑
    steven026 发表于 2023-4-4 13:53
    我没视频测试去测试,
    如果是Proxy套Proxy,而你只要获取内层的Proxy,你可以忽略外层Proxy,直接去劫持 ...

    老师你的库没有问题,通过doc(...).__vue__也能直接读取
    关键已经半路截杀了,不用再操作el属性了。就在这时问题出现了,™videoinfo怎么还是个空值
    灵犀所致延迟了一秒才发现有值。那么vue3真的太牛逼了,发现数据传递并不能实时性,发现真是海量的数据传递呀,啧啧啧,不懂
    回复

    使用道具 举报

    发表回复

    本版积分规则

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