JS脚本实现定时到网站上签到/签退功能


Posted in Javascript onApril 22, 2020

之前介绍过使用temperMonkey屏蔽CSDN广告的方法,主要就是要针对性地分析网站结构,然后用代码去改变或者操作DOM。今天也一样,我们需要观察网页结构,找到我们要操作的按钮,触发他的click事件就可以了。下面以公司打卡签到的网站为例,做一些坏坏的事情。本文读者最好有一定的HTML和JavaScript基础。

首先,想象一下你去签到需要做什么:

  • 打开网站
  • 登陆
  • 点击“签到”按钮

然后每一步我们都可以让代码帮我们去做。

0. 如何定时

这段代码是核心,就是根据当前时间和设定的时间做差值,来确定定时器的值
看懂这段代码,后面的就都容易了。都是在利用定时器触发callback。

// user setting
const SIGN_IN_TIME = "09:30:00"; // 签到时间
const SIGN_OUT_TIME = "20:00:00"; // 签退时间

// code implementation
logTime("code start running");
const now = new Date();
const today = now.getFullYear() + "-" + (now.getMonth() + 1) + "-" + now.getDate();
var signInTime = +new Date(`${today} ${SIGN_IN_TIME}`);
logTime("signInTime", new Date(signInTime));
var signOutTime = +new Date(`${today} ${SIGN_OUT_TIME}`);
logTime("signOutTime", new Date(signOutTime));
// diff in or out
if (now > signInTime && now < signOutTime) {
 // ready to sign out for today
 console.log("Seconds to sign out for today: " + (signOutTime - now) / 1000);
 setTimeout(callback, signOutTime - now);
} else {
 // ready to sign in for tomorrow
 signInTime = +signInTime + 60 * 60 * 24 * 1000;
 console.log("Seconds to sign in for tomorrow: " + (signInTime - now) / 1000);
 setTimeout(callback, signInTime - now);
}

function logTime(str, time = new Date()) {
 console.log(`${str} -> ${time.getHours()}:${time.getMinutes()}:${time.getSeconds()}`);
}

1. 定时自动打开网站

因为大多数网站都有,“长时间未操作-自动退出”的设置。所以我们要在需要打卡的时候再打开网站。
在电脑本地跑一个程序,使用定时器。这里跑一个node程序:

const open = require('open');
logTime("Start Runing");

// user setting
const SIGN_IN_TIME = "09:30:00";
const SIGN_OUT_TIME = "20:20:00";

// code implementation
const openBrowser = async () => {
 await open('http://172.10.80.42');
};
logTime("code start running");
const now = new Date();
const today = now.getFullYear() + "-" + (now.getMonth() + 1) + "-" + now.getDate();
var signInTime = +new Date(`${today} ${SIGN_IN_TIME}`);
logTime("signInTime", new Date(signInTime));
var signOutTime = +new Date(`${today} ${SIGN_OUT_TIME}`);
logTime("signOutTime", new Date(signOutTime));
// diff in or out
if (now > signInTime && now < signOutTime) {
 // ready to sign out for today
 console.log("Seconds to sign out for today: " + (signOutTime - now) / 1000);
 setTimeout(openBrowser, signOutTime - now);
} else {
 // ready to sign in for tomorrow
 signInTime = +signInTime + 60 * 60 * 24 * 1000;
 console.log("Seconds to sign in for tomorrow: " + (signInTime - now) / 1000);
 setTimeout(openBrowser, signInTime - now);
}

function logTime(str, time = new Date()) {
 console.log(`${str} -> ${time.getHours()}:${time.getMinutes()}:${time.getSeconds()}`);
}

2. 自动登录

这个重点还是在于找到需要填入内容的DOM元素

(function() {
 'use strict';
 // login
 document.querySelector("#loginid").value = "用户名";
 document.querySelector("#userpassword").value = "密码";
 document.querySelector("#login").click();
})();

3. 定时点击按钮

这一步最重要的是要准确找到按钮,检查元素慢慢查找吧。
其次,设定好签到和签退的时间,只有固定时间才会自动签到,防止每次登陆进来自动签到或签退,这样太频繁被发现。

(function() {
 'use strict';

 // user setting
 const SIGN_IN_TIME = "09:00:00";
 const SIGN_OUT_TIME = "21:00:00";

 // code implementation
 logTime("code start running");
 const now = new Date();
 const today = now.getFullYear()+"-"+(now.getMonth()+1)+"-"+now.getDate();
 var signInTime = +new Date(`${today} ${SIGN_IN_TIME}`);
 logTime("signInTime", new Date(signInTime));
 var signOutTime = +new Date(`${today} ${SIGN_OUT_TIME}`);
 logTime("signOutTime", new Date(signOutTime));
 // diff in or out
 if(now > signInTime && now < signOutTime) {
 // ready to sign out for today
 console.log("Seconds to sign out for today: " + (signOutTime - now)/1000);
 setTimeout(signInorSignOut, signOutTime - now);
 } else {
 // ready to sign in for tomorrow
 signInTime = +signInTime + 60 * 60 * 24 * 1000;
 console.log("Seconds to sign in for tomorrow: " + (signInTime - now)/1000);
 setTimeout(signInorSignOut, signInTime - now);
 }

 // signInorSignOut
 function signInorSignOut(){
 logTime(`signInButton clicked!`);
 // 重点就在这儿了,找到网站的签到按钮#signInButton,并触发他的点击事件
 document.querySelector("#signInButton").click();
 }

 function logTime(str, time=new Date()){
 console.log(`${str} -> ${time.getHours()}:${time.getMinutes()}:${time.getSeconds()}`);
 }
})();

