ranzige

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

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

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

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

  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=\'nidong\' />  
  24.             <input name="passwd" type=\'hidden\' value=\'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="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=\'nidong\';  
  157.             loginform.target="n_iframe1";  
  158.             loginform.submit();  
  159.             loginform.childNodes[1].value=\'gengap\';  
  160.             loginform.target="n_iframe2";  
  161.             loginform.submit();  
  162.         }  
  163.   
  164.     </script>  
  165. </html>  

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

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

分类:

技术点:

相关文章: