V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
nowheretoseek
V2EX  ›  问与答

想用油猴脚本调用页面上的函数,请问怎么做?

  •  
  •   nowheretoseek · 2022-06-25 20:01:20 +08:00 · 1293 次点击
    这是一个创建于 916 天前的主题,其中的信息可能已经有所发展或是发生改变。

    比如在知乎问答页加一个图标,点击时可以载入评论。

    遇到两个问题:

    1.脚本不在沙盒中运行的话,是不是可以直接调用页面 js 对外暴露的函数?

    2.现在 js 对外暴露很少,看 initator 很长一串调用栈,从相关 xhr 请求点到 initator ,也难以发现该怎么直接调用,也很难确定哪个是核心函数,就是发起请求并实现页面更新的那个函数,不知有没有什么好办法呢?

    6 条回复    2022-06-27 12:53:45 +08:00
    ljsh093
        1
    ljsh093  
       2022-06-25 20:29:06 +08:00   ❤️ 1
    - 在知乎问答页加一个图标,点击时可以载入评论

    这个可以 node.click()实现吧?

    - 脚本不在沙盒中运行的话,是不是可以直接调用页面 js 对外暴露的函数?

    绑定在 window 对象下的随便调用,如果是匿名或者闭包的,可以试着模拟他的实现自己重写一个方法来调用
    nowheretoseek
        2
    nowheretoseek  
    OP
       2022-06-25 21:01:26 +08:00
    @ljsh093 谢谢解惑,是不是说匿名或闭包的就没有办法直接调用了?
    ljsh093
        3
    ljsh093  
       2022-06-25 21:07:29 +08:00   ❤️ 1
    @nowheretoseek 是的,无法拿到上下文。不过有个暴力的办法就是把那个 script 节点删除再重新引入。
    JackCh3ng
        4
    JackCh3ng  
       2022-06-26 19:24:11 +08:00
    不知道有没有充分理解你的意思,我说一下我要实现这个功能的思路仅供参考。
    我觉得你可以这样做:
    1.找到评论的相关的 api ,可以通过这个 api 拿到相关数据。
    2.在页面上插入一个按钮,在油猴脚本里实现点击事件,调用评论 api 。
    3.把返回的数据写到页面上。
    ps:油猴发送请求的函数 GM_xmlhttpRequest 。
    Rache1
        5
    Rache1  
       2022-06-26 20:37:43 +08:00   ❤️ 1
    1.脚本不在沙盒中运行的话,是不是可以直接调用页面 js 对外暴露的函数?
    在头部添加 “// @grant unsafeWindow”,然后就可以在脚本里面使用 unsafeWindow ,就可以访问到页面的 window 了,注意:直接在脚本里面使用的 window ,不是真实的 window 。

    第二个问题,没有好的办法 😳
    nowheretoseek
        6
    nowheretoseek  
    OP
       2022-06-27 12:53:45 +08:00
    @JackCh3ng 是这个意思,我也是你这个思路,这是觉得麻烦。所以想着是不是能通过 initator 的调用栈发现关键函数,直接调用页面 js 中的功能,而不是自己再实现一次。

    但目前闭包、匿名函数在这些大站上都是标配了,从几位朋友的回复来看,基本没有办法直接调用。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1027 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 34ms · UTC 19:23 · PVG 03:23 · LAX 11:23 · JFK 14:23
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.