gpt4 book ai didi

javascript - 设置 @grant 值时无法使用所需的库

转载 作者:行者123 更新时间:2023-11-30 15:53:42 24 4
gpt4 key购买 nike

有几个与此相关的问题,但使用 unsafeWindow 的一般“解决方案”对我不起作用。

我正在尝试使用 Stack Exchange Javascript SDK .

这个有效:

// ==UserScript==
// @name testing
// @include http://stackoverflow.com/*
// @require https://api.stackexchange.com/js/2.0/all.js
// @version 1
// @grant none
// ==/UserScript==

console.log(SE);
SE.init({
clientId: 1234,
key: 'my key',
channelUrl: location.protocol + '//stackoverflow.com/blank',
complete: function (d) {
console.log(d);
console.log('SE init');
}
});

这不是:

// ==UserScript==
// @name testing
// @include http://stackoverflow.com/*
// @require https://api.stackexchange.com/js/2.0/all.js
// @version 1
// @grant GM_setValue
// ==/UserScript==

console.log(SE);
SE.init({
clientId: 1234,
key: 'my key',
channelUrl: location.protocol + '//stackoverflow.com/blank',
complete: function (d) {
console.log(d);
console.log('SE init');
}
});

但是,这两个版本都为 console.log(SE) 记录了 Object { authenticate: n(), init: r() } 我无法理解因为这意味着脚本可以访问 SE 对象。

“不起作用”是指它什么都不做;在第一个 console.log(SE) 之后没有任何内容记录到控制台。

我不明白如何让这个库工作。有人有什么想法吗?这与设置授权值时在 Firefox 上启用的沙箱有关。

顺便说一句,无论哪种方式,这都适用于 Chrome,但我的理解是这两个沙箱有很大不同。有什么方法可以绕过这个阻止 SE.init() 函数运行的 Firefox 沙箱吗?我试过 unsafeWindow.SE... 但这不起作用——我不认为它应该有所作为,因为脚本总是可以访问 SE 对象;它只是在实际调用它时遇到了问题!

最佳答案

快速破解 是将您的整个代码(包括简单 API 脚本)注入(inject)网页并使用消息传递(dispatchEvent + addEventListerner 用于窗口对象上的“消息”事件)以访问 GM_ 不可用于注入(inject)脚本的函数。

它不如 GM 沙箱安全:API key 可以通过 DOM 突变观察器/监听器或 onbeforescriptexecute 事件监听器拦截键。

// ==UserScript==
// @name testing
// @include http://stackoverflow.com/*
// @include https://stackoverflow.com/*
// @resource SE_JS_API https://api.stackexchange.com/js/2.0/all.js
// @version 1
// @grant GM_setValue
// @grant GM_getResourceText
// ==/UserScript==

document.head.appendChild(document.createElement('script')).text =
GM_getResourceText('SE_JS_API') + ';(' + function() {
SE.init({
clientId: 1234,
key: 'my key',
channelUrl: location.protocol + '//stackoverflow.com/blank',
complete: function (d) {
console.log(d);
console.log('SE init');
}
});
} + ')(); this.remove();'

API 脚本被声明为资源,因此它只在安装脚本时下载一次,并与脚本一起存储在用户的硬盘上。

或者,注入(inject) API 并通过 unsafeWindowexportFunction 调用它以进行回调:

document.head.appendChild(document.createElement('script')).text =
GM_getResourceText('SE_JS_API');

unsafeWindow.SE.init({
clientId: 1234,
key: 'my key',
channelUrl: location.protocol + '//stackoverflow.com/blank',
complete: exportFunction(function (d) {
console.log(d);
console.log('SE init');
}, unsafeWindow),
});

正确的解决方案是访问 actual API手动通过 GM_xmlhttpRequest 直到有人发布更好的库。在 Tampermonkey 中,您还需要为 API url 添加权限:
//@connect api.stackexchange.com.

关于javascript - 设置 @grant 值时无法使用所需的库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38920565/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com