UserScripts & Greasemonkey:调用网站的 JavaScript 函数

2023-12-06

我正在为 Firefox 和 Chrome 创建一个 UserScript 扩展,并且尝试使用网站 JavaScript 中的一些代码,例如:

function: myFunction(){
    return  Grooveshark.playNextSong();
}

问题是当我测试这段代码时,Grooveshark是一个空引用。

我知道还有其他人这样做过:

参见更好的 Groovshark

但我不知道为什么我的简单扩展无法调用 Grooveshark 的 JavaScript 函数。

我是否需要将我的脚本“附加”到文档中才能使其正常工作?:document.document.body.appendChild(script);

Greasemonkey 不是已经注入了我的扩展 JavaScript 吗?有人可以帮我澄清一下吗?

Thanks.


背景

Greasemonkey 不是已经注入了我的扩展 JavaScript 吗?有人可以帮我澄清一下吗?

Greasemonkey 在中执行您的脚本sandbox,这是一个受限环境,无法直接访问页面中的 JavaScript。 Greasemonkey 的早期版本直接将脚本注入到页面中,但这引入了严重的安全漏洞。在旧模型中,脚本以浏览器 chrome 的提升权限运行,这允许远程页面使用一些命令来访问 Greasemonkey 的内置功能。聪明的JavaScript。这很糟糕:

Greasemonkey 脚本包含自己的 GM_xmlhttprequest 对象,与普通的 xmlttprequest 对象不同,该对象可以访问计算机上的任何本地文件或向任意站点发出任意请求,而不考虑通常适用于 xmlhttprequest 的同源策略。(source)

当您访问window今天从 Greasemonkey 脚本中获取对象,你得到的是包装对象间接引用实际的window的属性。这个包装对象可以安全地修改,但是有重要的限制。对实际窗口对象的访问由unsafeWindow(简写为window.wrappedJSObject)。用于unsafeWindow重新打开了 Greasemonkey 的所有原始安全问题,并且在 Chrome 中不可用。应尽可能避免。

好消息:至少有两种方法可以安全地使用 Greasemonkey 的新安全模型。

脚本注入

现在 Greasemonkey 脚本可以安全地访问 DOM,接下来就很简单了注入一个<script>标记到<head>目标文档的。创建一个像这样的函数:

function exec(fn) {
    var script = document.createElement('script');
    script.setAttribute("type", "application/javascript");
    script.textContent = '(' + fn + ')();';
    document.body.appendChild(script); // run the script
    document.body.removeChild(script); // clean up
}

使用起来很简单:

exec(function() {
    return Grooveshark.playNextSong();
});

位置黑客

在某些情况下,脚本注入可能有点过头了,特别是当您只需要修改页面中变量的值或执行单个函数时。这位置黑客杠杆javascript:用于访问文档内容中的代码的 URL。这很像在 Greasemonkey 脚本中运行书签。

location.assign("javascript:Grooveshark.playNextSong();void(0)");

奖金脚本

这是一个完整的 Greasemonkey 脚本,演示了上面的示例。您可以在此页面上运行它。

// ==UserScript==
// @name           Content Function Test
// @namespace      lwburk
// @include        http://stackoverflow.com/questions/5006460/userscripts-greasemonkey-calling-a-websites-javascript-functions
// ==/UserScript==

function exec(fn) {
    var script = document.createElement('script');
    script.setAttribute("type", "application/javascript");
    script.textContent = '(' + fn + ')();';
    document.body.appendChild(script); // run the script
    document.body.removeChild(script); // clean up
}

window.addEventListener("load", function() {
    // script injection
    exec(function() {
        // alerts true if you're registered with Stack Overflow
        alert('registered? ' + isRegistered);
    });
    // location hack
    location.assign("javascript:alert('registered? ' + isRegistered);void(0)");
}, false);
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

UserScripts & Greasemonkey:调用网站的 JavaScript 函数 的相关文章

