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

于是,笔者寻思写一个自动签到的脚本;每天指定两个签到时段,每次打开页面,先检测当前是否为签到时段,如果在签到时段,则检查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. /**基于一个指定日期的时间base,通过'hh:mm:ss'格式的时间字符串,获取其毫秒时间
  49. 默认秒数为0
  50. */
  51. function _getMillisecond(base, str){
  52. var slices = str.split(':');
  53. if(!base instanceof Date || slices.length<2){
  54. alert('param error');
  55. return;
  56. }
  57. base.setHours(parseInt(slices[0]));
  58. base.setMinutes(parseInt(slices[1]));
  59. base.setSeconds(parseInt(slices[2]||'0'));
  60. return base.getTime();
  61. }
  62. /**计算是否处在签到时间段(flag==true),并返回距离下一次签到还有多久(毫秒)
  63. */
  64. function _getCheckTime(){
  65. var split = [], d = new Date(), curTime = new Date(d);
  66. d.setMilliseconds(0);
  67. for(var i=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. var start, end;
  74. for(var i=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. var hours = 2;
  88. var exp = new Date();
  89. exp.setTime(exp.getTime() + hours * 60 * 60 * 1000);
  90. doc.cookie = name + "=" + escape(value) + ";expires="+ exp.toGMTString();
  91. }
  92. function _getCookie(name) {
  93. var arr, reg = new RegExp("(^| )" + name + "=([^;]*)(;|$)");
  94. if (arr = doc.cookie.match(reg))
  95. return unescape(arr[2]);
  96. else
  97. return null;
  98. }
  99. function _delCookie(name) {
  100. doc.cookie = name + "=n;expires=Thu, 01-Jan-70 00:00:01 GMT";
  101. }
  102. function _checkAndSet(){
  103. var ret = _getCheckTime();
  104. if(ret.flag){
  105. _print('当前为' + _tip + '时段');
  106. var checked = _getCookie('_checked');
  107. if(checked == 'true'){
  108. _print('本时段已' + _tip);
  109. }else{
  110. _print('现在执行' + _tip);
  111. _func();
  112. //////////////////////////print some information
  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. var frm = document.getElementById('i_iframe1');
  127. var frm2 = 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. ///////////////////////////////As a single page
  135. checkUtil({func:function(){
  136. checkon();
  137. }, tip:'<a href="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. function checkon(){
  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,直接把代码粘到一个本地文件运行是无效的,其它浏览器不存在这个问题。

自动签到升级版(JS实现的每日定时任务)的更多相关文章

  1. 360每日自动签到,领取积分 (java httpclient4.x)

    如何登陆360,并每日自动签到这次的难点主要集中在登陆这里了,开始抓包发现360登陆验证很麻烦,但是后来发现一个简单的方法.因为我安装了360安全卫士,发现点击那个金币的按钮能直接验证登陆,哈哈~所以 ...

  2. nodejs什么值得买自动签到自动评论定时任务

    本项目是基于nodejs开发,实现的功能是,什么值得买自动签到,自动评论功能,自动发邮件,支持多人多账号运行 目的是为了,解放双手,轻松获取什么值得买的经验和积分,得到更高的等级,从而突破很会员等级限 ...

  3. 【开源】使用.Net Core和GitHub Actions实现哔哩哔哩每日自动签到、投币、领取奖励

    BiliBiliTool是一个B站自动执行任务的工具,使用.NET Core编写,通过它可以实现B站帐号的每日自动观看.分享.投币视频,获取经验,每月自动领取会员权益.自动为自己充电等功能,帮助我们轻 ...

  4. Python 实现 T00ls 自动签到脚本(邮件+钉钉通知)

    T00ls 每日签到是可以获取 TuBi 的,由于常常忘记签到,导致损失了很多 TuBi .于是在 T00ls 论坛搜索了一下,发现有不少大佬都写了自己的签到脚本,签到功能实现.定时任务执行以及签到提 ...

  5. selenium之数据驱动框架应用WPS个人中心自动签到

    wps在注册后,有个每日签到的功能,签到后有几率送wps的专属金币[稻米],为了免费获得,又不想每天都是人工去执行签到动作,所以用selenium写了个小脚本,准备用数据驱动框架来完成这个事情,数据驱 ...

  6. Vue+Vuex实现自动登录 升级版

    Vue+Vuex实现自动登录 升级版 之前实现的版本在这里:Vue+Vuex实现自动登录       在之前实现的版本中,如果你进行测试,可以看到在浏览器的local Storage中,确实里面有了我 ...

  7. python3+任务计划实现的人人影视网站自动签到

    python3+任务计划实现的人人影视网站自动签到 这是一个自动化程度较高的程序,运行本程序后会从chrome中读取cookies用于登录人人影视签到, 并且会自动添加一个windows 任务计划,这 ...

  8. python写的自动签到脚本。

    等以后有时间补上. 附上代码: #! /usr/bin/env python # coding:utf-8 #-----------------------------------------学号和密 ...

  9. 带左右箭头切换的自动滚动图片JS特效

    效果图 按钮 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www. ...

随机推荐

  1. 三十三 StringIO和BytesIO

    StringIO 很多时候,数据读写不一定是文件,也可以在内存中读写. StringIO顾名思义就是在内存中读写str. 要把str写入StringIO,我们需要先创建一个StringIO,然后,像文 ...

  2. shell-sed命令详解(转)

    (转自http://blog.csdn.net/wl_fln/article/details/7281986) Sed简介 sed是一种在线编辑器,它一次处理一行内容.处理时,把当前处理的行存储在临时 ...

  3. CodeForces 811C Vladik and Memorable Trip

    $dp$. 记录$dp[i]$表示以位置$i$为结尾的最大值. 枚举最后一段是哪一段,假设为$[j,i]$,那么可以用$max(dp[1]...dp[j-1]) + val[j][i]$去更新$dp[ ...

  4. python魔法方法-自定义序列详解

    自定义序列的相关魔法方法允许我们自己创建的类拥有序列的特性,让其使用起来就像 python 的内置序列(dict,tuple,list,string等). 如果要实现这个功能,就要遵循 python ...

  5. Scrapy实战篇(七)之Scrapy配合Selenium爬取京东商城信息(下)

    之前我们使用了selenium加Firefox作为下载中间件来实现爬取京东的商品信息.但是在大规模的爬取的时候,Firefox消耗资源比较多,因此我们希望换一种资源消耗更小的方法来爬取相关的信息. 下 ...

  6. 【BZOJ 4332】 4332: JSOI2012 分零食 (FFT+快速幂)

    4332: JSOI2012 分零食 Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 119  Solved: 66 Description 这里是欢乐 ...

  7. 【BZOJ 2299】 2299: [HAOI2011]向量 (乱搞)

    2299: [HAOI2011]向量 Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 1255  Solved: 575 Description 给你一 ...

  8. tomcat8.5请求参数限制的问题

    前段时间遇到这个问题: 包含json字符串类型的参数的http请求失败,返回状态码400,提示invalid character found in the request target. Tomcat ...

  9. 51nod1821 最优集合 贪心

    首先考虑一个集合的最大优美值怎么求出 考虑新增一个数,假设我们现在的优美值已经达到了$V$,那么只需要一个$[1, V + 1]$的数就可以使$V$达到更大 为了保证能添加尽可能多的数进来,我们这么构 ...

  10. 快速幂 cojs 1130. 取余运算

    cojs 1130. 取余运算 ★   输入文件:dmod.in   输出文件:dmod.out   简单对比时间限制:10 s   内存限制:128 MB [题目描述] 输入b,p,k的值,求b^p ...