上班不想打卡那点事儿(一)

上个月入职了新公司,市民中心的写字楼还是挺高大上的,同事里面也不乏大牛,流程也还算齐全,总的来说还是非常愉快的。 可惜美中不足的一点居然是打卡。 有关打卡的事情知乎上早就有过讨论了: 员工代打卡怎么办?

其中有一句总结的非常经典

打卡第一定律:凡是打卡,就一定会有代打卡

当然公司也没有使用非常老套的指纹打卡,而是非常『与时俱进』地使用了OA系统来管理打卡,哦哟好高大上 O(∩_∩)O。

身为码农,怎么能让人代打卡呢,当然是用代码来解决嘛。

公司的OA系统对于打卡有两个限制:第一是上班打卡时间必须在8:30到9:00之间,超过1分钟都不行,第二是必须通过公司的IP登陆系统才可以进行打卡。

第一个问题好解决,无非是通过定时任务,第二个问题则有些麻烦,幸好Stone同学非常支持,拿了一台以前的Dell台式机,装了Ubuntu作为服务器放在办公室,解决了这个问题。

于是万事俱备,只欠东风。

作为前端码农,Node是非常好的一件武器,所以代码实现都是基于Node的。

第一版的脚本非常简单,主要就是使用phantomJS来模拟用户行为,并通过 Later.js 设置定时任务,过程中倒是遇到了一些小坑: 由于公司OA系统在登陆后会关闭当前窗口(不过之后发现可以在OA中设置),所以一开始phantom总是无法在登陆后执行evaluate,不得不又 new 了一个新的 page 进行 evaluate。phantom 中同一个进程共享Cookie,而OA系统是通过Cookie来存储sessionId的,因此这个思路倒是没有什么大问题。

于是这个脚本愉快地在线上跑了有半个月,当然其中调试的时候也有一不小心提前下班了的事情发生,不过大部分时间我则保持迟到40分钟的状态,相当愉快。

不过很快遇到了一些麻烦。

某天需要在第二天请假,不得不把脚本停止了,导致第二天不得不早早地去上班,不开心。所以需要一个启停计划任务的界面,然而在这同时,我的这个小工具被办公室的两位同事发现了,我就被『强行逼迫』做一个登陆界面出来,于是索性就写了一个网站。

最初的网站是多页应用,分为三个部分:打卡、启停自动打卡服务以及查看日志。使用了 MaterializeCSS 这个UI框架,最初的界面比较朴素,也就是填写一下表单,提交以后通过Node执行一个脚本,然后返回脚本的执行结果。

之后经过一些修改,主要是使用React重写了一遍应用,顺便添加了图标、优化了一下UI,界面已经改为下面这样了,表单可以隐藏起来,界面开始了就清爽多了。

现在小伙伴们都在愉快地使用这个小工具进行打卡,再也不怕因为坑爹的打卡系统而发生迟到30秒这种奇葩的事情了。

有关脚本及Node的代码我将会在下一篇中介绍。

PS:如果有人看到这里,说明你非常有毅力,我来送你一句忠告吧:要打卡的公司千万不要去!