zoukankan      html  css  js  c++  java
  • 自动签到升级版(JS实现的每日定时任务)

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

    于是,笔者寻思写一个自动签到的脚本;每天指定两个签到时段,每次打开页面,先检测当前是否为签到时段,如果在签到时段,则检查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,直接把代码粘到一个本地文件运行是无效的,其它浏览器不存在这个问题。

  • 相关阅读:
    【一句日历】2020年4月
    【2020-03-31】思维永远只有一种
    【2020-03-30】事情就怕太容易而看不起
    【2020-03-29】人生有趣的地方在于不断升级自己
    【2020-03-27】球场还在,换了地方而已
    【2020-03-26】人其实是一个系统
    【2020-03-25】没工作是个伪命题
    day 74 vue 2 axios数据请求 以及组件的学习
    day 73 初学vue (1)
    day 72 crm(9) 客户关系系统,整体实现,以及自定制路由内容,客户关系梳理
  • 原文地址:https://www.cnblogs.com/ranzige/p/3940761.html
Copyright © 2011-2022 走看看