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分页函数代码
Sep 10 Javascript
js的alert弹出框出现乱码解决方案
Sep 02 Javascript
基于jQuery实现最基本的淡入淡出效果实例
Feb 02 Javascript
localStorage实现便签小程序
Nov 28 Javascript
Vue.js双向绑定操作技巧(初级入门)
Dec 27 Javascript
Node.js查找当前目录下文件夹实例代码
Mar 07 Javascript
微信小程序 空白页重定向解决办法
Jun 27 Javascript
AngularJS使用ocLazyLoad实现js延迟加载
Jul 05 Javascript
promise处理多个相互依赖的异步请求(实例讲解)
Aug 03 Javascript
基于Two.js实现星球环绕动画效果的示例
Nov 06 Javascript
微信小程序 scroll-view实现锚点滑动的示例
Dec 06 Javascript
jQuery实现简单聊天室
Feb 08 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
经典PHP加密解密函数Authcode()修复版代码
2015/04/05 PHP
php生成rss类用法实例
2015/04/14 PHP
学习thinkphp5.0验证类使用方法
2017/11/16 PHP
ASP Json Parser修正版
2009/12/06 Javascript
关于jQuery中的end()使用方法
2011/07/10 Javascript
Js为表单动态添加节点内容的方法
2015/02/10 Javascript
jquery表单对象属性过滤选择器实例分析
2015/05/18 Javascript
基于javascript实现窗口抖动效果
2016/01/03 Javascript
JavaScript实现仿淘宝商品购买数量的增减效果
2016/01/22 Javascript
基于javascript实现简单的抽奖系统
2020/04/15 Javascript
jquery树形菜单效果的简单实例
2016/06/06 Javascript
JavaScript实现反转字符串的方法详解
2017/04/27 Javascript
vue-music关于Player播放器组件详解
2017/11/28 Javascript
vue中阻止click事件冒泡,防止触发另一个事件的方法
2018/02/08 Javascript
jQuery 实现倒计时天,时,分,秒功能
2018/07/31 jQuery
Node.js实现简单的爬取的示例代码
2019/06/25 Javascript
详解django模板与vue.js冲突问题
2019/07/07 Javascript
React实现阿里云OSS上传文件的示例
2020/08/10 Javascript
[03:24]DOTA2超级联赛专访hao 大翻盘就是逆袭
2013/05/24 DOTA
Python中运行并行任务技巧
2015/02/26 Python
python版简单工厂模式
2017/10/16 Python
用Python写一段用户登录的程序代码
2018/04/22 Python
python实现傅里叶级数展开的实现
2018/07/21 Python
Python通过for循环理解迭代器和生成器实例详解
2019/02/16 Python
django之使用celery-把耗时程序放到celery里面执行的方法
2019/07/12 Python
numpy.linalg.eig() 计算矩阵特征向量方式
2019/11/29 Python
python框架Django实战商城项目之工程搭建过程图文详解
2020/03/09 Python
Python Pygame实现俄罗斯方块
2021/02/19 Python
美国网上花店:JustFlowers
2017/02/12 全球购物
岗位职责的定义
2013/11/10 职场文书
电钳专业个人求职信
2014/01/04 职场文书
资源工程专业毕业生求职信
2014/02/27 职场文书
2015年宣传部部长竞选演讲稿
2014/11/28 职场文书
餐厅营销的秘密:为什么老顾客会流水?
2019/08/08 职场文书
画错魏国疆域啦!《派对咖孔明》动画因作画失误于官网致歉
2022/04/07 日漫
JS实现刷新网页后之前浏览位置保持不变示例详解
2022/08/14 Javascript