首页 > 代码库 > 自动签到升级版(JS实现的每日定时任务)

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

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

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

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

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

[html] view plaincopyprint?
 
  1. <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">  
  2. <html>  
  3.     <head>  
  4.         <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">  
  5.         <meta name="author" content ="http://blog.csdn.net/NearEast"/>  
  6.         <title>check in page</title>  
  7.         <style type="text/css">  
  8.             .clear{  
  9.                 clear:both;  
  10.             }  
  11.             .float{  
  12.                 float:left;  
  13.             }  
  14.         </style>  
  15.     </head>  
  16.     <body>  
  17.         <div id="dInfo" class="float"></div>  
  18.         <div class="clear"></div>  
  19.         <div id="wrap">  
  20.           <iframe class="float" id=‘i_iframe1‘ name="n_iframe1" frameborder="0"></iframe>  
  21.           <iframe class="float" id=‘i_iframe2‘ name="n_iframe2" frameborder="0"></iframe>  
  22.             <form target="n_iframe1" name="loginform" method="post" action="http://192.168.19.11:8010/signin/signin.jsp">  
  23.             <input name="name" type=‘hidden‘ value=http://www.mamicode.com/‘nidong‘ />  
  24.             <input name="passwd" type=‘hidden‘ value=http://www.mamicode.com/‘11111111‘ />  
  25.         </form>  
  26.       </div>  
  27.     </body>  
  28.     <script type="text/javascript">  
  29. <span style="white-space:pre">      </span>//封装一个定时运行器  
  30.         (function( window, undefined ) {  
  31.             var doc = 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.         var checkUtil = 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.           
  49.             /**基于一个指定日期的时间base,通过‘hh:mm:ss‘格式的时间字符串,获取其毫秒时间  
  50.             默认秒数为0  
  51.             */  
  52.             function _getMillisecond(base, str){  
  53.                 var slices = str.split(‘:‘);  
  54.                 if(!base instanceof Date || slices.length<2){  
  55.                     alert(‘param error‘);  
  56.                     return;  
  57.                 }  
  58.                 base.setHours(parseInt(slices[0]));  
  59.                 base.setMinutes(parseInt(slices[1]));  
  60.                 base.setSeconds(parseInt(slices[2]||‘0‘));  
  61.                 return base.getTime();  
  62.             }  
  63.               
  64.             /**计算是否处在签到时间段(flag==true),并返回距离下一次签到还有多久(毫秒)  
  65.             */  
  66.             function _getCheckTime(){  
  67.                 var split = [], d = new Date(), curTime = new Date(d);  
  68.                 d.setMilliseconds(0);  
  69.                 for(var i=0;i<_checkTime.length;i++){  
  70.                     split[i] = _getMillisecond(d, _checkTime[i]);  
  71.                 }  
  72.                 //最后一个元素为第一个元素加上24小时,意为循环到第二天  
  73.                 split.push(24*3600*1000 + split[0]);  
  74.                 split.unshift(_getMillisecond(d, ‘00:00:00‘));  
  75.                   
  76.                 var start, end;  
  77.                 for(var i=0;i<split.length;i++){  
  78.                     start = split[i];  
  79.                     end = split[(i+1)%split.length];  
  80.                     if(start<=curTime && curTime<=end){  
  81.                         return{  
  82.                             eclipse:end - curTime,  
  83.                             flag:i%2==1/*第奇数个元素*/  
  84.                         }  
  85.                     }  
  86.                 }  
  87.                   
  88.                 return ‘error‘;  
  89.             }  
  90.               
  91.             function _addCookie(name, value) {  
  92.                 var hours = 2;  
  93.                 var exp = new Date();  
  94.                 exp.setTime(exp.getTime() + hours * 60 * 60 * 1000);  
  95.                 doc.cookie = name + "=" + escape(value) + ";expires="+ exp.toGMTString();  
  96.             }  
  97.             function _getCookie(name) {  
  98.                 var arr, reg = new RegExp("(^| )" + name + "=([^;]*)(;|$)");  
  99.                 if (arr = doc.cookie.match(reg))  
  100.                     return unescape(arr[2]);  
  101.                 else  
  102.                     return null;  
  103.             }  
  104.             function _delCookie(name) {  
  105.                 doc.cookie = name + "=n;expires=Thu, 01-Jan-70 00:00:01 GMT";  
  106.             }  
  107.               
  108.             function _checkAndSet(){  
  109.                 var ret = _getCheckTime();  
  110.                 if(ret.flag){  
  111.                     _print(‘当前为‘ + _tip + ‘时段‘);  
  112.                     var checked = _getCookie(‘_checked‘);  
  113.                     if(checked == ‘true‘){  
  114.                         _print(‘本时段已‘ + _tip);  
  115.                     }else{  
  116.                         _print(‘现在执行‘ + _tip);  
  117.                         _func();  
  118.                         //////////////////////////print some information  
  119.                         _addCookie(‘_checked‘, ‘true‘);  
  120.                     }  
  121.                 }else{  
  122.                     _print(‘当前非‘ + _tip + ‘时段‘);  
  123.                     _delCookie(‘_checked‘);  
  124.                 }  
  125.                   
  126.                 setTimeout(function(){  
  127.                     _checkAndSet();  
  128.                 }, ret.eclipse);  
  129.                 _print(‘将于‘ + ret.eclipse/1000 + ‘秒之后,执行_checkAndSet()‘);  
  130.             };  
  131.       
  132.         })(window);  
  133.           
  134.         window.onresize = function(){  
  135.             var frm = document.getElementById(‘i_iframe1‘);  
  136.             var frm2 = document.getElementById(‘i_iframe2‘);  
  137.             document.getElementById(‘wrap‘).style.height = document.documentElement.clientHeight+‘px‘;  
  138.             frm.width=frm2.width=‘50%‘;//document.documentElement.clientWidth/2;  
  139.             frm.height=frm2.height=‘100%‘;//document.documentElement.clientHeight;  
  140.         };  
  141.   
  142.         window.onload = function(){  
  143.             window.onresize();  
  144.             ///////////////////////////////As a single page  
  145.             checkUtil({func:function(){  
  146.                     checkon();  
  147.                 }, tip:‘<href=http://www.mamicode.com/"javascript:checkon();">签到</a>‘  
  148.                 , checkTime:[‘15:50‘, ‘15:50:10‘, ‘15:50:20‘,‘15:50:30‘]  
  149.                 , printFunc:function(txt){  
  150.                     document.getElementById(‘dInfo‘).innerHTML += txt+‘<br>‘;  
  151.                 }  
  152.             });  
  153.         }  
  154.           
  155.         function checkon(){  
  156.             loginform.childNodes[1].value=http://www.mamicode.com/‘nidong‘;  
  157.             loginform.target="n_iframe1";  
  158.             loginform.submit();  
  159.             loginform.childNodes[1].value=http://www.mamicode.com/‘gengap‘;  
  160.             loginform.target="n_iframe2";  
  161.             loginform.submit();  
  162.         }  
  163.   
  164.     </script>  
  165. </html>  

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

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

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