2015年3月1日

浅尝油猴脚本

好久不写博客,以前Blogger上配置的CSS都忘了是哪些了,想了半天才记起来≶p>里的内容有首行缩进。由于种种原因,翻墙是越来越难了,这也给我偷懒带来了理由。上网的时候经常会遇到一些不便,比如:该帖子回复后可见、下载链接缺头少尾等等。于是产生了改造网页的想法。先后尝试了Chrome插件和油猴脚本,最终还是觉得油猴脚本更适合干这活儿——简单、直接。目前写了两个简单的脚本,一个用来解决回复后可见,一个用来搞定下载链接的。我将逐一解释其应用场景。

回复后可见/可下载

某个网站提供一些资源的下载,但要求用户评论并打分后才可以下载,而且对评论还要较为严格的审核,无意义的回复、字数太短甚至一个IP短时间内在几个不同帖子发相同的评论都会被判为无效评论。于是搞了一个脚本,在页面的右上角菜单处添加了一个链接,点击后可自动选中一个打分的单选框,并写一条评论后提交。应用场景就到这里,以下是代码:

// An automatically comments tools for xxx.com
// version 0.1
// 2014-11-28
// Copyright (c) 2014, ReiJi
//
//
// ==UserScript==
// @name          Auto Comments
// @namespace     http://rei-ji.blogspot.com/
// @description   An automatically comments tools for xxx.com
// @include       http://www.xxx.com/*
// ==/UserScript==

var ul = document.getElementById("topmenu").childNodes[1];
var li = document.createElement("li");
var a = document.createElement("a");
a.innerHTML="一键打分点评";
a.addEventListener("click", function(event) {
 document.getElementsByName("levimg")[4].checked="checked";
 var dd = document.getElementsByTagName("dd");
 var comment = "This is a comment.";
 if(dd != null && dd.length > 0){
  var i = parseInt(dd.length * Math.random());
  comment=dd[i].firstChild.textContent.trim();
 }
 document.getElementById("news").innerHTML = comment;
 document.getElementById("bn_Value").click();
},true);
li.appendChild(a);
ul.appendChild(li);

这里我用xxx.com代替了实际的那个网站,把我常用的那句评论也换成了“This is a comment.”,以避免一些不必要的麻烦。脚本的编写首先需要对目标网页的DOM结构进行细致的研究,可以看到,18~26行开始是对打分(选中一个单选框)、填充评论并提交的代码。其余的都是诸如插入新增DOM的外围工作。为了防止每次都发一样的评论(即“This is a comment.”),我玩了一个小把戏:先去随机地取已有的一条评论,然后把这条评论原样发上去。想必没有哪个评论系统会恶心到不允许1000个读者里只有999或者998个哈姆雷特。如果这个帖子下一条评论都没有的话,那就只能发我预留的那条默认评论了。当然默认评论可以改为多条,然后随机抽一条发布。不过一条默认评论在那个网站实际使用起来也够用了,毕竟连续遇到几个0回复的帖子的几率还是很小的。

最后要说明的是,我曾尝试用$('#form_id').submit();的方式提交表单,但这种方式似乎并不奏效,原因不明。最终只能模拟到底,直接调用提交按钮的click()方法。

格式化正确的下载链接

某些站点由于水表的压力,只好整出在页面上到处打着“保护版权,不提供下载”,但暗地里其实又提供下载链接的做法(磁链、网盘)。我且不评价这种做法,但确实对用户体验造成了不小的障碍。而且磁链的开头那么长一串字符,很难记得住,每次去下载还得先备好那个字符串,再把页面上的磁链hash码复制下来,两个合在一块儿,才能去下载,颇为繁琐。还好该网站上的磁链hash都是160 bit的,固定40个字符,可以用正则表达式轻松提取出来,于是有了下面的脚本:

// An automatically tools for xxx.com
// version 0.1
// 2015-02-27
// Copyright (c) 2015, ReiJi
//
//
// ==UserScript==
// @name          Link Helper
// @namespace     http://rei-ji.blogspot.com/
// @description   To add "magnet:?xt=urn:btih:" before the hash code 
//                          for xxx.com due to their sensitivity about their water meter.
// @include       http://www.xxx.com/*
// ==/UserScript==

var dom = document.getElementsByClassName("entry-content")[0];
var html = dom.innerHTML;
dom.innerHTML=html.replace(/[0-9,A-F]{40}/gi,"magnet:?xt=urn:btih:"+"$&");

代码只有3行,需要说明的有3点。1)hash码是16进制表示的,因此只由0~9和A-F组成;2)正则表达式的“/gi”是参数,g表示全局匹配(贪心的),i表示忽略大小写;3)"$&"表示匹配到的子串,所以最后的结果就是在原来的40位字符串前面加上了磁链的开头。

没有评论:

发表评论