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 相关文章推荐
jquerymobile checkbox及时刷新才能获取其准确值
Apr 14 Javascript
JavaScript高级程序设计 阅读笔记(十七) js事件
Aug 14 Javascript
jQuery根据纬度经度查看地图处理程序
May 08 Javascript
js模拟C#中List的简单实例
Mar 06 Javascript
AngularJS入门教程(一):静态模板
Dec 06 Javascript
图解js图片轮播效果
Dec 20 Javascript
javascript的函数劫持浅析
Sep 26 Javascript
Select2.js下拉框使用小结
Oct 24 Javascript
基于vue实现多引擎搜索及关键字提示
Mar 16 Javascript
jquery获取元素到屏幕四周可视距离的方法
Sep 05 jQuery
Vue批量图片显示时遇到的路径被解析问题
Mar 28 Javascript
微信小程序的引导页实现代码
Jun 24 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
咖啡知识大全
2021/03/03 新手入门
Windows PHP5和Apache的安装与配置
2009/06/08 PHP
php加密算法之实现可逆加密算法和解密分享
2014/01/21 PHP
PHP屏蔽过滤指定关键字的方法
2014/11/03 PHP
Zend Framework上传文件重命名的实现方法
2016/11/25 PHP
PHP实现的文件浏览器功能简单示例
2019/09/12 PHP
jquery的extend和fn.extend的使用说明
2011/01/09 Javascript
用jquery实现动画跳到顶部和底部(这个比较简单)
2014/09/01 Javascript
了不起的node.js读书笔记之例程分析
2014/12/22 Javascript
Redis基本知识、安装、部署、配置笔记
2015/03/05 Javascript
JavaScript整除运算函数ceil和floor的区别分析
2015/04/14 Javascript
基于JavaScript如何实现ajax调用后台定义的方法
2015/12/29 Javascript
基于MVC+EasyUI的web开发框架之使用云打印控件C-Lodop打印页面或套打报关运单信息
2016/08/29 Javascript
详解Angular的8个主要构造块
2017/06/20 Javascript
js中数组对象去重的两种方法
2019/01/18 Javascript
JS立即执行的匿名函数用法分析
2019/11/04 Javascript
JavaScript this关键字指向常用情况解析
2020/09/02 Javascript
[03:37]2015国际邀请赛第四日现场精彩集锦
2015/08/08 DOTA
python进阶教程之函数参数的多种传递方法
2014/08/30 Python
Python运算符重载详解及实例代码
2017/03/07 Python
Python:Scrapy框架中Item Pipeline组件使用详解
2017/12/27 Python
Python爬虫包BeautifulSoup实例(三)
2018/06/17 Python
Python 修改列表中的元素方法
2018/06/26 Python
Python 3.x基于Xml数据的Http请求方法
2018/12/28 Python
5款Python程序员高频使用开发工具推荐
2019/04/10 Python
matplotlib 生成的图像中无法显示中文字符的解决方法
2020/06/10 Python
基于Python爬取股票数据过程详解
2020/10/21 Python
详解WebSocket跨域问题解决
2018/08/06 HTML / CSS
三星美国官网:Samsung美国
2017/02/06 全球购物
阿迪达斯香港官网:adidas香港
2019/11/09 全球购物
2015年乡镇环保工作总结
2015/04/22 职场文书
团日活动总结格式
2015/05/11 职场文书
英语专业毕业论文答辩开场白
2015/05/27 职场文书
班主任寄语2016
2015/12/04 职场文书
解决Tkinter中button按钮未按却主动执行command函数的问题
2021/05/23 Python
centos8安装MongoDB的详细过程
2021/10/24 MongoDB