当它被阻止为403状态时,从外部源加载javascript资源

时间:2013-01-15 13:24:07

标签: javascript download greasemonkey userscripts

由于某种原因,我的ISP阻止了以下网址:

http://assets.tumblr.com/javascript/prototype_and_effects.js

Chrome控制台声明:

Failed to load resource: the server responded with a status of 403 (URLBlocked)

结果是我无法正确使用 Tumblr ,因为许多函数都依赖于此脚本。我已经联系了我的ISP并要求他们停止阻止此网址,但同时我想对此做点什么。

如何在外部加载此资源?它可以是bookmarklet解决方案,userscript / Greasemonkey或你能想到的任何其他东西。

1 个答案:

答案 0 :(得分:2)

A 403 status表示服务器(assets.tumblr.com)阻止了请求,而不是您的ISP。服务器执行此操作的最常见原因是(a)因为您没有以足够的访问权限登录,和/或(b)服务器未收到所需的引荐来源标头和/或cookie,和/或(c) )请求来自服务器已列入黑名单的IP地址。使用代理服务器可以触发某些站点的任何或所有这些。

这意味着如果您或您的代理服务器被阻止访问该文件,那么注入远程javascript的标准方法(用户脚本将使用)也将被阻止。

要解决此问题, Greasemonkey可以从本地副本回填javascript文件。要做到这一点:

  1. 创建文件Insure Tumbler has prototype.user.js,如下所示。将其放在不在计算机上temp文件夹中的目录中。
  2. 下载您引用的the prototype_and_effects.js file并将其放在同一文件夹中。您可能必须使用不同的(或没有代理),或不同的浏览器配置文件,或其他。 (对我来说,只需右键单击前一个链接即可下载。)
  3. 使用Greasemonkey安装脚本。 (Firefox:文件 - > 打开 Ctrl O )将起作用。)
  4. 脚本测试PrototypeEffect库并在本地加载它们(如果缺少一个)。可能需要 来让Tumblr再次工作,但如果是这样,那就超出了这个问题的范围。
  5. 适用于Firefox + Greasemonkey。应该使用Chrome + Tampermonkey(未经测试),在不支持@resource的情况下工作,例如直接Chrome。

  6. // ==UserScript==
    // @name     _Backfill Prototype and Effect libraries on Tumblr pages
    // @match    http://tumblr.com/*
    // @match    http://www.tumblr.com/*
    // @match    https://tumblr.com/*
    // @match    https://www.tumblr.com/*
    // @resource PandE_src  prototype_and_effects.js
    // @grant    GM_getResourceText
    // ==/UserScript==
    
    //-- Does this page load prototype_and_effects.js?
    var protoScriptNode = document.querySelector ("script[src*='prototype_and_effects']");
    if (protoScriptNode) {
        //console.log ("Page uses prototype_and_effects.js.");
    
        //-- Are Prototype and Effects loaded?
        var P   = unsafeWindow.Prototype;
        var E   = unsafeWindow.Effect;
        if (P  &&  P.Version  &&  E  &&  E.BlindDown) {
            //console.log ("Everything's loaded, no action needed.");
        }
        else {
            //console.log ("Loading prototype_and_effects.js");
            var PandE_src           = GM_getResourceText ("PandE_src");
            var scriptNode          = document.createElement ('script');
            scriptNode.type         = "text/javascript";
            scriptNode.textContent  = PandE_src;
            var targ                = document.getElementsByTagName ('head')[0];
            targ.appendChild (scriptNode);
        }
    }
    else {
        //-- No action needed
        //console.log ("Page doesn't use prototype_and_effects.js.");
    }