- 论坛徽章:
- 0
|
这是做的第二个腾讯平台的刷分工具了,基本上腾讯的活动我感兴趣的,我都弄了刷分工具的,上次刷了几个Q币,腾讯没发给我,这次刷分之后,抽了个QQ公仔,希望能给我,免得浪费我的时间和精力。 我也是刚接触javascript,我还做过csdn的刷分工具,之前都是用java写,太累了,cookie啊,状态啊,都要自己控制,很麻烦,但是用javascript嵌在网页里,只需要处理一部分动作就行了,其他的浏览器和网站默认的javascript脚本会自动完成的。 下面,简单介绍一下,这个刷分工具的制作过程。 1.目标 问问四周年的活动,里面有个问问学堂的任务,做随堂测试,每一题1分,可以无限次答题,取得分最高的一次,时限是100秒。这个工具就是要在100秒内尽可能多刷题目。
1.知己知彼百战百胜 我们先要了解一下,整个程序的运行步骤,这样才能找到切入点。 一般网页程序,都是靠后台的javascript脚本来控制的,前面的html是静态的。所以从程序的javascript脚本入手就行了。从网页的源码里可以找到javascript的文件,下载下来,用工具格式化一下。 代码主要有以下几个方法:
a. 开始课程,主要设置时间和定时器 restTime是剩余时间
- function _startCourse(data2)
-
{
-
ajax_time_opr[OPR_START_CHALLENGE]=new Date().getTime()-ajax_time_opr[OPR_START_CHALLENGE];
-
_sendStat("sp",OPR_START_CHALLENGE+"|"+ajax_time_opr[OPR_START_CHALLENGE]);
-
if(data2&&data2.result&&data2.result==1)
-
{
-
var resetTime=TIME_LIMIT_TEST;
-
if(challengeType==0)
-
{
-
resetTime=TIME_LIMIT_CHALLENGE
-
}
-
$("restTime").innerHTML=resetTime;
-
if(timer==null)
-
{
-
timer=setInterval(_timerOpr,1000)
-
}
-
_displayCourse(data2)
-
}
-
}
b.停止答题 主要是停止定时器
- function _answerEnd(data)
-
{
-
ajax_time_opr[OPR_ANSWER_QUESTION]=new Date().getTime()-ajax_time_opr[OPR_ANSWER_QUESTION];
-
_sendStat("sp",OPR_ANSWER_QUESTION+"|"+ajax_time_opr[OPR_ANSWER_QUESTION]+"|an|"+data.result+"|cat|"+vcourseCategoryId+"|ty|"+challengeType);
-
if(data.result==1)
-
{
-
_answerRight(data)
-
}
-
else
-
{
-
if(data.result==-1)
-
{
-
_stopTimer();
-
_answerError(data)
-
}
-
else
-
{
-
if(data.result==-2)
-
{
-
_stopTimer();
-
_timeEnd(false,data)
-
}
-
}
-
}
-
}
c.定时器回调函数 负责处理定时器事件,每秒一次,这个函数写的很巧妙,是通过最大时间减去逝去的时间得到剩余的时间,再赋值给restTime,所以直接改restTime提高时间是没有用的,每次_timeOpr调用的时候,restTime又被设置成正确的值了。
- function _timerOpr()
-
{
-
time+=1;
-
if(challengeType==0)
-
{
-
if(time>=TIME_LIMIT_CHALLENGE)
-
{
-
_stopTimer();
-
_timeEnd(true)
-
}
-
else
-
{
-
get("restTime").innerHTML=TIME_LIMIT_CHALLENGE-time
-
}
-
}
-
else
-
{
-
if(challengeType==1)
-
{
-
if(time>=TIME_LIMIT_TEST)
-
{
-
_stopTimer();
-
_timeEnd(true)
-
}
-
else
-
{
-
get("restTime").innerHTML=TIME_LIMIT_TEST-time
-
}
-
}
-
}
-
}
d.答题的API,调用的是QzApp,应该是Qzone的API吧。 qid 代表问题的题号,answerid代表答案的序号
- QzApp.answerQ(qid,answerid);
几个重要的函数都在上面了,其他的就是资源初始化之类的,太多magicnumber了,看不懂。
3.下面简单叙述一下我的方案。
方案一:问题到来了,自动解析问题并提交。 难点:在网页加载好后,怎么自动调用自己的javascript代码,这个没解决。 方案二:问题到来了,手动触发代码,解析问题,并提交答案。 难点:如何手动触发,解决办法是用Bookmarklet
那么工具就确定了,用Bookmarklet,简单介绍一下 Bookmarklet是bookmark 和applet的结合,说白了,其实就是firefox的书签工具栏。 书签里除了可以收藏网址外,还可以收藏有特定功能的javascript代码。 例如你把下面的代码加入到书签工具栏中:
- javascript:alert("test");
那么,你在任何一个网页中,点击这个书签的话,会弹出alert窗口的。 也就是说,书签工具栏是可以手动触发的,并且可以执行javascript代码。这样就足够了。
4.分析代码,查找切入点
整个程序的逻辑其实很简单,开始答题,计时-->答题-->正确继续,错误就结束本次答题。 前面已经说过,改时间是没戏的。我们只能模拟答题了,只是把找答案的时间都省略掉就可以了。 经过测试发现: 1.题目总共只有50个左右 2.答案在问问里都有 所以,我们可以收集题目和答案,直接和选项比对,然后提交即可。
5.收集题目 这步就略去了。。。完全人工操作
6.写代码,我也是刚学javascript很多东西都是网上搜的,而且出了错也花了很长时间排除。
- var list = new Array();
-
list[0] = new Array();
-
list[0][0] = "题目:帮助网友解决问题大量问题,有机会获得什么?";
-
list[0][1] ="列出的都能获得";
-
//中间是问题列表,略去了。。。
-
-
-
var lilist = window.document.getElementById("contentWrap").getElementsByTagName("li");
-
var title = window.document.getElementById("quesTitle").innerHTML;
-
var qid = window.document.getElementById("qId").value;
-
var aid=-1;
-
var answer = null;
-
var i;
-
-
-
for(i=0;i<50;i++){
-
if(title == list[i][0]){
-
answer=list[i][1];
-
break;
-
}
-
}
-
-
var j= 0 ;
-
for(j=0;j<lilist.length;j++){
-
-
var tmp = lilist[j].getElementsByTagName("span")[0].innerHTML;
-
-
var str = new String(tmp);
-
-
if(str.substring(2,tmp.length)==answer){
-
-
QzApp.answerQ(qid,j);
-
break;
-
}
-
}
-
-
if(answer ==null ||j>=lilist.length){
-
alert("error");
-
}
简单解释一下,list是问题和答案的列表 lilist是ABCD选项 title是问题 qid是问题id
下面的代码负责搜索问题列表,寻找出和当前问题相同的问题
- for(i=0;i<50;i++){
-
if(title == list[i][0]){
-
answer=list[i][1];
-
break;
-
}
-
}
然后,根据搜到的题目的答案,搜寻出正确的选项
- var j= 0 ;
-
for(j=0;j<lilist.length;j++){
-
-
var tmp = lilist[j].getElementsByTagName("span")[0].innerHTML;
-
-
var str = new String(tmp);
-
-
if(str.substring(2,tmp.length)==answer){
-
-
QzApp.answerQ(qid,j);
-
break;
-
}
-
}
QzApp.answerQ(qid,j)进行提交
这样,整个过程就完成了。
7.测试 100秒基本上能够达60道题,因为刷问题有点延时,总之里面的任务都可以完成了,一个是做20分,一个是做50分的,搓搓有余了。
下面是我做的题目截图:
 刷了68题,呵呵,刷了个QQ公仔,攒点人品,希望能抽个大奖了。
