如何在注入的代码中使用GM_xmlhttpRequest
How to use GM_xmlhttpRequest in Injected Code?
我正在编写一个注入网页的用户脚本。该脚本从 Web 服务器读取一些数据,我想将消息发送到侦听应用程序以对数据做出反应。
现在,我所做的只是尝试向我的侦听应用程序发送一个字符串命令,看看我是否可以读取它。我的代码在注入之前可以工作,但之后我得到一个"未定义的引用错误"。
我怀疑这与这次"油脂猴访问违规"有关。但是,我一直无法找到有效的解决方案。我正在Chrome中开发。
这是我无法开始工作的代码部分。
GM_xmlhttpRequest({
method: "POST",
url: "http://localhost:7777",
data: "testing123",
headers: {
"Content-Type": "application/x-www-form-urlencoded"
},
onload: function(response)
{
if (response.responseText.indexOf("TEST") > -1)
{
console.log("Response confirmed...");
}
}
});
我对脚本很陌生,所以也许我错过了一些明显的东西。如何让它在注入的代码中工作?
GM_
函数在注入的代码中不起作用,因为注入的代码在目标页面的范围内运行。 如果他们确实在那里工作,那么不道德的网站也可以使用GM_
功能——做无法形容的邪恶。
解决方案,最可取的是:
-
不要注入代码。 很多时候,这真的没有必要,而且它总是使事情复杂化。 仅当你绝对需要使用目标页面加载的一些javascript时,才注入代码。
对于像jQuery这样的库,使用
@require
指令(Firefox),或者粘贴库代码或使用自定义manifest.json文件来包含它(Chrome),您将获得更好的性能。通过不注入代码,您可以:
- 保持轻松使用
GM_
功能的能力 - 避免或减少对外部服务器的依赖来交付库。
- 避免与页面的 JS 相关的潜在副作用和依赖关系。 (你甚至可以使用类似NoScript的东西来完全禁用页面的JS,而你的脚本仍在运行。
- 防止恶意网站利用您的脚本来访问
GM_
功能。
- 保持轻松使用
-
使用 Tampermonkey 扩展程序 (Chrome)。 这允许您通过提供更好的 Greasemonkey 仿真来避免脚本注入。 您可以使用
@require
指令和比 Chrome 本机提供的更强大/风险更大的unsafeWindow
版本。 -
将用户脚本代码拆分为注入部分(不能使用
GM_
函数)和非注入部分。 使用消息传递、轮询和/或特定的 DOM 节点在作用域之间进行通信。
如果确实必须使用注入的代码,下面是一个示例脚本,演示如何执行此操作:
// ==UserScript==
// @name _Fire GM_ function from injected code
// @include https://stackoverflow.com/*
// @grant GM_xmlhttpRequest
// ==/UserScript==
/* Warning: Using @match versus @include can kill the Cross-domain ability of
GM_xmlhttpRequest! Bug?
*/
function InjectDemoCode ($) {
$("body").prepend ('<button id="gmCommDemo">Open the console and then click me.</button>');
$("#gmCommDemo").click ( function () {
//--- This next value could be from the page's or the injected-code's JS.
var fetchURL = "http://www.google.com/";
//--- Tag the message, in case there's more than one type flying about...
var messageTxt = JSON.stringify (["fetchURL", fetchURL])
window.postMessage (messageTxt, "*");
console.log ("Posting message");
} );
}
withPages_jQuery (InjectDemoCode);
//--- This code listens for the right kind of message and calls GM_xmlhttpRequest.
window.addEventListener ("message", receiveMessage, false);
function receiveMessage (event) {
var messageJSON;
try {
messageJSON = JSON.parse (event.data);
}
catch (zError) {
// Do nothing
}
console.log ("messageJSON:", messageJSON);
if ( ! messageJSON) return; //-- Message is not for us.
if (messageJSON[0] == "fetchURL") {
var fetchURL = messageJSON[1];
GM_xmlhttpRequest ( {
method: 'GET',
url: fetchURL,
onload: function (responseDetails) {
// DO ALL RESPONSE PROCESSING HERE...
console.log (
"GM_xmlhttpRequest() response is:'n",
responseDetails.responseText.substring (0, 80) + '...'
);
}
} );
}
}
function withPages_jQuery (NAMED_FunctionToRun) {
//--- Use named functions for clarity and debugging...
var funcText = NAMED_FunctionToRun.toString ();
var funcName = funcText.replace (/^function's+('w+)'s*'((.|'n|'r)+$/, "$1");
var script = document.createElement ("script");
script.textContent = funcText + "'n'n";
script.textContent += 'jQuery(document).ready( function () {' + funcName + '(jQuery);} );';
document.body.appendChild (script);
};
您正在向本地主机发布。如果您愿意,(不是每个人都会)设置 CORS 标头以允许在您的本地主机服务器上访问被篡改的站点,或者如果它不是安全的/由其他人运行/发布的所有站点。
然后,您根本不需要使用GM_XHR,只要XHR被正确配置为跨域,您可以通过将其包装在注入的脚本中来完成。
- XMLHttpRequest未返回值-状态202
- XMLHttpRequest在移动设备上的chrome上不起作用
- AJAX简单错误.XMLHttpRequest无法加载http://localhost/mpl/getPage.php.
- 检查xmlhttprequest问题的消息
- 主线程上的同步XMLHttpRequest已弃用
- 如何定期发出xmlhttprequest
- javascript第三个XMLHttpRequest被拒绝.但前两个是允许的
- 上传带有XMLHttprequest的文件-多部分/表单数据中缺少边界
- 对象#<XMLHttpRequest>没有方法'完成'
- 在XMLHttpRequest之后重新初始化jQuery
- 如何将GreaseMonkey中的XMLHttpRequest延迟到目标页面加载完成
- Javascript XMLHttpRequest——只有第一个POST请求有效
- XMLHttpRequest - difference between Chrome & Firefox
- IE上的新XMLHttpRequest()出现JS Ajax未指定错误
- 非常简单的XMLHttpRequest不起作用
- 如何使用XMLHttpRequest下载文件
- XMLHttpRequest在$.ajax工作的地方给出了CORS错误
- XMLHttpRequest.open()AJAX中的参数url
- 使用GM-xmlhttpRequest而不是iframe来显示来自外部页面的相关信息
- 将@grant添加到GM脚本中可以打破XMLHttpRequest.prototype.open的过载