标签: userscripts

如何在注入代码中使用GM_xmlhttpRequest?

我正在编写一个注入网页的用户脚本.该脚本从Web服务器读取一些数据,我想将消息发送到侦听应用程序以对数据做出反应.

现在,我正在做的就是尝试将一个字符串命令发送到我的监听应用程序,看看我是否可以读取它.我的代码在注入之前工作,但之后我得到一个"未定义的引用错误".

我怀疑这与"Greasemonkey访问违规"有关.但是,我一直无法找到有效的解决方案.我正在开发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..."); 
      }
   }
}); 
Run Code Online (Sandbox Code Playgroud)

我对脚本很新,所以也许我错过了一些明显的东西.如何在注入的代码中使用它?

javascript greasemonkey userscripts google-chrome-extension

8
推荐指数
1
解决办法
8952
查看次数

无法在Tampermonkey中重命名或创建多个自定义用户脚本脚本

我目前正在尝试在Tampermonkey中为单独的页面创建3个用户脚本.使用GUI,我可以单击"添加新脚本",但是每次我进行更改后保存,它都会重新保存在"我喜欢的新用户脚本"的顶部,并且似乎没有任何重命名方式脚本.

也许我错过了什么?:)

userscripts tampermonkey

8
推荐指数
1
解决办法
3550
查看次数

在ui-dialog-buttonpane中添加搜索按钮和文本框

我正在编写一个greasemonkey脚本来操作DOM,查询服务器并在单独的jquery对话框中显示结果.我想为它添加以下两个功能:

  1. 提供一个搜索框,其作用类似于浏览器上的简单搜索(即仅搜索jquery对话框的内容并突出显示文本).
  2. 提供一个文本框,其内容应永久存储以供将来用户使用,除非用户明确更改.

我面临的问题是我想在对话框的ui-dialog-buttonpane区域中包含这两个区域,在关闭按钮的左侧,但我无法弄清楚如何做到这一点.