=======================最新战报============================== 帮一个网友刷到77题了
8.代码 放在 http://code.google.com/p/kenvi-code-library/downloads/detail?name=wenwen.js&can=2&q=#makechanges 在firefox新建一个书签工具栏,代码前面加上javascript: ,贴进去,每次刷出题目的时候点击一次就可以了,速度快点可以多刷点题。出错的话,自己把题目和答案添加进去就Ok了。
9.如何使用 有几个网友找我说不会用,我把使用的方法说明一下
===================责任声明=================================== 本代码仅供测试使用,如造成如何不良影响,本人概不负责,使用者自负! ===================责任声明===================================
更新了一下代码,最新的如下:
(1) 在firfox上新建书签
 javascript:后面是上面的代码,保存即可。注意一定要是在工具栏上的书签,可以提高速度。 效果如下:
 每次答题只需点击answer这个书签就好了。
(2)刷分,本工具只对问问知多少的测试有效,有兴趣的可以收集状元堂的答案,挑战更高分。 在新标签页中打开随堂测试的页面,这步一定要做,否则不起作用。 刷分开始,出题目的时候,点击刚才建立的那个书签就可以了,会自动提交答案的,具体能刷到多少看自己的反应速度了。目前最高纪录是77。
好了,就这么多了,明天是最后一天了,祝大家顺利完成任务。
|
|