|
阅读:2950回复:4
flickr重定向到大图的问题
用Redirector.uc.js的重定向,规则如下
{
//http://bbs.kafan.cn/thread-1801036-1-1.html
name: "flickr >> 原始大图",
from: /^(https?:\/\/c\d\.staticflickr\.com\/\d\/\d+\/\d+_[^\._]+)(_[a-z])?(\.jpg)$/,
exclude: /^(https?:\/\/c\d\.staticflickr\.com\/\d\/\d+\/\d+_\w+)_b(\.jpg)$/,
to: "$1_b$3",
regex: true
}浏览flickr出现无法显示图片,点击放大又可以显示,比如浏览下面网页
https://www.flickr.com/photos/mytripsmypics/albums/72157604812751507/with/2485664017/ 出现下面无法显示封面
求修改 |
|
|
|
1楼#
发布于:2015-10-03 23:45
|
|
|
2楼#
发布于:2015-10-04 22:33
gzmaybe:没有此问题,但是加载速度有点慢我用这个1.5.5版本不起作用,我目前用的是1.4.5版本 // ==UserScript==
// @name redirector_ui.uc.js
// @namespace redirector@haoutil.com
// @description Redirect your requests.
// @include chrome://browser/content/browser.xul
// @author harv.c
// @homepage http://haoutil.com
// @version 1.4.5
// ==/UserScript==
(function() {
Cu.import("resource://gre/modules/XPCOMUtils.jsm");
Cu.import("resource://gre/modules/Services.jsm");
Cu.import("resource://gre/modules/NetUtil.jsm");
function Redirector() {
this.addIcon = true; // 是否添加按钮
this.state = true; // 是否启用脚本
this.rulesFile = "local\\_redirector.js";
this.rules = [];
this.enableIcon = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQBAMAAADt3eJSAAAAElBMVEUAAAAAAADBwcEFBQWwsLD19fWMU4jVAAAAAXRSTlMAQObYZgAAACtJREFUCNdjwAGYFaAMJhMgIQgGCjARNDVQYQNWCMMZpg6iCywCV8NAAAAAzfAC0C27CasAAAAASUVORK5CYII=";
this.disableIcon = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQBAMAAADt3eJSAAAAElBMVEUAAAAAAADBwcEFBQWwsLD19fWMU4jVAAAAAXRSTlMAQObYZgAAACtJREFUCNdjwAGYFaAMJhMgIQgGCjARNDVQYQNWCMMZpg6iCywCV8NAAAAAzfAC0C27CasAAAAASUVORK5CYII=";
}
Redirector.prototype = {
_cache: {
redirectUrl: {},
clickUrl: {}
},
classDescription: "Redirector content policy",
classID: Components.ID("{1d5903f0-6b5b-4229-8673-76b4048c6675}"),
contractID: "@haoutil.com/redirector/policy;1",
xpcom_categories: ["content-policy", "net-channel-event-sinks"],
init: function() {
this.loadRule();
this.drawUI();
if (!this.state) return;
window.addEventListener("click", this, false);
let registrar = Components.manager.QueryInterface(Ci.nsIComponentRegistrar);
registrar.registerFactory(this.classID, this.classDescription, this.contractID, this);
let catMan = Cc["@mozilla.org/categorymanager;1"].getService(Ci.nsICategoryManager);
for each(let category in this.xpcom_categories)
catMan.addCategoryEntry(category, this.classDescription, this.contractID, false, true);
Services.obs.addObserver(this, "http-on-modify-request", false);
Services.obs.addObserver(this, "http-on-examine-response", false);
},
destroy: function() {
if (this.state) return;
window.removeEventListener("click", this, false);
let registrar = Components.manager.QueryInterface(Ci.nsIComponentRegistrar);
registrar.unregisterFactory(this.classID, this);
let catMan = Cc["@mozilla.org/categorymanager;1"].getService(Ci.nsICategoryManager);
for each(let category in this.xpcom_categories)
catMan.deleteCategoryEntry(category, this.classDescription, false);
Services.obs.removeObserver(this, "http-on-modify-request", false);
Services.obs.removeObserver(this, "http-on-examine-response", false);
},
clearCache: function() {
// clear cache
this._cache = {
redirectUrl: {},
clickUrl: {}
};
},
reload: function() {
this.clearCache();
this.loadRule();
this.clearItems();
this.buildItems();
},
edit: function() {
let aFile = Cc["@mozilla.org/file/directory_service;1"].getService(Ci.nsIDirectoryService).QueryInterface(Ci.nsIProperties).get('UChrm', Ci.nsILocalFile);
aFile.appendRelativePath(this.rulesFile);
if (!aFile || !aFile.exists() || !aFile.isFile()) return;
var editor;
try {
editor = Services.prefs.getComplexValue("view_source.editor.path", Ci.nsILocalFile);
} catch (e) {
alert("Please set editor path.\nview_source.editor.path");
toOpenWindowByType('pref:pref', 'about:config?filter=view_source.editor.path');
return;
}
var UI = Cc["@mozilla.org/intl/scriptableunicodeconverter"].createInstance(Ci.nsIScriptableUnicodeConverter);
UI.charset = window.navigator.platform.toLowerCase().indexOf("win") >= 0 ? "gbk" : "UTF-8";
var process = Cc['@mozilla.org/process/util;1'].createInstance(Ci.nsIProcess);
try {
var path = UI.ConvertFromUnicode(aFile.path);
var args = [path];
process.init(editor);
process.run(false, args, args.length);
} catch (e) {
alert("editor error.")
}
},
toggle: function(i) {
if (i) {
this.rules[i].state = !this.rules[i].state;
// update checkbox state
let item = document.getElementById("redirector-item-" + i);
if (item) item.setAttribute("checked", this.rules[i].state);
// clear cache
this.clearCache();
} else {
let menuitems = document.querySelectorAll("menuitem[id^='redirector-item-']");
this.state = !this.state;
if (this.state) {
this.init();
Object.keys(menuitems).forEach(function(n) menuitems[n].setAttribute("disabled", false));
} else {
this.destroy();
Object.keys(menuitems).forEach(function(n) menuitems[n].setAttribute("disabled", true));
}
// update checkbox state
let toggle = document.getElementById("redirector-toggle");
if (toggle) {
toggle.setAttribute("checked", this.state);
}
// update icon state
let icon = document.getElementById("redirector-icon");
if (icon) {
icon.style.listStyleImage = "url(" + (this.state ? this.enableIcon : this.disableIcon) + ")";
}
}
},
drawUI: function() {
if (this.addIcon && !document.getElementById("redirector-icon")) {
// add icon
let icon = document.createElement("menu");
icon.setAttribute("id", "redirector-icon");
icon.setAttribute("context", "redirector-menupopup");
icon.setAttribute("label", "Redirector");
icon.setAttribute("class", "menu-iconic");
icon.setAttribute("style", "padding: 0px 0px; list-style-image: url(" + (this.state ? this.enableIcon : this.disableIcon) + ")");
// add menu
let menupopup = document.createElement("menupopup");
menupopup.setAttribute("id", "redirector-menupopup");
menupopup.innerHTML = '\
<menuitem label="启用重定向" id="redirector-toggle" type="checkbox" autocheck="false" key="redirector-toggle-key" checked="' + this.state + '" oncommand="Redirector.toggle();" />\
<menuitem label="重载规则" id="redirector-reload" oncommand="Redirector.reload();"/>\
<menuitem label="编辑规则" id="redirector-edit" oncommand="Redirector.edit();"/>\
<menuseparator id="redirector-sepalator"/>\
';
icon.appendChild(menupopup);
var insPos = document.getElementById('devToolsSeparator');
insPos.parentNode.insertBefore(icon, insPos);
// add rule items
this.buildItems();
}
if (!document.getElementById("redirector-toggle-key")) {
// add shortcuts
let key = document.getElementById("mainKeyset").appendChild(document.createElement("key"));
key.setAttribute("id", "redirector-toggle-key");
key.setAttribute("oncommand", "Redirector.toggle();");
key.setAttribute("key", "r");
key.setAttribute("modifiers", "shift");
}
},
loadRule: function() {
var aFile = Cc["@mozilla.org/file/directory_service;1"].getService(Ci.nsIDirectoryService).QueryInterface(Ci.nsIProperties).get('UChrm', Ci.nsILocalFile);
aFile.appendRelativePath(this.rulesFile);
if (!aFile.exists() || !aFile.isFile()) return null;
var fstream = Cc["@mozilla.org/network/file-input-stream;1"].createInstance(Ci.nsIFileInputStream);
var sstream = Cc["@mozilla.org/scriptableinputstream;1"].createInstance(Ci.nsIScriptableInputStream);
fstream.init(aFile, -1, 0, 0);
sstream.init(fstream);
var data = sstream.read(sstream.available());
try {
data = decodeURIComponent(escape(data));
} catch (e) {}
sstream.close();
fstream.close();
if (!data) return;
var sandbox = new Cu.Sandbox(new XPCNativeWrapper(window));
try {
Cu.evalInSandbox(data, sandbox, "1.8");
} catch (e) {
return;
}
this.rules = sandbox.rules;
},
clearItems: function() {
let menu = document.getElementById("redirector-menupopup");
let menuitems = document.querySelectorAll("menuitem[id^='redirector-item-']");
if (!menu || !menuitems) return;
for (let i = 0; i < menuitems.length; i++) {
menu.removeChild(menuitems[i]);
}
},
buildItems: function() {
let menu = document.getElementById("redirector-menupopup");
if (!menu) return;
for (let i = 0; i < this.rules.length; i++) {
let menuitem = menu.appendChild(document.createElement("menuitem"));
menuitem.setAttribute("label", this.rules[i].name);
menuitem.setAttribute("id", "redirector-item-" + i);
menuitem.setAttribute("class", "redirector-item");
menuitem.setAttribute("type", "checkbox");
menuitem.setAttribute("autocheck", "false");
menuitem.setAttribute("checked", this.rules[i].state != null ? this.rules[i].state : true);
menuitem.setAttribute("oncommand", "Redirector.toggle('" + i + "');");
menuitem.setAttribute("disabled", !this.state);
}
},
getRedirectUrl: function(originUrl) {
let url;
try {
url = decodeURIComponent(originUrl);
} catch (e) {
url = originUrl;
}
let redirectUrl = this._cache.redirectUrl[url];
if (typeof redirectUrl != "undefined")
return redirectUrl;
redirectUrl = null;
for each(let rule in this.rules) {
if (rule.state == null) rule.state = true;
if (!rule.state) continue;
let regex, from, to, exclude;
if (rule.computed) {
regex = rule.computed.regex;
from = rule.computed.from;
to = rule.computed.to;
exclude = rule.computed.exclude;
} else {
regex = false;
from = rule.from;
to = rule.to;
exclude = rule.exclude;
if (rule.wildcard) {
regex = true;
from = this.wildcardToRegex(rule.from);
exclude = this.wildcardToRegex(rule.exclude);
} else if (rule.regex) {
regex = true;
}
rule.computed = {
regex: regex,
from: from,
to: to,
exclude: exclude
};
}
let redirect = regex ? from.test(url) ? !(exclude && exclude.test(url)) : false : from == url ? !(exclude && exclude == url) : false;
if (redirect) {
redirectUrl = {
url: typeof to == "function" ? regex ? to(url.match(from)) : to(from) : regex ? url.replace(from, to) : to,
resp: rule.resp
};
break;
}
}
this._cache.redirectUrl[url] = redirectUrl;
return redirectUrl;
},
wildcardToRegex: function(wildcard) {
return new RegExp((wildcard + "").replace(new RegExp("[.\\\\+*?\\[\\^\\]$(){}=!<>|:\\-]", "g"), "\\$&").replace(/\\\*/g, "(.*)").replace(/\\\?/g, "."), "i");
},
getTarget: function(redirectUrl, callback) {
NetUtil.asyncFetch(redirectUrl.url, function(inputStream, status) {
let binaryOutputStream = Cc['@mozilla.org/binaryoutputstream;1'].createInstance(Ci['nsIBinaryOutputStream']);
let storageStream = Cc['@mozilla.org/storagestream;1'].createInstance(Ci['nsIStorageStream']);
let count = inputStream.available();
let data = NetUtil.readInputStreamToString(inputStream, count);
storageStream.init(512, count, null);
binaryOutputStream.setOutputStream(storageStream.getOutputStream(0));
binaryOutputStream.writeBytes(data, count);
redirectUrl.storageStream = storageStream;
redirectUrl.count = count;
if (typeof callback === 'function')
callback();
});
},
// nsIDOMEventListener interface implementation
handleEvent: function(event) {
if (!event.ctrlKey && "click" === event.type && 1 === event.which) {
let target = event.target;
while (target) {
if (target.tagName && "BODY" === target.tagName.toUpperCase()) break;
if (target.tagName && "A" === target.tagName.toUpperCase() && target.target && "_BLANK" === target.target.toUpperCase() && target.href) {
this._cache.clickUrl[target.href] = true;
break;
}
target = target.parentNode;
}
}
},
// nsIContentPolicy interface implementation
shouldLoad: function(contentType, contentLocation, requestOrigin, context, mimeTypeGuess, extra) {
// don't redirect clicking links with "_blank" target attribute
// cause links will be loaded in current tab/window
if (this._cache.clickUrl[contentLocation.spec]) {
delete this._cache.clickUrl[contentLocation.spec];
return Ci.nsIContentPolicy.ACCEPT;
}
// only redirect documents
if (contentType != Ci.nsIContentPolicy.TYPE_DOCUMENT)
return Ci.nsIContentPolicy.ACCEPT;
if (!context || !context.loadURI)
return Ci.nsIContentPolicy.ACCEPT;
let redirectUrl = this.getRedirectUrl(contentLocation.spec);
if (redirectUrl && !redirectUrl.resp) {
context.loadURI(redirectUrl.url, requestOrigin, null);
return Ci.nsIContentPolicy.REJECT_REQUEST;
}
return Ci.nsIContentPolicy.ACCEPT;
},
shouldProcess: function(contentType, contentLocation, requestOrigin, context, mimeTypeGuess, extra) {
return Ci.nsIContentPolicy.ACCEPT;
},
// nsIChannelEventSink interface implementation
asyncOnChannelRedirect: function(oldChannel, newChannel, flags, redirectCallback) {
this.onChannelRedirect(oldChannel, newChannel, flags);
redirectCallback.onRedirectVerifyCallback(Cr.NS_OK);
},
onChannelRedirect: function(oldChannel, newChannel, flags) {
// only redirect documents
if (!(newChannel.loadFlags & Ci.nsIChannel.LOAD_DOCUMENT_URI))
return;
let newLocation = newChannel.URI.spec;
if (!newLocation)
return;
let callbacks = [];
if (newChannel.notificationCallbacks)
callbacks.push(newChannel.notificationCallbacks);
if (newChannel.loadGroup && newChannel.loadGroup.notificationCallbacks)
callbacks.push(newChannel.loadGroup.notificationCallbacks);
let win, webNav;
for each(let callback in callbacks) {
try {
win = callback.getInterface(Ci.nsILoadContext).associatedWindow;
webNav = win.QueryInterface(Ci.nsIInterfaceRequestor).getInterface(Ci.nsIWebNavigation);
break;
} catch (e) {}
}
if (!webNav)
return;
let redirectUrl = this.getRedirectUrl(newLocation);
if (redirectUrl && !redirectUrl.resp) {
webNav.loadURI(redirectUrl.url, null, null, null, null);
}
},
// nsIObserver interface implementation
observe: function(subject, topic, data, additional) {
switch (topic) {
case "http-on-modify-request":
{
let http = subject.QueryInterface(Ci.nsIHttpChannel);
let redirectUrl = this.getRedirectUrl(http.URI.spec);
if (redirectUrl && !redirectUrl.resp)
if (http.redirectTo)
// firefox 20+
http.redirectTo(Services.io.newURI(redirectUrl.url, null, null));
else
// others replace response body
redirectUrl.resp = true;
break;
}
case "http-on-examine-response":
{
let http = subject.QueryInterface(Ci.nsIHttpChannel);
let redirectUrl = this.getRedirectUrl(http.URI.spec);
if (redirectUrl && redirectUrl.resp) {
if (!http.redirectTo)
redirectUrl.resp = false;
if (!redirectUrl.storageStream || !redirectUrl.count) {
http.suspend();
this.getTarget(redirectUrl, function() {
http.resume();
});
}
let newListener = new TrackingListener();
subject.QueryInterface(Ci.nsITraceableChannel);
newListener.originalListener = subject.setNewListener(newListener);
newListener.redirectUrl = redirectUrl;
}
break;
}
}
},
// nsIFactory interface implementation
createInstance: function(outer, iid) {
if (outer)
throw Cr.NS_ERROR_NO_AGGREGATION;
return this.QueryInterface(iid);
},
// nsISupports interface implementation
QueryInterface: XPCOMUtils.generateQI([Ci.nsIContentPolicy, Ci.nsIChannelEventSink, Ci.nsIObserver, Ci.nsIFactory, Ci.nsISupports])
};
function TrackingListener() {
this.originalListener = null;
this.redirectUrl = null;
}
TrackingListener.prototype = {
// nsITraceableChannel interface implementation
onStartRequest: function(request, context) {
this.originalListener.onStartRequest(request, context);
},
onStopRequest: function(request, context) {
this.originalListener.onStopRequest(request, context, Cr.NS_OK);
},
onDataAvailable: function(request, context) {
this.originalListener.onDataAvailable(request, context, this.redirectUrl.storageStream.newInputStream(0), 0, this.redirectUrl.count);
},
// nsISupports interface implementation
QueryInterface: XPCOMUtils.generateQI([Ci.nsIStreamListener, Ci.nsISupports])
};
window.Redirector = null;
if (location == 'chrome://browser/content/browser.xul') {
if (!window.Redirector) window.Redirector = new Redirector();
window.Redirector.init();
}
window.addEventListener('unload', function() {
if (location == 'chrome://browser/content/browser.xul') {
if (window.Redirector) window.Redirector.destroy();
}
});
})(); |
|
|
|
3楼#
发布于:2015-10-05 00:09
|
|
|
4楼#
发布于:2016-01-03 10:58
不建議用這個了
還是寫進PicViewer的好 |
|