我所知道的是我可以使用window.find()(这里使用http://www.javascripter.net/faq/searchin.htm)来启用浏览器查找功能.

有人可以帮我弄这个吗 ?以下是我现有的greasemonkey脚本的代码:

// ==UserScript==
// @name        Query for each URL Asynchronously
// @namespace   SupportScript
// @include     *
// @require     https://ajax.googleapis.com/ajax/libs/jquery/2.1.3/jquery.min.js
// @require     https://ajax.googleapis.com/ajax/libs/jquery/ui/1.11.0/jquery-ui.min.js
// @resource    jqUI_CSS  https://ajax.googleapis.com/ajax/libs/jqueryui/1.11.3/themes/redmond/jquery-ui.css
// @grant       GM_addStyle
// @grant       GM_getResourceText
// @grant       GM_getResourceURL
// @run-at      document-end
// allow pasting
// ==/UserScript==

var snapshotResults = document.evaluate('//a[contains(@href,"http")]/@href', document, null, XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE, null);
var windowWidth = $(window).width()-800;
var windowHeight = $(window).height();

var zNode = document.createElement ('input');
zNode.setAttribute ('id', 'SSButton');
zNode.setAttribute( …
Run Code Online (Sandbox Code Playgroud)

javascript jquery greasemonkey jquery-ui userscripts

8
推荐指数
1
解决办法
1229
查看次数

Microsoft Edge是否支持用户脚本?

微软是否宣布Edge是否支持用户脚本?通过插件(类似于Firefox中的Greasemonkey或Chrome中的Tampermonkey)或作为开箱即用的功能无关紧要.

javascript browser userscripts microsoft-edge microsoft-edge-extension

8
推荐指数
1
解决办法
6137
查看次数

如何使用Git管理我的greasemonkey用户脚本(以便在GitHub中托管它们)

我想使用Git来促进我的用户脚本的开发(21).另外,我也希望将它们托管在GitHub中.(在Windows 10中使用Greasemonkey和Firefox).

所以,我的问题是:使用Git管理我的用户脚本的建议方法是什么,以便在GitHub中托管它们?

  • 保留一个单独的文件夹(例如c:\my_scripts,它将是我的repo文件夹),其中包含我的userscripts文件的副本,
    即每次我更改我的一个用户脚本文件(位于gm_scripts)时,
    我必须手动将其复制gm_scripts\script_subfoldermy_scripts

  • 将我的所有用户脚本放在同一个单独的文件夹(我的repo文件夹)中,
    并将它们链接到该gm_scripts文件夹(在.bat文件中使用mklink -symbolic links),正如我在这个答案中
    读到的那样

  • 只创建一个包含我的gm_scripts内容的存储库
    (内部gm_scripts,除了我的21个用户脚本,我还安装了许多其他脚本,我必须将其包含在我的.gitignore文件中)
  • 还是有更好的方法让我想念

我注意到许多用户脚本的两位作者的回购:@Mottie和@jerone,他们在GitHub中托管了许多用户脚本,但他们遵循不同的方法:
Mottie的用户脚本位于repo的根文件夹中(只是.js文件,没有子文件夹),(截图)
jerone的用户脚本位于repo中的每个子文件夹中(截图).

我的猜测是,Mottie将他所有的用户脚本放在同一个单独的文件夹(这是repo)中,并将它们链接到该gm_scripts文件夹,
而jerone要么只保留一个单独的文件夹作为回购,带有他的脚本的副本,
或者有他的回购包含gm_scripts文件夹
(但是,jerone的的.gitignore不包含在gm_folder这些文件应该被忽视,如条目.db,.wal,.shm,config.xml …

git greasemonkey github userscripts

8
推荐指数
1
解决办法
807
查看次数

网页可以检测到篡改用户脚本吗?

我的问题有两个方面。首先,沙盒模型如何工作,如何影响用户脚本,从网页和用户脚本角度可以访问/看到的内容,以及如果使用其他沙盒模型会影响页面,从而能够注意到脚本已注入到页面中(或不)。其次,如何将脚本注入到页面中,并且页面可以检测到它?

第一

据我所知,当您使用时@grant none,沙箱已禁用,您将可以访问该网页及其javascript。如果您对javascript和/或DOM进行了任何更改,则该页面可能会检测到它。

我的理解是,如果使用的话@grant unsafeWindow,您的脚本将被隔离在自己的js上下文中,您所做的任何事情window都不会被网页看到,但是您可以通过来访问网页和javascript unsafeWindow。您将具有对DOM的常规访问权限,例如document返回常规页面文档,而无需说unsafeWindow.document。显然,您对DOM或页面js上下文所做的任何更改(例如unsafeWindow.foo = 'bar';)仍然可以检测到。其原因unsafe不是因为是否被检测到,而是因为您有可能GM_*在此模式下使不受信任的页面访问特权功能(在常规模式下不授予特权功能,这意味着@grant GM_*因为任何功能都会隔离js上下文,除非您(@grant unsafeWindow),否则您将无法访问页面的js上下文

第二

如何将脚本注入页面?网页是否可能注意到用户脚本注入(假设用户脚本修改了页面上的NOTHING)。

例如,如果脚本是使用script标记注入的,那么我认为该页面可能会注意到脚本注入,甚至可以查看其代码吗?

沙盒模型在这种情况发生过程中是否具有任何作用,并使它“更安全”而不被看到?例如,如果您使用来隔离js上下文@grant unsafeWindow,那么网页上的js甚至可能看不到任何用户脚本加载事件,因此@grant unsafeWindow从根本上更安全,除非您去修改DOM或unsafeWindow当然。

我还假设不存在特殊功能,对象,属性等的泄漏(例如GM_info泄露到tampermonkey存在的网页上)。既不在@grant none模式@grant unsafeWindow下也不在模式下(前提是您没有向页面泄漏任何内容)

unsafeWindow只要您不修改任何内容(尤其是不要将特权GM_*函数暴露给unsafeWindow),这会让我觉得实际上在被检测到方面更安全(因为js上下文是隔离的)。例如,如果在@grant none模式下使用eventListener ,则可能会检测到它,但如果在@grant unsafeWindow模式下使用,则可能由于隔离而无法检测到它?此外,如果某个页面有可能检测到用户脚本加载(我不知道这是否可能实现),那么它将不知道js上下文是否隔离

简要总结一下,如果您不背叛页面,那么页面是否可以检测到用户脚本或tampermonkey的存在?

我的上述任何想法在任何领域都是错误的吗?如果是,那么它实际上是如何工作的?

更新资料

一些需要澄清的信息:

用户脚本仅从页面被动地读取信息(可能使用MutationObserver)。它不会以任何方式改变任何内容,不使用任何js库(既不在用户脚本中也不从网页中使用),没有ajax调用,没有脚本节点,绝对没有单击等。脚本可以从JS vars中读取一些信息页面(假设那些var和函数没有被诱杀),以及使用WebSocket(内部服务)。也使用IIFE。因此,主要的问题是,篡改猴子本身 …

javascript google-chrome sandbox userscripts tampermonkey

8
推荐指数
1
解决办法
843
查看次数

XMLHttpRequest for JSON文件在Chrome中完美运行,但在Firefox中无法运行

我已将问题区域缩小到以下功能.这是我写的用户脚本的一部分.它在Chrome中完美运行,但在Firefox/Greasemonkey中根本不起作用.我整天都在修补它并撞到了一堵砖墙.唯一有意义的是,如果JSON.parse不能正常工作,这是有道理的,因为已知Chrome处理JSON.parse有点不同......但我知道JSON完美形成!

function getTagline() {
    var jsonfile = new XMLHttpRequest();
    jsonfile.open("GET", "http://example.com/somegood.json", true);
    jsonfile.onreadystatechange = function() {
        if (jsonfile.readyState == 4) {
            if (jsonfile.status == 200) {
                var taglines = JSON.parse(jsonfile.responseText);
                var choose = Math.floor(Math.random() * taglines.length);
                var tagline = document.createTextNode(taglines[choose].metais);
                insertTagline(tagline);
            }
        }
    };
    jsonfile.send(null);
}
Run Code Online (Sandbox Code Playgroud)

有任何想法吗?

javascript firefox json google-chrome userscripts

7
推荐指数
1
解决办法
7814
查看次数

使用userscript捕获页面xmlhttp请求

我有一个用户脚本(用于chrome和FF),它为页面添加了重要功能,但最近因为开发人员向页面添加了一些AJAX而被破坏.我想修改脚本来监听页面xmlhttp请求,这样我就可以根据responseText页面接收的JSON格式动态更新我添加的内容.

搜索已经发现了许多应该工作的功能,并且在控制台中运行时可以正常工作.但是,它们不会从用户脚本的上下文中执行任何操作.

(function(open) {

    XMLHttpRequest.prototype.open = function(method, url, async, user, pass) {

        this.addEventListener("readystatechange", function() {
            console.log(this.readyState);
        }, false);

        open.call(this, method, url, async, user, pass);
    };

})(XMLHttpRequest.prototype.open);
Run Code Online (Sandbox Code Playgroud)

来自:如何从Greasemonkey脚本拦截XMLHttpRequests?

这工作完全在控制台中,我可以改变this.readyState,以this.responseText和它的伟大工程(尽管在剧本我需要它来打开JSON数据转换成一个对象,然后让我userscript内操纵它.不只是写到控制台) .但是,如果我将其粘贴到用户脚本中没有任何反应.页面上的xmlhttp请求似乎没有被usercript中的事件处理程序检测到.

执行请求的页面使用jquery $ .get()函数,如果它可能与它有任何关系.虽然我不这么认为.

我无法想象没有办法,似乎在AJAX页面上运行的任何用户脚本都需要这种能力.

ajax xmlhttprequest userscripts

7
推荐指数
1
解决办法
4718
查看次数

使用自定义样式修复Gmail的布局

我正试图在我的小型1024x768屏幕上使Gmail的新外观可用 - 默认布局只留下一个小窗口的消息,被不动的元素包围.滚动那个小窗口非常烦人.

我已经成功地使整个页面滚动使用时尚的用户样式(修改后的版本这一个):

@-moz-document domain('mail.google.com'), 
 url-prefix('https://mail.google.com/mail') {

.akc.lKgBkb,
.oLaOvc.aeJ,
.lKgBkb.nH.oy8Mbf,
.lKgBkb.ajl.aib
{
  height: auto !important;
  overflow: hidden !important;
}

#canvas_frame { overflow-y: scroll; }

.l2 { padding-bottom: 20px !important; }

}
Run Code Online (Sandbox Code Playgroud)

应该具有滚动条的元素现在具有height: auto,并且滚动的是整个外部页面(in #canvas-frame)应该保持静态.

我对这种效果感到非常满意 - 它的效果几乎与旧的Gmail一样.但是,存在一个问题 - 用键盘滚动(箭头键,PgUp/PgDn,Home/End)停止工作.关于如何解决这个问题的任何想法?

css userscripts

7
推荐指数
1
解决办法
1088
查看次数

Tampermonkey脚本不更新

我在让脚本自动更新时遇到问题.如果我强制检查更新,那么它就可以很好地获取新版本.但是,我无法在新的更新可用时自动通知我.

我的脚本具有以下元数据:

// ==UserScript==
// @name         PortalScript
// @namespace    PortalScript
// @version      2.1.0.9
// @description  Contains customizations to be applied to the portal
// @author       Tristan Lee
// @match        https://test-support.portal.dev
// @grant        none
// @downloadURL https://rawgit.com/tristanlee85/supportportal/master/supportportal.js
// @updateURL https://rawgit.com/tristanlee85/supportportal/master/supportportal.js
// ==/UserScript==
Run Code Online (Sandbox Code Playgroud)

Tampermonkey设置为每小时检查更新.但是,存储库中的版本可能是2.1.0.10,但自版本更改后数小时后,我从未收到有关更新可用的通知.

我也不认为这@updateURL是必要的,因为@downloadURL指定,但我添加它作为检查,因为只是@downloadURL没有工作.

userscripts tampermonkey

7
推荐指数
0
解决办法
900
查看次数