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 相关文章推荐
[原创]js与自动伸缩图片 自动缩小图片的多浏览器兼容的方法总结
Mar 12 Javascript
javascript 模拟点击广告
Jan 02 Javascript
23个超流行的jQuery相册插件整理分享
Apr 25 Javascript
捕获和分析JavaScript Error的方法
Mar 25 Javascript
jQuery简易图片放大特效示例代码
Jun 09 Javascript
微信小程序实现图片放大预览功能
Oct 22 Javascript
JS中offset和匀速动画详解
Feb 06 Javascript
webpack中使用iconfont字体图标的方法
Feb 22 Javascript
JavaScript类的继承方法小结【组合继承分析】
Jul 11 Javascript
微信小程序实现一张或多张图片上传(云开发)
Sep 25 Javascript
JavaScript代理模式原理与用法实例详解
Mar 10 Javascript
antd-日历组件,前后禁止选择,只能选中间一部分的实例
Oct 29 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
图书管理程序(三)
2006/10/09 PHP
dede3.1分页文字采集过滤规则详说(图文教程)续四
2007/04/03 PHP
PHP遍历数组的三种方法及效率对比分析
2015/02/12 PHP
PHP中的魔术方法总结和使用实例
2015/05/11 PHP
WordPress过滤垃圾评论的几种主要方法小结
2016/07/11 PHP
Yii 2.0实现联表查询加搜索分页的方法示例
2017/08/02 PHP
PHP接口继承及接口多继承原理与实现方法详解
2017/10/18 PHP
Thinkphp 框架扩展之类库扩展操作详解
2020/04/23 PHP
如何运行/调试你的PHP代码
2020/10/23 PHP
鼠标移到图片上变大显示而不是放大镜效果
2014/06/15 Javascript
node.js中的fs.createReadStream方法使用说明
2014/12/17 Javascript
JavaScript比较两个对象是否相等的方法
2015/02/06 Javascript
网页前端登录js按Enter回车键实现登陆的两种方法
2016/05/10 Javascript
AngularJS教程之MVC体系结构详解
2016/08/16 Javascript
vue.js实现条件渲染的实例代码
2017/06/22 Javascript
JavaScript 中的12种循环遍历方法【总结】
2018/05/31 Javascript
layDate日期控件使用方法详解
2018/11/15 Javascript
jquery实现二级导航下拉菜单效果实例
2019/05/14 jQuery
JS实现水平遍历和嵌套递归操作示例
2019/08/15 Javascript
微信小程序 云开发模糊查询实现解析
2019/09/02 Javascript
详解Vue3中对VDOM的改进
2020/04/23 Javascript
three.js 实现露珠滴落动画效果的示例代码
2021/03/01 Javascript
一起来了解一下JavaScript的预编译(小结)
2021/03/01 Javascript
[51:17]完美世界DOTA2联赛循环赛Inki vs DeMonsTer 第二场 10月30日
2020/10/31 DOTA
Python删除空文件和空文件夹的方法
2015/07/14 Python
python如何查看微信消息撤回
2018/11/27 Python
深入学习python多线程与GIL
2019/08/26 Python
python脚本实现mp4中的音频提取并保存在原目录
2020/02/27 Python
keras model.fit 解决validation_spilt=num 的问题
2020/06/19 Python
Python如何优雅删除字符列表空字符及None元素
2020/06/25 Python
用 python 进行微信好友信息分析
2020/11/28 Python
三星法国官方网站:Samsung法国
2019/10/31 全球购物
2014年审计工作总结
2014/11/17 职场文书
团结主题班会
2015/08/13 职场文书
2016庆祝教师节新闻稿
2015/11/25 职场文书
创新创业项目计划书该怎样写?
2019/08/13 职场文书