免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1676 | 回复: 0

Bookmarklet 问问学堂刷分攻略(图文教学版) [复制链接]

论坛徽章:
0
发表于 2011-12-22 08:54 |显示全部楼层
      这是做的第二个腾讯平台的刷分工具了,基本上腾讯的活动我感兴趣的,我都弄了刷分工具的,上次刷了几个Q币,腾讯没发给我,这次刷分之后,抽了个QQ公仔,希望能给我,免得浪费我的时间和精力。
      我也是刚接触javascript,我还做过csdn的刷分工具,之前都是用java写,太累了,cookie啊,状态啊,都要自己控制,很麻烦,但是用javascript嵌在网页里,只需要处理一部分动作就行了,其他的浏览器和网站默认的javascript脚本会自动完成的。
      下面,简单介绍一下,这个刷分工具的制作过程。
1.目标
   问问四周年的活动,里面有个问问学堂的任务,做随堂测试,每一题1分,可以无限次答题,取得分最高的一次,时限是100秒。这个工具就是要在100秒内尽可能多刷题目。

1.知己知彼百战百胜
  我们先要了解一下,整个程序的运行步骤,这样才能找到切入点。
 一般网页程序,都是靠后台的javascript脚本来控制的,前面的html是静态的。所以从程序的javascript脚本入手就行了。从网页的源码里可以找到javascript的文件,下载下来,用工具格式化一下。
 
代码主要有以下几个方法:

a. 开始课程,主要设置时间和定时器
  restTime是剩余时间
  1. function _startCourse(data2)
  2. {
  3.   ajax_time_opr[OPR_START_CHALLENGE]=new Date().getTime()-ajax_time_opr[OPR_START_CHALLENGE];
  4.   _sendStat("sp",OPR_START_CHALLENGE+"|"+ajax_time_opr[OPR_START_CHALLENGE]);
  5.   if(data2&&data2.result&&data2.result==1)
  6.   {
  7.     var resetTime=TIME_LIMIT_TEST;
  8.     if(challengeType==0)
  9.     {
  10.       resetTime=TIME_LIMIT_CHALLENGE
  11.     }
  12.     $("restTime").innerHTML=resetTime;
  13.     if(timer==null)
  14.     {
  15.       timer=setInterval(_timerOpr,1000)
  16.     }
  17.     _displayCourse(data2)
  18.   }
  19. }

 b.停止答题
     主要是停止定时器
  1. function _answerEnd(data)
  2. {
  3.   ajax_time_opr[OPR_ANSWER_QUESTION]=new Date().getTime()-ajax_time_opr[OPR_ANSWER_QUESTION];
  4.   _sendStat("sp",OPR_ANSWER_QUESTION+"|"+ajax_time_opr[OPR_ANSWER_QUESTION]+"|an|"+data.result+"|cat|"+vcourseCategoryId+"|ty|"+challengeType);
  5.   if(data.result==1)
  6.   {
  7.     _answerRight(data)
  8.   }
  9.   else
  10.   {
  11.     if(data.result==-1)
  12.     {
  13.       _stopTimer();
  14.       _answerError(data)
  15.     }
  16.     else
  17.     {
  18.       if(data.result==-2)
  19.       {
  20.         _stopTimer();
  21.         _timeEnd(false,data)
  22.       }
  23.     }
  24.   }
  25. }
c.定时器回调函数
  负责处理定时器事件,每秒一次,这个函数写的很巧妙,是通过最大时间减去逝去的时间得到剩余的时间,再赋值给restTime,所以直接改restTime提高时间是没有用的,每次_timeOpr调用的时候,restTime又被设置成正确的值了。
  1. function _timerOpr()
  2. {
  3.   time+=1;
  4.   if(challengeType==0)
  5.   {
  6.     if(time>=TIME_LIMIT_CHALLENGE)
  7.     {
  8.       _stopTimer();
  9.       _timeEnd(true)
  10.     }
  11.     else
  12.     {
  13.       get("restTime").innerHTML=TIME_LIMIT_CHALLENGE-time
  14.     }
  15.   }
  16.   else
  17.   {
  18.     if(challengeType==1)
  19.     {
  20.       if(time>=TIME_LIMIT_TEST)
  21.       {
  22.         _stopTimer();
  23.         _timeEnd(true)
  24.       }
  25.       else
  26.       {
  27.         get("restTime").innerHTML=TIME_LIMIT_TEST-time
  28.       }
  29.     }
  30.   }
  31. }