4. 结束

一套操作,打完收工。每天下班的时候,不管是提前溜还是晚点到。记得本地开一下程序:

node timer.js

到此这篇关于JS脚本实现定时到网站上签到/签退功能的文章就介绍到这了,更多相关js 定时签到签退内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Javascript 相关文章推荐
获取JavaScript用户自定义类的类名称的代码
Mar 08 Javascript
jQuery去掉字符串起始和结尾的空格(多种方法实现)
Apr 01 Javascript
Javascript事件实例详解
Nov 06 Javascript
Jquery Mobile 自定义按钮图标
Nov 18 Javascript
一分钟理解js闭包
May 04 Javascript
jquery实现一个全局计时器(商城可用)
Jun 30 jQuery
解决Vue开发中对话框被遮罩层挡住的问题
Nov 26 Javascript
vue组件之间通信方式实例总结【8种方式】
Feb 22 Javascript
JavaScript中this用法学习笔记
Mar 17 Javascript
ES6 Generator函数的应用实例分析
Jun 26 Javascript
微信小程序在ios下Echarts图表不能滑动的问题解决
Jul 10 Javascript
js实现限定区域范围拖拉拽效果
Nov 20 Javascript
微信小程序实现手指拖动选项排序
Apr 22 #Javascript
javascript设计模式 ? 观察者模式原理与用法实例分析
Apr 22 #Javascript
javascript设计模式 ? 状态模式原理与用法实例分析
Apr 22 #Javascript
Vue computed 计算属性代码实例
Apr 22 #Javascript
js 解析 JSON 数据简单示例
Apr 21 #Javascript
react 原生实现头像滚动播放的示例
Apr 21 #Javascript
解决angular 使用原生拖拽页面卡顿及表单控件输入延迟问题
Apr 21 #Javascript
You might like
php购物车实现代码
2011/10/10 PHP
PHP获取当前页面完整URL的实现代码
2013/06/10 PHP
php根据一个给定范围和步进生成数组的方法
2015/06/19 PHP
laravel中命名路由的使用方法
2017/02/24 PHP
window.addeventjs事件驱动函数集合addEvent等
2008/02/19 Javascript
jquery 学习笔记 传智博客佟老师附详细注释
2020/09/12 Javascript
js removeChild 障眼法 可能出现的错误
2009/10/06 Javascript
JavaScript arguments 多参传值函数
2010/10/24 Javascript
js中获取事件对象的方法小结
2011/03/13 Javascript
JavaScript之自定义类型
2012/05/04 Javascript
JS验证日期的格式YYYY-mm-dd 具体实现
2013/06/29 Javascript
JS 实现导航栏悬停效果
2013/09/23 Javascript
Javascript全局变量var与不var的区别深入解析
2013/12/09 Javascript
IE8下Jquery获取select选中的值post到后台报错问题
2014/07/02 Javascript
JavaScript日期时间与时间戳的转换函数分享
2015/01/31 Javascript
jQuery插件PageSlide实现左右侧栏导航菜单
2015/04/12 Javascript
jquery实现左右滑动菜单效果代码
2015/08/27 Javascript
js实现数组冒泡排序、快速排序原理
2016/03/08 Javascript
javascript实现的猜数小游戏完整实例代码
2016/05/10 Javascript
js中json处理总结之JSON.parse
2016/10/14 Javascript
js实现可旋转的立方体模型
2016/10/16 Javascript
详解用webpack把我们的业务模块分开打包的方法
2017/07/20 Javascript
详解在express站点中使用ejs模板引擎
2017/09/21 Javascript
微信小程序tabBar用法实例详解
2017/12/04 Javascript
使用jQuery mobile NuGet让你的网站在移动设备上同样精彩
2019/06/18 jQuery
使用Bootstrap做一个朝代历史表
2019/12/10 Javascript
简单的Python2.7编程初学经验总结
2015/04/01 Python
为Python的web框架编写MVC配置来使其运行的教程
2015/04/30 Python
python中使用PIL制作并验证图片验证码
2018/03/15 Python
Tensorflow全局设置可见GPU编号操作
2020/06/30 Python
PyTorch如何搭建一个简单的网络
2020/08/24 Python
阿联酋彩妆品牌:OUD MILANO
2019/10/06 全球购物
学校课外活动总结
2014/05/08 职场文书
保研推荐信
2014/05/09 职场文书
个人催款函范文
2015/06/24 职场文书
2015国庆节放假通知范文
2015/07/30 职场文书