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 相关文章推荐
PJ Blog修改-禁止复制的代码和方法
Oct 25 Javascript
无语,javascript居然支持中文(unicode)编程!
Apr 12 Javascript
用AJAX返回HTML片段中的JavaScript脚本
Jan 04 Javascript
JavaScript类和继承 constructor属性
Mar 04 Javascript
jQuery源码分析-01总体架构分析
Nov 14 Javascript
jquery实现点击文字可编辑并修改保存至数据库
Apr 15 Javascript
jQuery+CSS3实现3D立方体旋转效果
Nov 10 Javascript
20分钟轻松创建自己的Bootstrap站点
May 12 Javascript
JS实现的点击表头排序功能示例
Mar 27 Javascript
jQuery获取table下某一行某一列的值实现代码
Apr 07 jQuery
基于Vue中点击组件外关闭组件的实现方法
Mar 06 Javascript
Vue实现剪切板图片压缩功能
Feb 04 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
在smarty中调用php内置函数的方法
2013/02/07 PHP
PHP ob缓存以及ob函数原理实例解析
2020/11/13 PHP
jQuery 页面载入进度条实现代码
2009/02/08 Javascript
myFocus slide3D v1.1.0 使用方法与下载
2011/01/12 Javascript
Jquery工作常用实例 使用AJAX使网页进行异步更新
2011/07/26 Javascript
Javascript中string转date示例代码
2013/11/01 Javascript
Windows 系统下安装和部署Egret的开发环境
2014/07/31 Javascript
JavaScript实现带标题的图片轮播特效
2015/05/20 Javascript
JavaScript缓冲运动实现方法(2则示例)
2016/01/08 Javascript
JS加载器如何动态加载外部js文件
2016/05/26 Javascript
详解利用 Vue.js 实现前后端分离的RBAC角色权限管理
2017/09/15 Javascript
ES6 系列之 WeakMap的使用示例
2018/08/06 Javascript
angular 实现同步验证器跨字段验证的方法
2019/04/11 Javascript
使用React手写一个对话框或模态框的方法示例
2019/04/25 Javascript
vue中@change兼容问题详解
2019/10/25 Javascript
Javascript前端下载后台传来的文件流代码实例
2020/08/18 Javascript
vue data有值,但是页面{{}} 取不到值的解决
2020/11/09 Javascript
es5 类与es6中class的区别小结
2020/11/09 Javascript
Python中的rjust()方法使用详解
2015/05/19 Python
python脚本设置系统时间的两种方法
2016/02/21 Python
Python处理文本文件中控制字符的方法
2017/02/07 Python
python并发编程之线程实例解析
2017/12/27 Python
Python中使用gflags实例及原理解析
2019/12/13 Python
六种酷炫Python运行进度条效果的实现代码
2020/07/17 Python
荷兰超市:DEEN
2018/03/14 全球购物
联想C++笔试题
2012/06/13 面试题
学生励志演讲稿
2014/01/06 职场文书
年终考核评语
2014/01/19 职场文书
求职面试个人自我评价
2014/02/28 职场文书
给老师的一封建议书
2014/03/13 职场文书
信用卡逾期证明示例
2014/09/13 职场文书
见习报告的格式
2014/10/31 职场文书
催款律师函范文
2015/05/27 职场文书
2016年小学植树节活动总结
2016/03/16 职场文书
读《推着妈妈去旅行》有感1500字
2019/10/15 职场文书
Shell脚本一键安装Nginx服务自定义Nginx版本
2022/03/20 Servers