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窗口功能指南之在窗口中书写内容
Jul 21 Javascript
关于ExtJS4.1:快捷键支持的问题
Apr 24 Javascript
JS Jquery 遍历,筛选页面元素 自动完成(实现代码)
Jul 08 Javascript
javascript中的遍历for in 以及with的用法
Dec 22 Javascript
js全选按钮的实现方法
Nov 17 Javascript
javascript特殊日历控件分享
Mar 07 Javascript
JS实现获取来自百度,Google,soso,sogou关键词的方法
Dec 21 Javascript
Vue.js如何优雅的进行form validation
Apr 07 Javascript
11行JS代码制作二维码生成功能
Mar 09 Javascript
详解React之key的使用和实践
Sep 29 Javascript
mpvue+vant app搭建微信小程序的方法步骤
Feb 11 Javascript
jquery实现下载图片功能
Jul 18 jQuery
微信小程序实现手指拖动选项排序
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
ajax缓存问题解决途径
2006/12/06 PHP
简单的php写入数据库类代码分享
2011/07/26 PHP
PHP下使用CURL方式POST数据至API接口的代码
2013/02/14 PHP
node.js 一个简单的页面输出实现代码
2012/03/07 Javascript
JQuery弹出层示例可自定义
2014/05/19 Javascript
JavaScript获取URL汇总
2015/06/08 Javascript
javascript将DOM节点添加到文档的方法实例分析
2015/08/04 Javascript
js中用cssText设置css样式的简单方法
2016/09/19 Javascript
jstree的简单实例
2016/12/01 Javascript
关于angular js_$watch监控属性和对象详解
2017/04/24 Javascript
详解微信小程序调起键盘性能优化
2018/07/24 Javascript
爬虫利器Puppeteer实战
2019/01/09 Javascript
详解小程序input框失焦事件在提交事件前的处理
2019/05/05 Javascript
如何利用javascript接收json信息并进行处理
2020/08/06 Javascript
详解 javascript对象创建模式
2020/10/30 Javascript
你不知道的SpringBoot与Vue部署解决方案
2020/11/09 Javascript
Python自动调用IE打开某个网站的方法
2015/06/03 Python
使用Python读取安卓手机的屏幕分辨率方法
2018/03/31 Python
python导入pandas具体步骤方法
2019/06/23 Python
Django自带日志 settings.py文件配置方法
2019/08/30 Python
PyQt5+python3+pycharm开发环境配置教程
2020/03/24 Python
解决python ThreadPoolExecutor 线程池中的异常捕获问题
2020/04/08 Python
Mysql数据库反向生成Django里面的models指令方式
2020/05/18 Python
Django如何重置migration的几种情景
2021/02/24 Python
美国畅销的跑步机品牌:ProForm
2017/02/06 全球购物
Kiehl’s科颜氏西班牙官方网站:源自美国的植物护肤品牌
2020/02/22 全球购物
欢送退休感言
2014/02/08 职场文书
《月亮湾》教学反思
2014/04/14 职场文书
《李广射虎》教学反思
2014/04/27 职场文书
总经理岗位职责说明书
2014/07/30 职场文书
学校党的群众路线教育实践活动个人整改方案
2014/10/31 职场文书
外国人来华邀请函
2015/01/31 职场文书
2015年发展党员工作总结报告
2015/03/31 职场文书
公司总经理岗位职责
2015/04/01 职场文书
辅导员学期工作总结
2015/08/14 职场文书
Python编程源码报错解决方法总结经验分享
2021/10/05 Python