##引子
360doc是一个文档分享网站,上面有很多好的文章,不过有一点就是不登录就不能复制里面的文章内容,这一点很是气愤。
当然有的人会说360doc也是一个盗版的站,反正都是盗,再盗一次又何仿。。我认为不管人家怎么样,这不是去搞别人的站的理由。
这里只是自己研究,如果360doc发现了最好可以改一下这种策略,毕竟以文字方式呈现的网页是无论如何也防不住复制的,而且破解的难度也不是很大。至少在目前来说是这样的。
好了吐糟结束
##第一次战斗
这一次很简单,360doc只做了一个简单的策略,我们在复制的时候会用到鼠标选择,于是他们就在鼠标事件上做文章,当我们选好文字后,忘记了是右键还是左键,按下还是弹起,反正是我们要复制的时候会有一个弹出层出来,强迫我们登录。仅仅是有这样的一个层,其他什么都不做。
这样就好办了,这个层容器是原来页面就有的,不是动态生成的,那就在页面加载完后,把这个div容器给删除或者隐藏就好了,因为没有看其他的代码,怕删除会影响其他功能,就隐藏吧,这样做到最小的破坏。
最后的代码是这样的
//360doc里面也加载了Jquery库,想不通的是里面还包装了document.getElementById函数,放在window.$get里面。。页面流量不要钱的吗?
$('#LayerLogin').hide();
这一次的时间大概是2013年6月27日,并且发在了我的新浪weibo上。
##第二次战斗
因为有一第一次发在微博上的原因,招来了360doc的蓝v,互相调戏了一下。结果就是上去看的时候,上面的脚本已经不能用了,不知道是不是因为我的脚本,还是他们的例行测试,觉得这个有必要改进一下。
趁着不上班就用一个上午研究了一下,找到了破解之法。360doc这一次想到了document.body.oncopy事件,在这里面做了一个小小的判断,如果用户没有登录就不让你复制,并弹出注册窗口,就算你把窗口搞掉,还是不能。
这是我们来看360doc的判断代码
document.body.oncopy=function(){
var CurUserNameCookiescgcg = getCookie("LoginName");
if (CurUserNameCookiescgcg == "" || CurUserNameCookiescgcg == null) {
getJSON("http://www.360doc.com/ajax/GetLoginForm.ashx?ArtID=" + ArticleID + "&type=2&arttype=" + CurArtType + "&jsoncallback=?", function (responseText) {
document.getElementById('LayerLogin').innerHTML = responseText.html;
showBg("dialog", "dialog_content", "2")
});
return false
} else {
//这里做正常的复制操作
}
}
看到getCookie了吗,看到名字就知道了,这是个取登录用户名的方法,只有做个小小的改动就行了,
getCookie=function(){
return 'the name what you like'
}
只要运行这个代码,熟悉的复制又回来了。
这里不经意见发现的一个bug,我改了这个getCookie后,就可以发私信给人了,我在右上角点了发信,提示发信成功,不过这个后台是做了过滤,其实是没有发成功的。
##附userscript地址
脚本放在这上面了,支持firefox,chrome,其他浏览器没有测试过。