在公司辛辛苦苦工作一天,加班到晚上八点,急匆匆赶上最后一辆班车,回到公寓。洗一个热水澡,躺在床上刷微博、知乎,真想大声说一句,”这一刻是最舒服的!”。然而,有时你会触电般惊起,呆坐在床边,心中一万头草泥马飘过,没打卡就回来了呀!!!
相信很多同学也遇到过这样的问题,辛苦工作一个月,发工资那天还要看工资条上会扣几百大洋,简直不能忍。
其实我的记性也算不错,一直没有忘记打卡,并且公司也推出了三次补打卡的机会。直到那天,那是一个恬静的午后,我喝这下午茶(其实是冰红茶),打着fifa,突然想到查一查我的考勤记录。然后我就没心情完游戏了。周五下午没打卡。那赶紧去OA上补打卡啊。打开页面找了半天终于找到,此刻的我已是内流满面,感谢公司,感谢行政的同事,感谢……什么?!超过24小时不能补打卡?!
好了,这就是我写这个小工具的全部背景。
思路
公司有面向员工的考勤记录系统,这是基础。没有这个就不要想了,还是老老实实定个闹钟每天按时打卡把。
考勤记录系统是个简单的网页,用工号登录,考勤记录是json格式。那直接post登录,看json的最后一行就ok了。感谢IT部门的同事写的简单后台。
用什么提醒,刚开始想的是自己给自己发邮件。后来想到不是工作时间,我应该不会看邮件。其实到这个时候我想着服务的人还只是我自己。
后来在github上发现了itchat,一个个人微信接口,而且还是用python写的(窃喜),看了一下他的源码,是模仿公众号的官方接口写的,登录的是网页版的微信。
大致思路就是定时爬取考勤系统的打卡记录,如果当天记录没有两次,就发送微信提醒。
分两部分
爬考勤系统
1 | #-*- coding:utf-8 -*- |
发送微信提醒
先安装itchat微信接口,是个python包1
sudo pip install itchat
然后看看源码吧,这个github页面介绍的也不是很清楚
1 | # -*- coding: utf-8 -*- |
check clock
1 | wfile = open("/home/yangguang/Clock_reminder/work_num.txt",'r') |
至此,这个打卡提醒基本完成。每天9:45和晚上18:50,19:55定时运行此脚本即可。
crontab -e 添加如下命令1
2
345 9 * * 1,2,3,4,5 /usr/bin/python /home/yangguang/Clock_reminder/Clock_reminder.py >> /home/yangguang/Clock_reminder/Clock_reminder.py.log 2>&1
50 18 * * 1,2,3,4,5 /usr/bin/python /home/yangguang/Clock_reminder/Clock_reminder.py >> /home/yangguang/Clock_reminder/Clock_reminder.py.log 2>&1
55 19 * * 1,2,3,4,5 /usr/bin/python /home/yangguang/Clock_reminder/Clock_reminder.py >> /home/yangguang/Clock_reminder/Clock_reminder.py.log 2>&1
进阶
每天提醒三次还是感觉像定了个闹钟(其实还是装X感不足,不能拿出去炫耀)。于是想到为啥不加个可以随时随地查询打卡时间的方法,因为itchat这个接口真的是功能强大。
于是乎,加个获取打卡时间1
2
3
4
5
6
7
8
9
10
11def get_clock(work_num):
date_time = commands.getoutput('date "+%Y-%m-%d %H:%M:%S"')
date = date_time.split(" ")[0]
Clock_dic = spider_clock(work_num)
if len(Clock_dic['rows']) == 0:
return
elif date != Clock_dic['rows'][-1]['card_date']:
return
else:
clock_time = Clock_dic['rows'][-1]['ClockInTime']
return clock_time
再写个自动回复微信的脚本,大功告成1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27# -*- coding: utf-8 -*-
#!/usr/bin/python
import itchat, time
from itchat.content import *
import sys
reload(sys)
sys.setdefaultencoding('utf8')
import check_clock
def text_reply(msg):
if msg['Content'] == "clock":
people = open("/home/yangguang/Clock_reminder/work_num.txt",'r')
friend_num = {}
for line in people:
friend_num[unicode(line.split("\t")[1].strip("\n"),"utf-8")] = line.split("\t")[0]
if msg['User']['RemarkName'] != '':
friend_name = msg['User']['RemarkName']
else:
friend_name = msg['User']['NickName']
work_num = friend_num[friend_name]
text_content = check_clock.get_clock(work_num)
if text_content == None:
text_content = "今天还未打卡"
else:
text_content = "今天的打卡时间为:"+text_content
itchat.send(text_content, msg['FromUserName'])
这样给我的微信发个clock就可以获得当天的打卡时间了。因为考勤系统需要内网才能登陆,所以这个功能真是受到了很多人的喜爱。这样一个场景是经常发生的:在班车上好不容易找到了一个座位,坐定,掏出耳机。不知道刚才出来是否打过卡了。以前没办法,为了保险起见你只能跑回公司打个卡再回来。
推广
推广时遇到了问题,我的把每个人的工号,姓名加到那个work_num.list中去,我得经常登陆服务器,这小服务器也要公司内网才行。最重要的是这个过程很low,哈哈哈哈哈。
于是乎,好吧,在那个自动回复的脚本中加上自动加好友吧1
2
3
4
5
6
7
8
def add_friend(msg):
each = msg['RecommendInfo']['Content'].split("+")
if each[0] == 'novo':
itchat.add_friend(**msg['Text'])
itchat.set_alias(msg['RecommendInfo']['UserName'],each[2])
itchat.send_msg('亡羊补牢不如未雨绸缪(・ิϖ・ิ)っ\n打卡提醒每天两次,分别在上午9:40和下午18:45,此消息只发给未打卡的旁友\n忘记有没有打卡可以发送clock获取当天的打卡记录\n发送 help 获取其他用法\n请确保考勤系统密码还是初始的123456( •̀∀•́ )', msg['RecommendInfo']['UserName'])
os.system('echo "%s %s" >> /home/yangguang/Clock_reminder/work_num.txt'%(each[1],each[2]))
这样别人在加我的时候,只要在验证消息里输入novo+工号+姓名,就可以自动加上,并且收到一条说明消息。
后记
后面我在实际运行中,还加了一些其他功能,比如帮其他人查打卡时间,查其他同事的电话号码等。
这种小项目还是蛮有趣的,我想主要是能直接解决一些生活问题(其实我感觉很多小妹妹加我微信才是我的动力来源)。