好久不写博客,以前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位字符串前面加上了磁链的开头。
没有评论:
发表评论