d.答题的API,调用的是QzApp,应该是Qzone的API吧。
 qid 代表问题的题号,answerid代表答案的序号
  1. QzApp.answerQ(qid,answerid);
 
几个重要的函数都在上面了,其他的就是资源初始化之类的,太多magicnumber了,看不懂。

3.下面简单叙述一下我的方案。

   方案一:问题到来了,自动解析问题并提交。
          难点:在网页加载好后,怎么自动调用自己的javascript代码,这个没解决。
  方案二:问题到来了,手动触发代码,解析问题,并提交答案。
         难点:如何手动触发,解决办法是用Bookmarklet

 那么工具就确定了,用Bookmarklet,简单介绍一下
Bookmarklet是bookmark 和applet的结合,说白了,其实就是firefox的书签工具栏。
书签里除了可以收藏网址外,还可以收藏有特定功能的javascript代码。
例如你把下面的代码加入到书签工具栏中:
  1. javascript:alert("test");
那么,你在任何一个网页中,点击这个书签的话,会弹出alert窗口的。
也就是说,书签工具栏是可以手动触发的,并且可以执行javascript代码。这样就足够了。


4.分析代码,查找切入点

整个程序的逻辑其实很简单,开始答题,计时-->答题-->正确继续,错误就结束本次答题。
前面已经说过,改时间是没戏的。我们只能模拟答题了,只是把找答案的时间都省略掉就可以了。
经过测试发现:
1.题目总共只有50个左右
2.答案在问问里都有
所以,我们可以收集题目和答案,直接和选项比对,然后提交即可。

5.收集题目
这步就略去了。。。完全人工操作

6.写代码,我也是刚学javascript很多东西都是网上搜的,而且出了错也花了很长时间排除。

  1. var list = new Array();
  2. list[0] = new Array();
  3. list[0][0] = "题目:帮助网友解决问题大量问题,有机会获得什么?";
  4. list[0][1] ="列出的都能获得";
  5. //中间是问题列表,略去了。。。


  6. var lilist = window.document.getElementById("contentWrap").getElementsByTagName("li");
  7. var title = window.document.getElementById("quesTitle").innerHTML;
  8. var qid = window.document.getElementById("qId").value;
  9. var aid=-1;
  10. var answer = null;
  11. var i;


  12. for(i=0;i<50;i++){
  13.     if(title == list[i][0]){
  14.      answer=list[i][1];
  15.      break;
  16.      }
  17.     }

  18. var j= 0 ;
  19. for(j=0;j<lilist.length;j++){
  20.     
  21.    var tmp = lilist[j].getElementsByTagName("span")[0].innerHTML;
  22.    
  23.    var str = new String(tmp);
  24.   
  25.    if(str.substring(2,tmp.length)==answer){
  26.        
  27.            QzApp.answerQ(qid,j);
  28.       break;
  29.      }
  30.  }

  31. if(answer ==null ||j>=lilist.length){
  32.     alert("error");
  33.     }
简单解释一下,list是问题和答案的列表
lilist是ABCD选项
title是问题
qid是问题id

下面的代码负责搜索问题列表,寻找出和当前问题相同的问题
  1. for(i=0;i<50;i++){
  2.     if(title == list[i][0]){
  3.      answer=list[i][1];
  4.      break;
  5.      }
  6.     }

