首页 > 网站 > WEB开发 > 正文

自动签到升级版(JS实现的每日定时任务)

2024-04-27 14:19:44
字体:
来源:转载
供稿:网友

自动签到升级版(JS实现的每日定时任务)

公司规定每日签到两次;日子太安逸了,有时候中午居然会忘记签到……

于是,笔者寻思写一个自动签到的脚本;每天指定两个签到时段,每次打开页面,先检测当前是否为签到时段,如果在签到时段,则检查cookie中记录的值,确认该时段是否已经签到过了,巴拉巴拉…… 具体细节见流程图:

其中第一步调用的getCheckTime用来检测当前是否为签到时间,并返回当前时间距下一个时段的毫秒数,具体请见下面的流程图:

整个页面的代码如下,其中用到了笔者《javaScript类库/组件/框架封装的总体结构》一文中提到的框架,封装了一个定时运行器,具体用法见注释:

[html]view plaincopyPRint?
  1. <!DOCTYPEhtmlPUBLIC"-//W3C//DTDHTML4.01Transitional//EN""http://www.w3.org/TR/html4/loose.dtd">
  2. <html>
  3. <head>
  4. <metahttp-equiv="Content-Type"content="text/html;charset=UTF-8">
  5. <metaname="author"content="http://blog.csdn.net/NearEast"/>
  6. <title>checkinpage</title>
  7. <styletype="text/CSS">
  8. .clear{
  9. clear:both;
  10. }
  11. .float{
  12. float:left;
  13. }
  14. </style>
  15. </head>
  16. <body>
  17. <divid="dInfo"class="float"></div>
  18. <divclass="clear"></div>
  19. <divid="wrap">
  20. <iframeclass="float"id='i_iframe1'name="n_iframe1"frameborder="0"></iframe>
  21. <iframeclass="float"id='i_iframe2'name="n_iframe2"frameborder="0"></iframe>
  22. <formtarget="n_iframe1"name="loginform"method="post"action="http://192.168.19.11:8010/signin/signin.jsp">
  23. <inputname="name"type='hidden'value='nidong'/>
  24. <inputname="passwd"type='hidden'value='11111111'/>
  25. </form>
  26. </div>
  27. </body>
  28. <scripttype="text/Javascript">
  29. <spanstyle="white-space:pre"></span>//封装一个定时运行器
  30. (function(window,undefined){
  31. vardoc=window.document;
  32. var_checkTime,_func,_tip,_print;
  33. /**
  34. 初始化参数checkTime指定功能执行的时段,默认时间为'8:15'到'9:00',以及'12:35'到'14:00'两个时段
  35. checkTime应该是24小时制的,并且前面的绝对时间小于后面的绝对时间,例如'00:00:10'在'23:59'的前面
  36. func:在该时间段要执行的功能
  37. printFunc:日志信息的打印方法,默认为console.log方法打日志
  38. tip:要执行的功能的描述,tip可以是html语句,与printFunc结合可能达到各种效果,如例子所示
  39. */
  40. varcheckUtil=function(conf){
  41. _checkTime=conf.checkTime||['8:15','9:00','12:35','14:00'];
  42. _func=conf.func;
  43. _tip=conf.tip||'功能执行';
  44. _print=conf.printFunc||console.log;
  45. _checkAndSet();
  46. };
  47. window.checkUtil=checkUtil;
  48. /**基于一个指定日期的时间base,通过'hh:mm:ss'格式的时间字符串,获取其毫秒时间
  49. 默认秒数为0
  50. */
  51. function_getMillisecond(base,str){
  52. varslices=str.split(':');
  53. if(!baseinstanceofDate||slices.length<2){
  54. alert('paramerror');
  55. return;
  56. }
  57. base.setHours(parseInt(slices[0]));
  58. base.setMinutes(parseInt(slices[1]));
  59. base.setSeconds(parseInt(slices[2]||'0'));
  60. returnbase.getTime();
  61. }
  62. /**计算是否处在签到时间段(flag==true),并返回距离下一次签到还有多久(毫秒)
  63. */
  64. function_getCheckTime(){
  65. varsplit=[],d=newDate(),curTime=newDate(d);
  66. d.setMilliseconds(0);
  67. for(vari=0;i<_checkTime.length;i++){
  68. split[i]=_getMillisecond(d,_checkTime[i]);
  69. }
  70. //最后一个元素为第一个元素加上24小时,意为循环到第二天
  71. split.push(24*3600*1000+split[0]);
  72. split.unshift(_getMillisecond(d,'00:00:00'));
  73. varstart,end;
  74. for(vari=0;i<split.length;i++){
  75. start=split[i];
  76. end=split[(i+1)%split.length];
  77. if(start<=curTime&&curTime<=end){
  78. return{
  79. eclipse:end-curTime,
  80. flag:i%2==1/*第奇数个元素*/
  81. }
  82. }
  83. }
  84. return'error';
  85. }
  86. function_addCookie(name,value){
  87. varhours=2;
  88. varexp=newDate();
  89. exp.setTime(exp.getTime()+hours*60*60*1000);
  90. doc.cookie=name+"="+escape(value)+";expires="+exp.toGMTString();
  91. }
  92. function_getCookie(name){
  93. vararr,reg=newRegExp("(^|)"+name+"=([^;]*)(;|$)");
  94. if(arr=doc.cookie.match(reg))
  95. returnunescape(arr[2]);
  96. else
  97. returnnull;
  98. }
  99. function_delCookie(name){
  100. doc.cookie=name+"=n;expires=Thu,01-Jan-7000:00:01GMT";
  101. }
  102. function_checkAndSet(){
  103. varret=_getCheckTime();
  104. if(ret.flag){
  105. _print('当前为'+_tip+'时段');
  106. varchecked=_getCookie('_checked');
  107. if(checked=='true'){
  108. _print('本时段已'+_tip);
  109. }else{
  110. _print('现在执行'+_tip);
  111. _func();
  112. //////////////////////////printsomeinformation
  113. _addCookie('_checked','true');
  114. }
  115. }else{
  116. _print('当前非'+_tip+'时段');
  117. _delCookie('_checked');
  118. }
  119. setTimeout(function(){
  120. _checkAndSet();
  121. },ret.eclipse);
  122. _print('将于'+ret.eclipse/1000+'秒之后,执行_checkAndSet()');
  123. };
  124. })(window);
  125. window.onresize=function(){
  126. varfrm=document.getElementById('i_iframe1');
  127. varfrm2=document.getElementById('i_iframe2');
  128. document.getElementById('wrap').style.height=document.documentElement.clientHeight+'px';
  129. frm.width=frm2.width='50%';//document.documentElement.clientWidth/2;
  130. frm.height=frm2.height='100%';//document.documentElement.clientHeight;
  131. };
  132. window.onload=function(){
  133. window.onresize();
  134. ///////////////////////////////Asasinglepage
  135. checkUtil({func:function(){
  136. checkon();
  137. },tip:'<ahref="javascript:checkon();">签到</a>'
  138. ,checkTime:['15:50','15:50:10','15:50:20','15:50:30']
  139. ,printFunc:function(txt){
  140. document.getElementById('dInfo').innerHTML+=txt+'<br>';
  141. }
  142. });
  143. }
  144. functioncheckon(){
  145. loginform.childNodes[1].value='nidong';
  146. loginform.target="n_iframe1";
  147. loginform.submit();
  148. loginform.childNodes[1].value='gengap';
  149. loginform.target="n_iframe2";
  150. loginform.submit();
  151. }
  152. </script>
  153. </html>

以上页面的js代码中,封装了一个checkUtil组件,可以用来定期执行任务。初始化参数checkTime中可以给出一天之内的多个时段,只要浏览器页面是打开状态,到了一定时间就将运行func参数指定的函数;如果天天不关机,就可以一劳永逸,不用操心func函数的运行了。不过虽然代码几经修改,存在别的小问题还是难免的,也不能完全依赖它做事;定期查看一下日志还是很必要的。

由于Chrome只支持online cookie,直接把代码粘到一个本地文件运行是无效的,其它浏览器不存在这个问题。


上一篇:ngRoute 路由

下一篇:nodejs 入门一

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表