之前是09年3月30日发布的,最近再一看博文不翼而飞,再补发一篇吧。另外谴责一下网上抄袭的,带上我的署名你能死吗?本来就是小众向的博文,写下来可不是为了给你不带署名转载的。
?
下面是重发的内容了,去除了一些可能会被HX的词……
?
www.clickclickclick.com是一个很YD的网站,玩法很简单,就是用鼠标狂点,然后点一定次数之后就提交成绩。游戏成绩和国家排名有 关,这个貌似关乎到玩家的爱国情感,但是据说这个网站故意将匈牙利、日本和TAI WAN省放到很高的名次,然后忽悠国人去点击(利用了我们的爱国情感啊……),我也稍微证实了一下,一个赛季刚开始,其他国家都还是0的时候,日本和匈牙利就已经有几百万的分数了。闲话莫讲,咱们还是谈技术吧。
?
// ==UserScript== // @name ccc // @namespace sny.ccc // @include http://www.clickclickclick.com/default.asp* // @include http://www.clickclickclick.com/ // ==/UserScript== var clickButton; var maxCountCon; var snyCount; var maxCount; var getMaxCountEvent; window.addEventListener('load', funcionPrincipal, false);//页面载入完毕后回调funcionPrincipal函数 function $(id) {//写这个函数已经成为习惯了 return document.getElementById(id); } function funcionPrincipal() { var startButton = document.createElement('a');//开始按钮,其实是超链接,点击之后开始自动狂点 startButton.innerHTML = 'SSSSSSSTTTTTTTAAAAAAARRRRRRRTTTTTTT'; startButton.setAttribute('href', 'javascript:document.getElementById("maxCount").innerHTML=cklmt;void(0);');//尝试了很久直接调用原页面的js域中的变量或方法,但发现怎么都不能成功,最后只好这么做了。 $('topbar').appendChild(startButton); startButton.addEventListener('click', init, false); var maxCountCon = document.createElement('span');//这里放置允许的最大点击量 maxCountCon.id = 'maxCount'; $('topbar').appendChild(maxCountCon); } function fireAEvent(ele, type) {//调用事件,通过GM很难调用原页面的函数,最好只从Element的事件方向处理 var evt = document.createEvent("Event"); evt.initEvent(type, true, false); ele.dispatchEvent(evt); }; function init() { var clickImg = $('clickimg'); clickButton = clickImg.parentNode; for (var j = 5; j >= 0; j--) {//这一部分是对付cheat机制用的,用程序模拟点击鼠标,考虑到z轴的问题。 var buttons = document.getElementsByTagName('button'); for (var i = buttons.length - 1; i >= 0; i--) { if (buttons[i].style.zIndex == j && buttons[i].style.left == "") { if (buttons[i] == clickButton) { j = -1; break; } fireAEvent(buttons[i], 'mouseup'); } } } maxCountCon = $('maxCount'); maxCount = parseInt(maxCountCon.innerHTML);//获得最大允许点击次数 snyCount = 0; getMaxCountEvent = window.setInterval(getMaxCount, 100); } function getMaxCount() { if (isNaN(maxCount)) {//等到获得了最大允许点击次数之后才开始自动点击 maxCount = parseInt(maxCountCon.innerHTML); } else { window.clearInterval(getMaxCountEvent); window.setTimeout(autoClick, 110); } } function autoClick() { if (++snyCount >= maxCount) {//当达到最大次数之后自动提交成绩 var tot = $('addtot2'); fireAEvent(tot, 'mouseup'); tot = $('mytot3'); fireAEvent(tot, 'mouseup'); return; } window.setTimeout(autoClick, 110); fireAEvent(clickButton, 'mouseup');//模拟鼠标的mouseup事件 }
?
经过了无数次的被banned,然后狂换代理,最后终于成功了,前后大概用了整整5个小时。还不错,第一个像样的GreaseMonkey userScript。
?
?
再次声明,原创文章,转载请注明来源:http://sny7.iteye.com,谢谢!
1 楼
joyfun
2010-02-19
//尝试了很久直接调用原页面的js域中的变量或方法,但发现怎么都不能成功,最后只好这么做了。
这个都是原来的那个 GraseMonkey入门教程给害的 现在变动挺大的 网上很多都是基于2005年的那个版本 去年研究过 官方wiki上就有用法 现在可以直接 unsafewindow 就可以调用原页面js的变量和方法了 当初也找了好久
2 楼
Snow_Young
2010-03-10
joyfun 写道
//尝试了很久直接调用原页面的js域中的变量或方法,但发现怎么都不能成功,最后只好这么做了。
这个都是原来的那个 GraseMonkey入门教程给害的 现在变动挺大的 网上很多都是基于2005年的那个版本 去年研究过 官方wiki上就有用法 现在可以直接 unsafewindow 就可以调用原页面js的变量和方法了 当初也找了好久
谢谢你的提示,去研究下,呵呵