然后,根据搜到的题目的答案,搜寻出正确的选项
  1. var j= 0 ;
  2. for(j=0;j<lilist.length;j++){
  3.     
  4.    var tmp = lilist[j].getElementsByTagName("span")[0].innerHTML;
  5.    
  6.    var str = new String(tmp);
  7.   
  8.    if(str.substring(2,tmp.length)==answer){
  9.        
  10.            QzApp.answerQ(qid,j);
  11.       break;
  12.      }
  13.  }
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. var list = new Array();
  2. list[0] = new Array();
  3. list[0][0] = "题目:帮助网友解决问题大量问题,有机会获得什么?";
  4. list[0][1] ="列出的都能获得";
  5. list[1] = new Array();
  6. list[1][0] = "题目:问问已解决问题突破一亿大关是在?";
  7. list[1][1] ="2009年8月";
  8. list[2] = new Array();
  9. list[2][0] = "题目:在问问的提问获得回答后,如果要了解更多细节怎么办?";
  10. list[2][1] ="使用【追问】功能问到底";
  11. list[3] = new Array();
  12. list[3][0] = "题目:问问在测试期间,第一个问题诞生在?";
  13. list[3][1] ="2007年3月";
  14. list[4] = new Array();
  15. list[4][0] = "题目:手机问问是什么时候推出的?";
  16. list[4][1] ="2009年5月";
  17. list[5] = new Array();
  18. list[5][0] = "题目:问问学堂上线的时间是?";
  19. list[5][1] ="2011年1月";
  20. list[6] = new Array();
  21. list[6][0] = "题目:问问已解决问题突破一亿大关是在?";
  22. list[6][1] ="2009年8月";
  23. list[7] = new Array();
  24. list[7][0] = "题目:手机问问WAP2.0版本是在什么时候上线的?";
  25. list[7][1] ="2010年10月";
  26. list[8] = new Array();
  27. list[8][0] = "题目:什么时候开始手机QQ能接收问问消息了?";
  28. list[8][1] ="2010年8月";
  29. list[9] = new Array();
  30. list[9][0] = "题目:问问在测试期间,第一个用户诞生在?";
  31. list[9][1] ="2007年3月";
  32. list[10] = new Array();
  33. list[10][0] = "题目:问问上的问题什么时候开始可以转播到微博的?";
  34. list[10][1] ="2010年10月";
  35. list[11] = new Array();
  36. list[11][0] = "题目:第一个问问团队诞生于?";
  37. list[11][1] ="2008年6月";
  38. list[12] = new Array();
  39. list[12][0] = "题目:问问首页是在什么时候改版的?";
  40. list[12][1] ="2010年11月";
  41. list[13] = new Array();
  42. list[13][0] = "题目:问问管理员体系是什么时候建立的?";
  43. list[13][1] ="2007年10月";
  44. list[14] = new Array();
  45. list[14][0] = "题目:手机问问回答中心上线的时间是?";
  46. list[14][1] ="2011年5月";
  47. list[15] = new Array();
  48. list[15][0] = "题目:问问达人计划是什么时候开始的?";
  49. list[15][1] ="2010年7月";
  50. list[16] = new Array();
  51. list[16][0] = "题目:问问副刊上线的时间是?";
  52. list[16][1] ="2011年5月";
  53. list[17] = new Array();
  54. list[17][0] = "题目:微博问答是什么时候上线的?";
  55. list[17][1] ="2011年4月";
  56. list[18] = new Array();
  57. list[18][0] = "题目:问问正式上线的时间是?";
  58. list[18][1] ="2007年6月";
  59. list[19] = new Array();
  60. list[19][0] = "题目:第一个问问之星是什么时候诞生的?";
  61. list[19][1] ="2008年12月";
  62. list[20] = new Array();
  63. list[20][0] = "题目:问问日刊上线的时间是?";
  64. list[20][1] ="2009年10月";
  65. list[21] = new Array();
  66. list[21][0] = "题目:问问图标是在什么时候进驻手机腾讯网页首导航条的?";
  67. list[21][1] ="2010年11月";
  68. list[22] = new Array();
  69. list[22][0] = "题目:问问达人计划是什么时候开始的?";
  70. list[22][1] ="2010年7月";
  71. list[23] = new Array();
  72. list[23][0] = "题目:手机问问Iphone版上线的时间是?";
  73. list[23][1] ="2011年3月";
  74. list[24] = new Array();
  75. list[24][0] = "题目:超级QQ用户什么时候开始可以通过手机短信收到问问消息了?";
  76. list[24][1] ="2010年7月";
  77. list[25] = new Array();
  78. list[25][0] = "题目:帮助网友解决问题大量问题,有机会获得什么?";
  79. list[25][1] ="列出的都能获得";
  80. list[26] = new Array();
  81. list[26][0] = "题目:问问在测试期间,第一个问题是什么时候被解决的?";
  82. list[26][1] ="2007年3月";
  83. list[27] = new Array();
  84. list[27][0] = "题目:目前问问已经帮助中国网民解决了多少问题?";
  85. list[27][1] ="1.4亿";
  86. list[28] = new Array();
  87. list[28][0] = "题目:在问问里面提问获得答案的平均时间是?";
  88. list[28][1] ="5分钟";
  89. list[29] = new Array();
  90. list[29][0] = "题目:遇到专业问题,需要专业回答,在问问该怎么做?";
  91. list[29][1] ="求助专家和团队都可以";
  92. list[30] = new Array();
  93. list[30][0] = "题目:问问的第一个管理员是?";
  94. list[30][1] ="天涯客";
  95. list[31] = new Array();
  96. list[31][0] = "题目:在问问回答问题时,下列哪种情况会被扣积分和经验?";
  97. list[31][1] ="列出的都能获得";
  98. list[32] = new Array();
  99. list[32][0] = "题目:手机问问感恩回馈用户活动的举办时间是?";
  100. list[32][1] ="2010年12月";
  101. list[33] = new Array();
  102. list[33][0] = "题目:在问问的提问获得回答后,如果要了解更多细节怎么办?";
  103. list[33][1] ="使用【追问】功能问到底";
  104. list[34] = new Array();
  105. list[34][0] = "题目:问问月刊叫什么名字?";
  106. list[34][1] ="问问之声";
  107. list[35] = new Array();
  108. list[35][0] = "题目:超级QQ用户什么时候开始可以通过手机短信收到问问消息了?";
  109. list[35][1] ="2010年7月";
  110. list[36] = new Array();
  111. list[36][0] = "题目:下列哪些物品不能通过问问积分兑换?";
  112. list[36][1] ="列出的都能获得";
  113. list[37] = new Array();
  114. list[37][0] = "题目:问问项目组成立的时间是?";
  115. list[37][1] ="2006年7月";
  116. list[38] = new Array();
  117. list[38][0] = "题目:问问用户可以通过QQ展现自己的提问是在?";
  118. list[38][1] ="2007年7月";
  119. list[39] = new Array();
  120. list[39][0] = "题目:手机问问团队功能上线的时间是?";
  121. list[39][1] ="2011年2月";
  122. list[40] = new Array();
  123. list[40][0] = "题目:问问现在的界面是在什么时候最终确定的?";
  124. list[40][1] ="2006年12月";
  125. list[41] = new Array();
  126. list[41][0] = "题目:什么时候开始手机QQ空间中能显示自己和好友的问问动态?";
  127. list[41][1] ="2010年9月";
  128. list[42] = new Array();
  129. list[42][0] = "题目:问问知识频道上线的时间是?";
  130. list[42][1] ="2010年6月";
  131. list[43] = new Array();
  132. list[43][0] = "题目:如果您精通某个专业领域,渴望帮助4亿问问网友解决问题,您可以?";
  133. list[43][1] ="即可申请专家也可加入团队";
  134. list[44] = new Array();
  135. list[44][0] = "题目:第一个问问之星是谁?";
  136. list[44][1] ="塔羅笙女";
  137. list[45] = new Array();
  138. list[45][0] = "题目:已经有非常多的网友使用过问问,具体是多少?";
  139. list[45][1] ="4亿";
  140. list[46] = new Array();
  141. list[46][0] = "题目:在问问回答问题能得到什么?";
  142. list[46][1] ="列出的都能获得";
  143. list[47] = new Array();
  144. list[47][0] = "题目:问问知识频道上线的时间是?";
  145. list[47][1] ="2010年6月";
  146. list[48] = new Array();
  147. list[48][0] = "题目:什么时候开始可以通过手机完成问问任务了?";
  148. list[48][1] ="2010年7月";
  149. list[49]=new Array();
  150. list[49][0]="题目:遇到问题找到答案的最快方法是?";
  151. list[49][1]="三种方法都可以";


  152. var lilist = window.document.getElementById("contentWrap").getElementsByTagName("li");
  153. var title = window.document.getElementById("quesTitle").innerHTML;
  154. var qid = window.document.getElementById("qId").value;
  155. var aid=-1;
  156. var answer = null;
  157. var i;


  158. for(i=0;i<50;i++){
  159. if(title == list[i][0]){
  160. answer=list[i][1];
  161. break;
  162. }
  163. }

  164. var j= 0 ;
  165. for(j=0;j<lilist.length;j++){

  166. var tmp = lilist[j].getElementsByTagName("span")[0].innerHTML;

  167. var str = new String(tmp);

  168. if(str.substring(2,tmp.length)==answer){

  169. QzApp.answerQ(qid,j);
  170. break;
  171. }
  172. }

  173. if(answer ==null ||j>=lilist.length){
  174. alert("error");
  175. }

(1) 在firfox上新建书签

javascript:后面是上面的代码,保存即可。注意一定要是在工具栏上的书签,可以提高速度。
效果如下:


每次答题只需点击answer这个书签就好了。
(2)刷分,本工具只对问问知多少的测试有效,有兴趣的可以收集状元堂的答案,挑战更高分。
在新标签页中打开随堂测试的页面,这步一定要做,否则不起作用。
刷分开始,出题目的时候,点击刚才建立的那个书签就可以了,会自动提交答案的,具体能刷到多少看自己的反应速度了。目前最高纪录是77。


好了,就这么多了,明天是最后一天了,祝大家顺利完成任务。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP