发现一些Firefox用户脚本不起作用,userscripts.org访问不能有一个很长的一段时间,我还以为出了什么问题没出去检查。前几天有时间检查脚本,在路上,然后返回到userscripts.org看。但仍然无法访问。这感觉有点怪。然后,在Google搜userscripts.org down,敲完,提示已经出来了,看来这已是影响普遍的问题。和伟大的防火墙没什么关系。点进链接一看,大吃一惊。原来userscripts.org自五月初就down了。事前没有不论什么通知,開始时还有人推測是站点受到攻击或故障。后来短暂可通过8080端口訪问。到今天已可认定永远关闭了。没有来自站点运营者的正式说明或不论什么公认的确定的解释。有意关闭、server故障、空间租期结束……众猜纷纭。一个以前活跃了非常长时间。在浏览器和脚本爱好者中颇有影响的站点就这样非正常死亡了。

所幸还有好心人建立了一个镜像站点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 scottxp@126.com
// @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);

版权声明:本文博主原创文章。博客,未经同意不得转载。

记userscripts.org的更多相关文章

  1. Spark踩坑记——Spark Streaming+Kafka

    [TOC] 前言 在WeTest舆情项目中,需要对每天千万级的游戏评论信息进行词频统计,在生产者一端,我们将数据按照每天的拉取时间存入了Kafka当中,而在消费者一端,我们利用了spark strea ...

  2. Spark踩坑记——数据库(Hbase+Mysql)

    [TOC] 前言 在使用Spark Streaming的过程中对于计算产生结果的进行持久化时,我们往往需要操作数据库,去统计或者改变一些值.最近一个实时消费者处理任务,在使用spark streami ...

  3. 这些年一直记不住的 Java I/O

    参考资料 该文中的内容来源于 Oracle 的官方文档.Oracle 在 Java 方面的文档是非常完善的.对 Java 8 感兴趣的朋友,可以从这个总入口 Java SE 8 Documentati ...

  4. 千回百折:百度Java研发offer斩获记和经验分享

    起因 面试过程 等待offer的过程中悟道 Java面试常考知识点个人总结 过程 百度——作为国内互联网的巨头之一,最近的一些风波对其褒贬不一,但是类似事件不是第一次发生,也绝对不是最后一次,对于真的 ...

  5. 记一次nginx部署yii2项目时502 bad gateway错误的排查

    周六闲来无事,就试着安装和部署下yii2,安装过程没什么问题,但部署到nginx上时遇到了502 bad gatewary问题,折腾了半天才搞定.这个问题是我以前在部署yii2时没有遇到过的,因此记在 ...

  6. 原生JS实战:写了个一边玩游戏,一边记JS的API的游戏

    本文是苏福的原创文章,转载请注明出处:苏福CNblog:http://www.cnblogs.com/susufufu/p/5878913.html 本程序[一边玩游戏,一边记JS的API]是本人的个 ...

  7. ArcGIS中的标注和注记

    在ArcMap中可以使用标注和注记来识别要素,选择标注或注记取决于你需要如何控制文本显示以及在ArcMap中如何存储文本. 1.标注只是临时显示相关数据或字段 2.标注用于长时间保存数据以及显示方式. ...

  8. 记处理线上记录垃圾日志 The view 'Error' or its master was not found

    最近监控线上日志,网站是ASP.NET MVC 开发的,发现不少错误日志都记录同样的内容: The view 'Error' or its master was not found or no vie ...

  9. 算法是什么我记不住,But i do it my way. 解一道滴滴出行秋招编程题。

    只因在今日头条刷到一篇文章,我就这样伤害我自己,手贱. 刷头条看到一篇文章写的滴滴出行2017秋招编程题,后来发现原文在这里http://www.cnblogs.com/SHERO-Vae/p/588 ...

随机推荐

  1. CSS3 transition 属性

    transition是css3中新添加的特性,在W3C标准中是这样描述的:“css的transition允许css的属性值在一定的时间内从一个状态平滑的过渡到另一个状态.这种状态可以在鼠标单击.获得焦 ...

  2. codeforces 27E . Number With The Given Amount Of Divisors 搜索+数论

    题目链接 首先要知道一个性质, 一个数x的因子个数等于 a1^p1 * a2^p2*....an^pn, ai是x质因子, p是质因子的个数. 然后就可以搜了 #include <iostrea ...

  3. Core开发-MVC 使用dotnet 命令创建Controller和View

    NET Core开发-MVC 使用dotnet 命令创建Controller和View   使用dotnet 命令在ASP.NET Core MVC 中创建Controller和View,之前讲解过使 ...

  4. C语言入门(4)——常量、变量与赋值

    对于基本数据类型量,按其取值是否可改变又分为常量和变量两种.在程序执行过程中,其值不发生改变的量称为常量,其值可变的量称为变量.它们可与数据类型结合起来分类. 常量 常量有字符常量(Character ...

  5. 【.NET】使用HtmlAgilityPack抓取网页数据

      刚刚学习了XPath路径表达式,主要是对XML文档中的节点进行搜索,通过XPath表达式可以对XML文档中的节点位置进行快速定位和访问,html也是也是一种类似于xml的标记语言,但是语法没有那么 ...

  6. linux下各种代理的设置

    http://los-vmm.sc.intel.com/wiki/OpenStack_New_Hire_Guide#Apply_JIRA_account Set up your proxy. The ...

  7. 去英国Savile Row 做件私人定制手工西装_GQ男士网

    去英国Savile Row 做件私人定制手工西装_GQ男士网 去英国Savile Row 做件私人定制手工西装

  8. UberX及以上级别车奖励政策(优步北京第二、三组)

    优步北京第二.三组: 定义为2015年6月1日至7月19日激活的司机(以优步后台数据显示为准) 滴滴快车单单2.5倍,注册地址:http://www.udache.com/如何注册Uber司机(全国版 ...

  9. android基础5——使用资源

    Android会基于当前的硬件.设备和语言配置来为某个资源标识符选择最合适的值. 1.在代码中使用资源 使用静态类R来访问资源.R类是基于外部资源而生的类,并且是在项目编译的时候创建的.R的每一个子类 ...

  10. 662 - Fast Food

    描述:状态方程p[i][j]=dp[i-1][k]+dist(k+1,j),由于没搞懂距离dist是怎么计算的,以为是num[j]-num[k+1],结果wa了一次,在状态转移的时候,采用一个数组sc ...