自动签到升级版(JS实现的每日定时任务)
公司规定每日签到两次;日子太安逸了,有时候中午居然会忘记签到……
于是,笔者寻思写一个自动签到的脚本;每天指定两个签到时段,每次打开页面,先检测当前是否为签到时段,如果在签到时段,则检查cookie中记录的值,确认该时段是否已经签到过了,巴拉巴拉…… 具体细节见流程图:

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

整个页面的代码如下,其中用到了笔者《JavaScript类库/组件/框架封装的总体结构》一文中提到的框架,封装了一个定时运行器,具体用法见注释:
- <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
- <html>
- <head>
- <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
- <meta name="author" content ="http://blog.csdn.net/NearEast"/>
- <title>check in page</title>
- <style type="text/css">
- .clear{
- clear:both;
- }
- .float{
- float:left;
- }
- </style>
- </head>
- <body>
- <div id="dInfo" class="float"></div>
- <div class="clear"></div>
- <div id="wrap">
- <iframe class="float" id='i_iframe1' name="n_iframe1" frameborder="0"></iframe>
- <iframe class="float" id='i_iframe2' name="n_iframe2" frameborder="0"></iframe>
- <form target="n_iframe1" name="loginform" method="post" action="http://192.168.19.11:8010/signin/signin.jsp">
- <input name="name" type='hidden' value='nidong' />
- <input name="passwd" type='hidden' value='11111111' />
- </form>
- </div>
- </body>
- <script type="text/javascript">
- <span style="white-space:pre"> </span>//封装一个定时运行器
- (function( window, undefined ) {
- var doc = window.document;
- var _checkTime, _func, _tip, _print;
- /**
- 初始化参数checkTime指定功能执行的时段,默认时间为'8:15'到'9:00',以及'12:35'到'14:00'两个时段
- checkTime应该是24小时制的,并且前面的绝对时间小于后面的绝对时间,例如'00:00:10'在'23:59'的前面
- func:在该时间段要执行的功能
- printFunc:日志信息的打印方法,默认为console.log方法打日志
- tip:要执行的功能的描述,tip可以是html语句,与printFunc结合可能达到各种效果,如例子所示
- */
- var checkUtil = function(conf) {
- _checkTime = conf.checkTime || ['8:15', '9:00', '12:35','14:00'];
- _func = conf.func;
- _tip = conf.tip || '功能执行';
- _print = conf.printFunc || console.log;
- _checkAndSet();
- };
- window.checkUtil= checkUtil;
- /**基于一个指定日期的时间base,通过'hh:mm:ss'格式的时间字符串,获取其毫秒时间
- 默认秒数为0
- */
- function _getMillisecond(base, str){
- var slices = str.split(':');
- if(!base instanceof Date || slices.length<2){
- alert('param error');
- return;
- }
- base.setHours(parseInt(slices[0]));
- base.setMinutes(parseInt(slices[1]));
- base.setSeconds(parseInt(slices[2]||'0'));
- return base.getTime();
- }
- /**计算是否处在签到时间段(flag==true),并返回距离下一次签到还有多久(毫秒)
- */
- function _getCheckTime(){
- var split = [], d = new Date(), curTime = new Date(d);
- d.setMilliseconds(0);
- for(var i=0;i<_checkTime.length;i++){
- split[i] = _getMillisecond(d, _checkTime[i]);
- }
- //最后一个元素为第一个元素加上24小时,意为循环到第二天
- split.push(24*3600*1000 + split[0]);
- split.unshift(_getMillisecond(d, '00:00:00'));
- var start, end;
- for(var i=0;i<split.length;i++){
- start = split[i];
- end = split[(i+1)%split.length];
- if(start<=curTime && curTime<=end){
- return{
- eclipse:end - curTime,
- flag:i%2==1/*第奇数个元素*/
- }
- }
- }
- return 'error';
- }
- function _addCookie(name, value) {
- var hours = 2;
- var exp = new Date();
- exp.setTime(exp.getTime() + hours * 60 * 60 * 1000);
- doc.cookie = name + "=" + escape(value) + ";expires="+ exp.toGMTString();
- }
- function _getCookie(name) {
- var arr, reg = new RegExp("(^| )" + name + "=([^;]*)(;|$)");
- if (arr = doc.cookie.match(reg))
- return unescape(arr[2]);
- else
- return null;
- }
- function _delCookie(name) {
- doc.cookie = name + "=n;expires=Thu, 01-Jan-70 00:00:01 GMT";
- }
- function _checkAndSet(){
- var ret = _getCheckTime();
- if(ret.flag){
- _print('当前为' + _tip + '时段');
- var checked = _getCookie('_checked');
- if(checked == 'true'){
- _print('本时段已' + _tip);
- }else{
- _print('现在执行' + _tip);
- _func();
- //////////////////////////print some information
- _addCookie('_checked', 'true');
- }
- }else{
- _print('当前非' + _tip + '时段');
- _delCookie('_checked');
- }
- setTimeout(function(){
- _checkAndSet();
- }, ret.eclipse);
- _print('将于' + ret.eclipse/1000 + '秒之后,执行_checkAndSet()');
- };
- })(window);
- window.onresize = function(){
- var frm = document.getElementById('i_iframe1');
- var frm2 = document.getElementById('i_iframe2');
- document.getElementById('wrap').style.height = document.documentElement.clientHeight+'px';
- frm.width=frm2.width='50%';//document.documentElement.clientWidth/2;
- frm.height=frm2.height='100%';//document.documentElement.clientHeight;
- };
- window.onload = function(){
- window.onresize();
- ///////////////////////////////As a single page
- checkUtil({func:function(){
- checkon();
- }, tip:'<a href="javascript:checkon();">签到</a>'
- , checkTime:['15:50', '15:50:10', '15:50:20','15:50:30']
- , printFunc:function(txt){
- document.getElementById('dInfo').innerHTML += txt+'<br>';
- }
- });
- }
- function checkon(){
- loginform.childNodes[1].value='nidong';
- loginform.target="n_iframe1";
- loginform.submit();
- loginform.childNodes[1].value='gengap';
- loginform.target="n_iframe2";
- loginform.submit();
- }
- </script>
- </html>
以上页面的js代码中,封装了一个checkUtil组件,可以用来定期执行任务。初始化参数checkTime中可以给出一天之内的多个时段,只要浏览器页面是打开状态,到了一定时间就将运行func参数指定的函数;如果天天不关机,就可以一劳永逸,不用操心func函数的运行了。不过虽然代码几经修改,存在别的小问题还是难免的,也不能完全依赖它做事;定期查看一下日志还是很必要的。
由于Chrome只支持online cookie,直接把代码粘到一个本地文件运行是无效的,其它浏览器不存在这个问题。
自动签到升级版(JS实现的每日定时任务)的更多相关文章
- 360每日自动签到,领取积分 (java httpclient4.x)
如何登陆360,并每日自动签到这次的难点主要集中在登陆这里了,开始抓包发现360登陆验证很麻烦,但是后来发现一个简单的方法.因为我安装了360安全卫士,发现点击那个金币的按钮能直接验证登陆,哈哈~所以 ...
- nodejs什么值得买自动签到自动评论定时任务
本项目是基于nodejs开发,实现的功能是,什么值得买自动签到,自动评论功能,自动发邮件,支持多人多账号运行 目的是为了,解放双手,轻松获取什么值得买的经验和积分,得到更高的等级,从而突破很会员等级限 ...
- 【开源】使用.Net Core和GitHub Actions实现哔哩哔哩每日自动签到、投币、领取奖励
BiliBiliTool是一个B站自动执行任务的工具,使用.NET Core编写,通过它可以实现B站帐号的每日自动观看.分享.投币视频,获取经验,每月自动领取会员权益.自动为自己充电等功能,帮助我们轻 ...
- Python 实现 T00ls 自动签到脚本(邮件+钉钉通知)
T00ls 每日签到是可以获取 TuBi 的,由于常常忘记签到,导致损失了很多 TuBi .于是在 T00ls 论坛搜索了一下,发现有不少大佬都写了自己的签到脚本,签到功能实现.定时任务执行以及签到提 ...
- selenium之数据驱动框架应用WPS个人中心自动签到
wps在注册后,有个每日签到的功能,签到后有几率送wps的专属金币[稻米],为了免费获得,又不想每天都是人工去执行签到动作,所以用selenium写了个小脚本,准备用数据驱动框架来完成这个事情,数据驱 ...
- Vue+Vuex实现自动登录 升级版
Vue+Vuex实现自动登录 升级版 之前实现的版本在这里:Vue+Vuex实现自动登录 在之前实现的版本中,如果你进行测试,可以看到在浏览器的local Storage中,确实里面有了我 ...
- python3+任务计划实现的人人影视网站自动签到
python3+任务计划实现的人人影视网站自动签到 这是一个自动化程度较高的程序,运行本程序后会从chrome中读取cookies用于登录人人影视签到, 并且会自动添加一个windows 任务计划,这 ...
- python写的自动签到脚本。
等以后有时间补上. 附上代码: #! /usr/bin/env python # coding:utf-8 #-----------------------------------------学号和密 ...
- 带左右箭头切换的自动滚动图片JS特效
效果图 按钮 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www. ...
随机推荐
- Loadrunner脚本开发规范
Loadrunner脚本开发规范 目录 1.一般约定... 3 2.代码注释约定... 4 3.格式化代码... 5 1.一般约定 1.1具体脚本规则,必须在具体代码中加注释,以便脚本开发人员阅读和理 ...
- 十 使用dict和set
dict Python内置了字典:dict的支持,dict全称dictionary,在其他语言中也称为map,使用键-值(key-value)存储,具有极快的查找速度. 举个例子,假设要根据同学的名字 ...
- shell top解析
top命令是Linux下常用的性能分析工具,能够实时显示系统中各个进程的资源占用状况,类似于Windows的任务管理器. top显示系统当前的进程和其他状况,是一个动态显示过程,即可以通过用户按键来不 ...
- JVM的内存结构,JVM的回收机制
内存作为系统中重要的资源,对于系统稳定运行和高效运行起到了关键的作用,Java和C之类的语言不同,不需要开发人员来分配内存和回收内存,而是由JVM来管理对象内存的分配以及对象内存的回收(又称为垃圾回收 ...
- 关联的CURD
在保存的前面必须先建立好关联.但是默认情况下还是不会自动保存,如果保存会出错. Cascade all所有关联的所有持久化都是级联到另一个对象.保存这个对象的时候关联的对象自动保存. Cascade只 ...
- 「COCI2016/2017 Contest #2」Bruza
「COCI2016/2017 Contest #2」Bruza 解题思路 : 首先对于任意时刻 \(i\) ,硬币一定移动到了深度为 \(i\) 的节点,所以第 \(i\) 时刻 Danel 一定染掉 ...
- [BZOJ4552][TJOI2016&&HEOI2016]排序(二分答案+线段树/线段树分裂与合并)
解法一:二分答案+线段树 首先我们知道,对于一个01序列排序,用线段树维护的话可以做到单次排序复杂度仅为log级别. 这道题只有一个询问,所以离线没有意义,而一个询问让我们很自然的想到二分答案.先二分 ...
- px,dp,sp以及像素密度
px px(pixel): 像素,是指在由一个数字序列表示的图像中的一个最小单位.在Android中,无论屏幕密度多少,一个像素单位对应一个屏幕像素单位,不会根据屏幕密度自动缩放,因此一般不推荐使用p ...
- zoj 3329 概率dp
题意:有三个骰子,分别有k1,k2,k3个面.每个面值为1--kn每次掷骰子,如果三个面分别为a,b,c则分数置0,否则加上三个骰子的分数之和.当分数大于n时结束.求游戏的期望步数.初始分数为0 链接 ...
- bzoj 1026
很久以前做过的一道数位DP,现在用一种新的解决数位DP的比较一般的方法. 数位DP裸题是:求[L,R]有多少个数. 先转化成求[0,R]有多少个数,然后区间相减即可. 对于[0,R]中的所有数,用0补 ...