1

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

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 并要求他们停止阻止此 URL,但同时我想对此做点什么。

如何从外部加载此资源?它可以是书签解决方案、用户脚本/Greasemonkey 或任何其他你能想到的东西。

4

1 回答 1

2

403 状态意味着服务器(assets.tumblr.com) 阻止了请求,而不是您的 ISP。服务器这样做的最常见原因是(a)因为您没有以足够的访问权限登录,和/或(b)服务器没有收到它想要的引荐来源标头和/或 cookie,和/或(c ) 请求来自服务器已列入黑名单的 IP 地址。使用代理服务器可以为某些站点触发任何或所有这些。

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

为了解决这个问题,Greasemonkey 可以从本地副本回填 javascript 文件。去做这个:

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


// ==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.");
}
于 2013-01-15T20:08:08.540 回答