如何用Python实现微信自动签到功能

Python041

如何用Python实现微信自动签到功能,第1张

题主的签到模式是什么样子的?

一般来说分三种:

* 给公众号发送特定文字

* 普通的网页点击

* 授权的网页点击

我这里给出前两种的解决方案。

普通的网页点击:

1. 建议通过浏览器或者Wireshark分析消息的交互。

2. 之后通过requests模拟。

由于没有具体的网址,我没有办法给出具体的代码。

给公众号发送特定的问题:

1. 建议使用Python的微信API(pip install itchat)

2. 由于没有提供Python版本,我这里给出兼容的解决方案

#coding=utf8

import threading

import itchat

SIGN_IN_MP_DICT = {

u'学校微信公众号': u'学校签到口令',

u'公司微信公众号': u'公司签到口令', }

def get_day(timeGap):

return int(time.strftime('%y%m%d', time.localtime(time.time() + timeGap)))

NEXT_SIGN_DATE = get_day(60*60*24)

def sign_in_thread():

''' 签到线程

如果尚未到需要签到的日期,则继续循环

如果到了需要签到的日期,则完成两个公众号的签到,并更新日期

'''

while 1:

if get_day <NEXT_SIGN_DATE:

time.sleep(30)

else:

for k, v in SIGN_IN_MP_DICT.items():

itchat.send(msg=v,

toUserName=itchat.search_mps(name=k)[0]['UserName'])

NEXT_SIGN_DATE = get_day(60*60*24)

itchat.auto_login(True)

# 测试是否存在特定公众号

for mpName in SIGN_IN_MP_DICT.keys():

mpList = itchat.search_mps(name=mpName)

if len(mpList) != 1:

print(u'没有检测到公众号“%s”,请检查名称')

break

else:

signInThread = threading.Thread(target=sign_in_thread)

signInThread.setDaemon(True)

signInThread.start()

itchat.run()

#输入帐号

browser.find_element_by_xpath('//input[@name="empcode"]').send_keys('帐号')

#输入密码

browser.find_element_by_xpath('//input[@class="pass-word"]').send_keys('密码')

#点击签到

browser.find_element_by_xpath('//span[@class="kq-onwork"]').click()

新冠疫情期间,大多数公司为了避免交叉感染都或多或少的采用了远程办公的方式,这显然是一个明智的选择,基本上钉钉(dingding)作为一个远程办公平台来用的话,虽然差强人意,但是奈何市面上没有啥更好的选择,矬子里拔将军,也还是可以凑合用的,不过远程办公有个问题,就是每天需要检查员工的考勤,居家办公虽然灵活,但是大家究竟有没有办公,则是另外一回事,钉钉提供的解决方案就是考勤在线打卡功能,但是检查出勤钉钉在移动端就有点费劲,需要在钉钉app里点击至少5次,还不能实时刷新,pc端的钉钉oa系统做的更烂,还不如移动端来得方便,另外如果你在一家上千人的企业里,这家企业有大大小小几十个部门,你又非常倒霉的担任这家公司的人事主管,每天按部门来出员工考勤报表就不是一件容易事了,所以利用钉钉开放的接口,使用Django自己打造一套实时监控员工考勤的web平台是我们本次的目的。

项目背景是一家普通科技公司,大概有五个部门,每个部门100人左右

首先进入钉钉开放平台 :open-dev.dingtalk.com

在企业内部开发中,选择小程序,新建一个小程序应用,这里其实也还有别的选择,比如h5微应用,主要是小程序兼容性更好一点。

填写应用的名称、简介、Logo等基本信息这些按下不表,按照要求填写即可,也不必非得填写真实信息,这里有个坑就是一定不要忘了配置安全域名或者ip,安全域名是当我们的检测平台上线的时候部署的域名,应用可以跟指定的域名进行网络通信,如果不配置的话,请求钉钉接口会报403错误。

另外还有一个坑,也就是钉钉默认开放的接口仅限于基础权限接口

如果需要考勤或者签到接口的话,还得单独点击申请,这就有点让人看不懂了,那么多接口,全都得靠用鼠标点击开通,不开通就用不了,这个用户体验真是让人非常酸爽,产品设计成这样,钉钉的pm难辞其咎。

OK,前置准备工作就已经就绪了,现在我们只要根据官方文档来写接口就可以了,选择服务端api文档: https://ding-doc.dingtalk.com/doc#/serverapi2/gh60vz

钉钉考勤打卡的接口说明是这样的:

这里每个接口都需要一个access_token用来鉴权,这个token是用id和秘钥通过接口交换回来的,具体在应用详情里可以获取

这里我们封装成方法

搞定了token,还需要获取您的部门下所有员工的员工id,因为考勤接口参数只能接受员工id,而非部门id

最后请求考勤接口即可

完整的后台Django后台接口

这样,就可以愉快的通过线上平台来实时监测部门员工考勤了,效果是这样的: