纪念userscripts.org

发现一些Firefox的用户脚本不工作和userscripts.org访问不了有挺长一段日子了,心想是哪里出了错也没特意去查。前几天有时间检查脚本,顺便再上久违的userscripts.org看看,却还是不能访问,感觉有些蹊跷,遂在Google上搜索userscripts.org down,还没敲完,提示已经出来了,看来这已是影响普遍的问题,和伟大的防火墙没什么关系。点进链接一看,大吃一惊。原来userscripts.org自五月初就down了。事前没有任何通知,开始时还有人猜测是网站受到攻击或故障,后来短暂可通过8080端口访问,到今天已可认定永远关闭了。没有来自网站运营者的正式说明或任何公认的确定的解释。有意关闭、服务器故障、空间租期结束……众猜纷纭。一个曾经活跃了很长时间,在浏览器和脚本爱好者中颇有影响的网站就这样非正常死亡了。所幸还有好心人建立了一个镜像网站http://userscripts-mirror.org/,不过只能静态访问,搜索讨论修改等功能都关闭。如果要找某个脚本,只能利用类似Google的站点搜索功能。

印象中我获知userscripts.org大约是在09年前后。Firefox五花八门的插件阵营里的明星GreaseMonkey让Firefox倡导的自定义互联网的理念不止步于浏览器,进入原本是网站开发者决定的网页领域。按照自己的想法修正、增强和美化一直以来只能被动接受的网页,这个新奇的主意令很多网民中的开发者跃跃欲试,也让更多普通的Firefox用户踊跃安装使用数量快速增长、针对大量网站、功能繁多的脚本。个性化和自主性需求的满足似乎一时让上网变得更加有趣。用户脚本的集散地userscripts.org网站也应需而生。当年这个专门用途的网站在我眼里是个有趣又精致的地方,在这能发现他人的巧思,仅凭一个脚本就使熟悉的网站更加友好方便。而当我也开始在上面发布脚本后,经常去看看每日脚本下载次数就变得我想有点像股民关注股市,毕竟这是第一次自己写的程序被互联网那一端成千上万不认识的人下载使用。

Chrome、Opera随后也有了各自的XXXMonkey插件,内容脚本不再是Firefox的专利。渐渐地随着对脚本改动的减少,我对它的兴趣也淡漠了。网站的改版、浏览器和插件的升级都可能使脚本失效或不再有用,另一方面设计和开发精良的网站,用户操作友好,内容脚本的用武之地也减小(除了那些突破网站开发者本意的限制的功能)。不知不觉我几个月也未必会上一次userscripts.org。

这时userscripts.org离去了,我惊愕之馀若有所失。有人评论,userscripts.org关闭之前因为未对广告和恶意脚本加以限制,已显颓像,后继者greasyfork.org维护管理更好。我上去看后却觉得它的页面美观和操作性不如前者。当互联网日益成为普通人生活中密切的一部分,抽象的数字空间也会被附以感情。万物有生有灭。在新网站不断涌现被人接受和熟悉之际,一些曾经的老伙伴也已消失,有人将这种现象比作数字黑洞,一旦网站关闭,上面的所有数据,包括成千上万使用者的活动记录,就被永远吞噬。所以已经有人开始“备份”整个互联网,web.archive.org现在已记录了4350亿个历史页次,userscripts.org的静态页面也可以通过它访问。

相较于针对特定网站的脚本,一些通用功能的脚本是我觉得最有用的。我的最爱就包括在userscripts.org下载的用左右键翻页的脚本。将它附在末尾以志念。

// ==UserScript==
// @name           HotKey Next Page
// @namespace      [email protected]
// @author         scottxp
// @version        1.0
// @description    按左右键翻页,可以自己针对网站定制xpath规则
// @include        http://*
// @include        https://*
// Modified by Starrow.
// 1. Add the detection of contenteditable div used as textarea in HTML 5.
// 2. Remove the reference to unsafeWindow, which is unnecessary and doesn‘t work since Firefox 30.
// ==/UserScript==

const nextStrs = [
					‘下一页‘,
					‘下页‘,
					‘下一节‘,
					‘下一章‘,
					‘下一篇‘,
					‘后一章‘,
					‘后一篇‘,
					‘?‘,
					‘next‘,
					‘next page‘,
					‘old‘,
					‘older‘,
					‘earlier‘,
					‘下頁‘,
					‘下一頁‘,
					‘后一页‘,
					‘后一頁‘,
					‘下一則‘,
					‘翻下页‘,
					‘翻下頁‘,
					‘后页‘,
					‘后頁‘,
					‘下翻‘,
					‘下一个‘,
					‘下一张‘,
					‘下一幅‘,
					‘Next >‘
];

const lastStrs = [
					‘上一页‘,
					‘上页‘,
					‘上一节‘,
					‘上一章‘,
					‘上一篇‘,
					‘前一章‘,
					‘前一篇‘,
					‘?‘,
					‘previous‘,
					‘prev‘,
					‘previous page‘,
					‘new‘,
					‘newer‘,
					‘later‘,
					‘上頁‘,
					‘上一頁‘,
					‘上一則‘,
					‘前一页‘,
					‘前一頁‘,
					‘翻上页‘,
					‘翻上頁‘,
					‘前页‘,
					‘前頁‘,
					‘上翻‘,
					‘上一个‘,
					‘上一张‘,
					‘上一幅‘,
					‘< Prev‘
];

const GeneralXpaths = [
	["//a[(text()=‘","‘)]"],
	["//input[@type=‘button‘ and @value=‘","‘]"]
];

//编辑下面的数组来自定义规则
const SpecialXpaths = [
	{
		//匹配的url
		urls : [
			"http://www.google.com"
		],
		//上一页节点的xpath
		last : "//a[@id=‘pnprev‘]",
		//下一页节点的xpath
		next : "//a[@id=‘pnnext‘]"
	}
];
const LEFT = 37;
const RIGHT = 39;

function checkKey(e){
	if (e.ctrlKey || e.shiftKey || e.altKey || e.metaKey )
        return ;
	if(checkTextArea(e.target))
		return ;
	var node;
	if(e.keyCode == LEFT && (node = getNode(LEFT))){
		click(node);
	}
	if(e.keyCode == RIGHT && (node = getNode(RIGHT))){
		click(node);
	}
}

function checkTextArea(node){
	var name = node.localName.toLowerCase();
	if (name == ‘textarea‘ || name == ‘input‘ || name == ‘select‘)
		return true;
	if(name == ‘div‘ && node.id.toLowerCase().indexOf(‘textarea‘)!=-1)
		return true;
	//Add new textarea which are div with contenteditable being true.
	//contenteditable is new in HTML 5 and supported in all major browsers.
	//In case contenteditable is supported but cannot be read via DOM, use attributes["contenteditable"].value.
	if (node.contenteditable===true || (node.attributes["contenteditable"] && node.attributes["contenteditable"].value==="true"))
	{
		return true;
	}
	return false;
}

function click(node){
	if(node.onclick)
		node.onclick();
	if(node.click)
		node.click();
	if(node.href)
		location.href = node.href;
}
function xpath(query) {
	return document.evaluate(query, document, null,
		XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE, null);
}
function getNode(keyCode){
	var node = getNodeByGeneralXpath(keyCode)
	if (!node)
		node = getNodeBySpecialXpath(keyCode);
	return node;
}
function getNodeByGeneralXpath(keyCode){
	var strs;
	if(keyCode == LEFT)
		strs = lastStrs;
	else if(keyCode == RIGHT)
		strs = nextStrs;
	else
		return null;
	var x = GeneralXpaths;
	for (var i in x){
		for (var j in strs){
			var query = x[i][0]+strs[j]+x[i][1];
			var nodes = xpath(query);
			if(nodes.snapshotLength > 0)
				return nodes.snapshotItem(0);
		}
	}
	return null;
}
function getNodeBySpecialXpath(keyCode){
	var s = SpecialXpaths;
	for (var i in s){
		if(checkXpathUrl(s[i].urls)){
			if (keyCode == LEFT){
				return xpath(s[i].last).snapshotItem(0);
			}
			else if(keyCode == RIGHT){
				return xpath(s[i].next).snapshotItem(0);
			}
		}
	}
	return null;
}
function checkXpathUrl(urls){
	for(var i in urls)
		if(location.href.indexOf(urls[i]) == 0)
			return true;
	return false;
}
if (top.location != self.location)
	return;
document.addEventListener(‘keydown‘, checkKey, false);

时间: 2024-08-27 05:31:41

纪念userscripts.org的相关文章

纪念下今天,开始写博客了

还有一年大学毕业,借着剩余稍微空闲的时间,总结下自己所学.从专注学习web前端算起来快有一年了. 前前后后经历了许多.在web这个领域,除了自学意外,程序员之间口口相传才能深入学习,总结是必不可少的.希望自己能坚持下去 纪念下今天,开始写博客了,布布扣,bubuko.com

膝盖中了一箭之康复篇-两周年纪念

右膝盖前十字韧带在2014年12月份的一次踢球中不小心弄断.2015年5月份才确诊.2015年的7月1日做了十字韧带重建术.到现在刚好是术后两年. 术后一年的纪念文章在这里:膝盖中了一箭之康复篇-一周年纪念. 整个康复历程的文章在这里:https://www.google.com.hk/search?safe=active&q=site%3Awww.huangbowen.net+ACL&oq=site%3Awww.huangbowen.net+ACL 这一年总的基调就是稳步前进.右膝盖已经

新年里纪念大师

时光飞泻,一晃Dennis M. Ritchie已经去世四年有余了,一直都想写一些文字聊以纪念这位受全世界程序员尊敬的导师,这倒不是因为有多忙,而是我真的需要好好地静下心,虔诚地纪念一下这位计算机界最伟大的科学家. Dennis M. Ritchie的一生最伟大的两个成就是设计了C语言和UNIX操作系统(和另一位同样伟大的Ken Thompson一起),而正是这两样东西几乎奠定了整个计算机程序设计的基础.计算机中几乎所有的软件都和这两样东西有着或远或近的血缘关系,之前,人 们都说Steve jo

(2012年旧文)纪念史蒂夫乔布斯---IT界的普罗米修斯

谈苹果与乔布斯系列一  IT界的普罗米修斯 纪念PC界的先驱 史蒂夫乔布斯 2012-4-5 清明节,纪念IT时代的开创人—伟大的史蒂夫 乔布斯. 没有乔布斯,计算机还是属于一群科技人士的工具,没有漂亮和易用的界面,PC就不会走进千家万户,就没有今天的PC产业: 没有PC的普及和发展,PC之间巨大的互联需求,成就了思科: 没有PC的普及和发展,就不会有互联网的高潮,就没有yahoo以及早期的门户网站,以及后来的Google: 没有Apple II对IBM的PC的压制,IBM就不会购买微软的DOS

纪念李小文院士

惊悉布鞋院士李小文因病逝世,遥感学界痛失英才前辈.在2003至2006年期间,我在科学院遥感所攻读地图学与地理信息系统研究生学位时,李院士正是所长.在他驾鹤西去之时,回忆往事以表哀思.      李小文院士是四川人,文革前成都电子科技大学的本科生,十年浩劫结束后考入中国科学院遥感所攻读研究生学位,当时所内学生背景基本分为地学与物理学两类,李院士属于后者.后来他又考上国家公费留学资格,进入加州大学圣芭芭拉分校继续遥感学方面的研究.在国外留学期间,他与导师合作,提出了分析遥感图像中像元属性的一种光学

今天是盖茨的生日,同时也值得我纪念

今天是盖茨的生日,这个没什么好纪念的,因为每天都有可能是一个伟大的人的生日,我无暇去纪念.而值得我去纪念的是我暗恋了好久的女神,有了心仪的对象,并且正在处于地下的恩爱之中.这有什么好纪念?你知道了这个难过的消息,然后你开始沉沦,然后思考,然后想通,然后再难过.虽然明白往事不可追,但是难免会难受几天,然后你不去上课,想要去干自己想做的事,这个值得纪念嘛? 女神——这曾是我努力奋斗的其中一个目标并指引着我要对别人看我的目光如何改变——从原来的不屑一顾要变成别人眼中的大神.我做了这个决定——要改变我在

纪念,BZOJ AC 100题!

虽然说有将近50+是usaco,然后还有很多水题T_T 看来我还是刷水题.... 看来我还是那么弱. T_T 但是好歹也要留个纪念..

纪念我第一次为开源社区贡献的代码

最近由于继续做在职研究生的毕业论文,在openstack上下了一些功夫,做了一个基于openstack的弹性扩展的小程序,中间需要调用Ceilometer的API接口对虚拟机的cpu使用效率做监控.试用了几乎所有的openstack的java API开发包,其中jclouds没有Ceilometer的API接口,openstack-java-sdk的Ceilometer支持很差,基本无法使用,所有最终选择了openstack4j.它的API还是比较好用,底层用了jersey.但是在调用Ceilo

【μ&#39;sic forever???】μ&#39;s Final Love Live周年纪念

一.正文 "切なくて时をまきもどしてみるかい?No no no--いまが最高!" 转眼就是一周年了,其实fl后入坑的我在这里怀念显得有些无病呻吟.但我也有想说的话,说给重要的人听. "ほのかな予感から始まり",是她们,将无人问津的434变成了9.6万,让毫不起眼的1023化作了淹没数十万人的橙色海洋.六年间,她们从Oricon周榜164位,一步一步地登上了榜首:她们的观众,从最开始的可怜的1700人,增长到填满东京巨蛋和全球251个转播场的数十万人.超过10万张的单