随机推荐

  • Spark结构化流仅从Kafka的一个分区获取消息

    我遇到了这样一种情况 spark 只能从 Kafka 2 分区主题的一个分区进行流式传输和获取消息 我的主题 C bigdata kafka 2 11 0 10 1 1 bin windows gt kafka topics create
  • 如何在选定区域打开相机活动

    每个身体 我是 Android 世界的新手 所以我需要你的帮助 我想知道我们如何在选定区域打开相机活动 以这样的方式 AS 在下面给出的屏幕截图中 不一定要在圆形区域中打开 在我的应用程序中 我可以在任何自定义区域中打开 可以是圆形 矩形或
  • 在Scheme中柯里化一个函数n次

    我无法找到一种将函数柯里化指定次数的方法 也就是说 我给函数一个自然数 n 和一个函数 fun 并且它对函数进行柯里化 n 次 例如 curry n fun 该功能和可能的应用程序是 curry 4 1 2 3 4 这将产生 10 我真的不
  • 将文本转换为 PDF

    我有一大串文本 显然是 PDF 文件的原始数据 我需要将其重新转换为 PDF 目前 我正在将字符串读入 StringBuffer 但如果需要 我可以更改它 从那里我尝试将其写入文件并更改扩展名 我真的希望这能起作用 但我有点知道它不会 我尝
  • GDB断点后如何恢复指令

    我读到 GDB 将 int 3 操作码 CC 放在目标程序内存中的所需地址处 Si这个操作是擦除程序存储器中的一条指令 1字节 我的问题是 当程序继续时 GDB 如何以及何时替换原始操作码 当我在 GDB 中输入 disassemble 时
  • Java 8 Update 71 后 Eclipse Mars 无法启动

    我昨天安装了 Java 8 Update 71 但之后我的 Eclipse 无法启动 Windows 仅在鼠标上显示一个简短的加载符号 仅此而已 在我使用 Java 8 Update 66 之前 一切都运行良好 所以我尝试用 clean参数
  • 如何找到下一个工作日:MATLAB

    鉴于日期 20170203 yyyymmdd 我如何找到下一个工作日 即本例中的 20170206 date datenum 20170203 yyyymmdd NBD nextBusinessDay date NBD 06 Feb 201
  • 绝对定位的容器不会扩展宽度以适应弹性盒内容[重复]

    这个问题在这里已经有答案了 我有一个flexbox在绝对定位的父级内部div 我期望flexbox有一个computed width 导致父 div 展开 但这不会发生 父 div 有一定的宽度 但不足以容纳 Flexbox 鉴于 Flex
  • 无法正确绑定 observables 的 observableArray

    我有以下代码应该绑定 observables 的 observableArray
  • Selenium 和 ChromeDriver:会话未创建,无法连接到渲染器

    我正在尝试通过 Mac 上的 Webdriver io Selenium 和 ChromeDriver 运行自动化测试 我正在使用所有相关软件的最新版本 硒3 9 1 Chrome 驱动程序 2 35 铬64 操作系统 macOS High
  • 如何在 iframe 内引用 iframe

    我想引用另一个 iframe 内的 iframe div class playButton Play div div class flex active slide document document div
  • 从 HashSet 中选取“任何”项目非常慢 - 如何快速做到这一点?

    我目前正在使用贪婪算法做很多工作 它们不关心索引等 它们只适用于组 集合 但我发现 85 的执行时间都花在尝试从 HashSet 中选择一个项目上 根据 MSDN 文档 HashSet 类提供高性能的集合操作 一套 是一个不包含重复元素的集
  • 复制/移动未实现复制的字段

    费里斯船长有一张地图 seven seas png 他隐藏了多个宝藏的区域 在坐标 5 7 和 7 9 处 他想为每件宝藏创建一个单独的藏宝图 原始地图不应更改 他决定使用 Rust 和图像箱为了这 extern crate image u
  • 带参数的 .html 漂亮 URL

    我有一个网站 仅包含 html前端 我想要漂亮的 URL 我的目标是创造这样的东西 http test com mypage html gt http test com mypage http test com mypage1 html g
  • Web 组件/HtmlElement:单元测试

    我正在尝试测试一个网络组件 这是我的项目结构 package json src app js index html test hello world test html 这是我的工作代码 class HelloWorld extends H
  • C# 并排合并两个或多个文本文件

    using StreamWriter writer File CreateText FinishedFile int lineNum 0 while lineNum lt FilesLineCount Min for int i 0 i l
  • C# 中迭代​​树的微优化

    我正在研究一个massive数字处理项目 从一开始我就一直在优化一切 因为我知道这很重要 在进行性能分析时 我的代码几乎 40 的生命时间都花在一个函数上 二叉树迭代器 public ScTreeNode GetNodeForState i
  • 如何在 VBScript 中使用 Excel 工作表函数?

    我需要计算列中活动单元格的数量AExcel 的 我可以在 Excel VBA 中使用 worksheetfunction countA 轻松实现此目的 但无法在 VBScript 中获得相同的结果 我尝试过以下代码 Dim objXl ob
  • 如何在第一个 selectOneMenu 更改时加载第二个 selectOneMenu? [复制]

    这个问题在这里已经有答案了 我有2个
  • UserScripts & Greasemonkey:调用网站的 JavaScript 函数

    我正在为 Firefox 和 Chrome 创建一个 UserScript 扩展 并且尝试使用网站 JavaScript 中的一些代码 例如 function myFunction return Grooveshark playNextSo