【问题标题】:Get headers of all requests related to a page with tampermonkey使用 Tampermonkey 获取与页面相关的所有请求的标头
【发布时间】:2015-08-04 16:06:22
【问题描述】:

我正在尝试编写一个 Tampermonkey 脚本,它将 document.location 和标题收集到字典中。谷歌了一下,发现我应该使用某种全局变量,但它没有按我的意愿工作。

这是脚本:

// ==UserScript==
// @name         My Fancy New Userscript
// @namespace    http://your.homepage/
// @version      0.1
// @description  enter something useful
// @author       You
// @match        *://*/*
// @grant        none
// ==/UserScript==


if (unsafeWindow.resources == undefined) {
   var unsafeWindow.resources = [];
}

var host = window.location;
unsafeWindow.resources.push(host);
console.log(unsafeWindow.resources);

运行时出现以下错误:

错误:脚本“My Fancy New Userscript”的执行失败! unsafeWindow 没有定义

也许我正在尝试做的事情甚至不可能?

更新: 试图清楚一点。最终结果应生成一个字典,该字典将以 document.location 作为键,字典包含该位置的标头名称和标头值作为值。

{document.location = {"Headername" = "Header value", "Headername" = "Header value"}}

最终结果将用于生成包含字典中信息的表。像这样的:

/帕特里克

【问题讨论】:

  • unsafeWindow.resources 只要未在某处定义(您至少需要定义 unsafeWindow),就永远不会工作。此外,您能否更清楚地了解“字典”的含义?您需要将这些存储在本地还是什么?
  • 已更新。感谢您的评论!
  • 我仍然不明白你到底想要完成什么,更清楚的是:最大的问题是:你需要保留这些信息存储还是..?简而言之,您试图获取 DOM 加载的每一个资源并将其存储在一个对象中以便稍后打印一个表,这是您想要做的吗?无论如何,请记住,使用 unsafeWindow 可能会为您的用户脚本打开一些安全漏洞,请先看看这个:developer.mozilla.org/en-US/Add-ons/SDK/Guides/Content_Scripts/…
  • 是的,信息应该存储在Javascript变量中以备后用。生成信息的脚本本身将通过书签(运行 javascript 的书签)执行。它不会公开,因为我打算只在我们的网站上手动运行它,所以安全漏洞不会是一个大问题。感谢您的链接,我会确保阅读它。 /帕特里克
  • 哦,是的。该信息将用于稍后按需生成表格。 :)

标签: javascript tampermonkey


【解决方案1】:

请将此作为您应该完成的任务的简要示例,并注意在继续您的项目时可能会遇到一些问题,因为有时 document.location 可能有点难以检索。

除此之外,代码:

// ==UserScript==
// @name       My Fancy New Userscript
// @namespace  http://use.i.E.your.homepage/
// @version    0.1
// @description  enter something useful
// @match      *://*/*
// @copyright  2015+, You
// ==/UserScript==

var storage = (function(win){
    var localDrive = win.localStorage;

    return {
        save:  function (/* <string> */ key, /* <string | JSONstringified object> */ value) {
            localDrive.setItem(key, value);
        },
        destroy:  function (/* <string> */ key) {
            return localDrive.removeItem(key) ? true : false;   
        },
        get:    function (/* <string> */ key) {
            return localDrive.getItem(key) == '' || localDrive.getItem(key) == null ? false : localDrive.getItem(key);
        }
    }
})(window);

window.storage = storage;

document.addEventListener("DOMContentLoaded", function(e) {
    // Dom ready, start:

    // Check whether the array exists or not :
    if (!storage.get("myDataList")) {
        storage.save("myDataList", JSON.stringify(
                       [{
                           'href'     :     document.location.href,
                           'location' :     document.location,
                           'test1'    :     'test',
                           'test2'    :     'test2'
                       }]
                    )
                   );   
    }
    else {
        // If exists, log every single object: 
        var currentStorageList = JSON.parse(storage.get("myDataList"));
        for (var i = 0; i < currentStorageList.length; ++i) {
            console.log(currentStorageList[i]);
        }
    }

    // Check whether this element exists in the current list, else add :

    var currentStorageList = JSON.parse(storage.get("myDataList"));

    var elementExists = currentStorageList.some(function(el,i,arr) {
       return el.href === document.location.href;
    });

    if (!elementExists) {
        console.log("current elements doesn't exist, let's push it!");
        storage.save("myDataList", JSON.stringify(JSON.parse(storage.get("myDataList")).push({
                           'href'     :     document.location.href,
                           'location' :     document.location,
                           'test1'    :     'test',
                           'test2'    :     'test2'
                       })));
    }
});

这是纯 javascript,因为我没有看到你使用 jQuery。

我已经提供了:

  1. 一个舒适的 DOM 对象(存储),主要有三种方法:save(存储 key => value,其中 value 必须是字符串或 json 字符串化元素,因为您不能将数组存储在本地存储中),get(获取从键)和销毁(从键)。
  2. domready 开头的构造函数:如果保存元素的键不存在,它将创建它并填充当前文档位置,使用文档的 href 标识它。
  3. 一些示例可用于保存/检索您需要的内容。

请注意,这只是一个示例(但它确实有效)。

另外,在您的 tampermonkey 脚本设置中,不要忘记将其设置为在 document-end 运行。

xkcd 上的输出(用于测试)是这样的:

http://prntscr.com/784zw7(图片直接链接)

希望这对您的项目有所帮助;)

【讨论】:

  • 大多数时候你会在 stackoverflow 上获得帮助。大多数都很棒。但是还有一些人超越了。你真棒伙计。对我来说已经过了睡觉时间,但我明天会试一试。谢谢一百万!
  • @PatrikJ :不客气,我希望它对你以及将来最终需要它的人有所帮助;)
  • 完全符合我的要求。谢谢一百万!
猜你喜欢
  • 2023-03-06
  • 2013-10-25
  • 2015-10-29
  • 1970-01-01
  • 2011-04-22
  • 2011-10-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多