基于Python的企业微信审批数据获取及应用研究
2023-09-25柳海燕
柳海燕
(苏州工业园区职业技术学院,江苏 苏州 215123)
0 引言
企业微信应用是腾讯公司微信团队打造的企业通讯与办公工具,目前各行各业的很多业务都在逐渐尝试使用企业微信,比如基于企业微信进行的高等数学教学实践[1],基于企业微信进行的高性能集群监控管理系统建设[2],基于企业微信构建移动智慧校园服务平台等[3]。审批功能是企业微信效率与办公领域的重要应用。目前企业微信内置了请假、报销、费用等多种审批模板,覆盖了企业日常办公需要。如果企业用户觉得系统的模板不足以满足需求,可根据自身的业务需求,自定义审批模板和审批流程。
高效快捷的审批过程,使得企业微信审批功能的使用人数的越来越多,这势必会产生大量的审批数据。虽然企业微信对审批数据提供了导出记录功能,但目前限制单次最多可导出5000条审批记录,若审批记录过多,需分次导出,导出格式为固定的Excel 表格。诸多限制导致系统提供的导出数据通常无法满足大数据时代企业对数据应用的实际需求。文章在此背景下提出了基于Python 和企业微信服务端API获取企业微信审批数据的方法,将获取的数据通过基于Python 的软件开发实现企业微信审批数据机器人消息推送、企业微信审批数据展示页面制作和企业微信审批数据的流转,为企业微信审批数据的获取和实际应用提供了一种解决思路和方法。
1 数据获取
1.1 批量获取审批单号
目前企业微信服务端API 对企业微信审批应用提供的接口和能力包括:获取审批模板详情、提交审批申请、审批申请状态变化回调通知、批量获取审批编号、获取审批申请详情。文章根据本单位实际应用需求,在此主要使用了批量获取审批编号和获取审批详情两个接口。由于获取审批详情需要具体的审批单号为参数,为此可按照流程图1先完成企业微信审批单号获取。
图1 企业微信审批单号获取流程
调用企业微信API 接口的第一步是获取access_token,这相当于创建了一个登录凭证,程序需要依赖于access_token 来鉴权调用者身份。为此,首先需要查询自己企业的企业ID和审批应用的secret 值,然后根据请求地址:https://qyapi.weixin.qq.com/cgibin/gettoken?corpid=ID&corpsecret=SECRET,将ID 替换为企业ID,SECRET 替换为审批应用的secret 值,通过 GET请求方式就可以获取到access_token。为了安全考虑,access_token需要保存在后台。
然后在请求地址:https://qyapi.weixin.qq.com/cgibin/oa/getapprovalinfo? access_token=ACCESS_TOKEN中,将ACCESS_TOKEN 替换为刚才获取到的access_token,通过POST 请求方式就可以批量获取到审批编号。由于此接口一次拉取调用最多拉取100个审批记录,所以如果数据过多,可以通过多次拉取的方式来满足需求,但目前调用频率不能超过600 次/分。根据企业实际应用的需求,可通过参数传递的方式按模板类型、申请人、部门、审批单审批状态等条件进行筛选。文章针对单位实际需求,在Python中将筛选条件封装为变量data,代码如下。
data = {
"starttime": int(time.time()-604800),
"endtime": int(time.time()),
"cursor": cursor,
"size": 100,
"filters": [
#第一个限制条件,只获取所需模板ID 的审批数据
{
"key": "template_id",
"value":"C4RYPCJu****6" # 模板ID
},
#第二个限制条件,只获取已经完成审批流程的审批数据
{
"key": "sp_status",
"value": "2"
}]}
其中,参数starttime代表审批单提交的开始时间,endtime 代表审批单提交的结束时间,均为Unix 时间戳,我们需要根据实际要获取的时间范围进行调整设定。参数cursor 代表分页查询游标。参数size代表一次请求拉取审批单数量,默认值为100,上限值为100。参数filters 代表筛选条件,可对批量拉取的审批申请设置约束条件,支持设置多个条件,本程序对审批模板和审批状态进行了设定。其他具体参数值及其含义可参考腾讯官方文档。接下来,通过Python 中requests 模块的post()方法将携带条件数据data 的POST请求发送到批量获取审批编号的URL 即可。返回结果sp_no_list 是审批单号列表,包含满足条件的所有审批申请的单号。由于每次调用 requests 请求之后,会返回一个 response 对象,该对象包含了具体的响应信息,这样首先通过requests.post(url=url, json=data).json()将返回值赋值给response 变量,然后通过response['sp_no_list']就可获取到审批单号的列表信息。
1.2 获取审批单详情
批量获取了审批单号之后,可以采用循环的方式依次遍历每一个审批单号。如果审批单号已经存在于已有的数据库中则不做处理,遍历下一个审批单号即可。如果审批单号不在已有的数据库中,则将它作为参数,通过地址: https://qyapi.weixin.qq.com/cgi-bin/oa/getapprovaldetail?access_token=ACCESS_TOKEN,以POST请求的方式即可获取到审批单详情。针对审批单详情的返回结果,在Python中,以response['applyer']['userid']的方式可以获取到申请人userid。此时根据申请人的userid,通过请求地址:https://qyapi.weixin.qq.com/cgi-bin/user/get? access_token=ACCESS_TOKEN&userid=USERID,可以以GET 访问方式获取到用户的详细信息,包括姓名、职务、手机号码、座机、性别、邮箱等。采用类似的方法,可以获取申请人部门的详细信息。在审批单详情返回结果中,审批申请数据放在参数apply_data 中,apply_data 的参数contents 包含了审批申请详情,由多个表单控件及其内容组成。contents 的参数ID 表示控件ID,title 表示控件名称,value表示控件值,文章用到的主要控件及其详细参数说明如表1所示。
表1 访客进校申请主要控件及详细参数说明
控件ID即控件在审批模板中的顺序,通过顺序索引结合control 参数即可获取到用户在此控件中填写的实际内容。
在文章中,获取的审批数据来自自建模板“访客进校申请”,如图2所示。
图2 访客进校申请审批模板
以访客进校申请审批模板中的第二个字段为例,该字段以数字控件的方式收集访客电话,那么在Python 中可以通过response['apply_data']['contents'][2]['value']['new_number']这种方式来进行获取。另外需注意,Date 控件的value 参数s_timestamp 返回的是字符串类型的时间戳,所以当需要对外展示的时候要进行格式转换。
2 数据流转
当获取到审批单详情后,可将查询结果通过insert 语句插入数据库中。此时,可将数据库对接到企业公共数据平台[4],这样审批数据就不再是存储在企业微信中的孤立数据。系统整体架构如图3所示。
图3 系统整体架构图
为了把从企业微信服务器获取到的数据存放到自己的数据库服务器,首先根据访客审批申请的模板建立了MySQL数据库和数据表,以实现数据对接。通过pip install PyMySQL安装第三方库PyMySQL用于连接 MySQL 服务器。在Python 应用程序中,封装一个不用写SQL 语句,只需要填参数的工具类Database 用于插入数据。本次主要实现和使用的是数据增加功能,具体Python代码如下:
def insert(self,table_name,value):
sql=f"insert into {table_name} values {value} "
print("mysql语句",sql)
try:
self.__cursor.execute(sql)
self.__conn.commit()
print("插入成功")
except Exception as e:
print("插入失败 ",e)
self.__conn.rollback()
当需要把审批详情数据存放入数据库时,生成Database 类的对象,调用insert 方法,把详情的字段内容作为参数传递即可。
为实现根据企业实际需求完成企业审批数据详情的定时推送功能,文章采用了Python中的轻量级定时任务调度库schedule,通过语句schedule.every(1).minutes.do(spsj)实现每分钟运行一次spsj函数,spsj函数用于生成工具类的对象和相应方法的调用,利用循环加sleep的方式,调用schedule.run_pending() 实现数据定时推动到数据库和群消息机器人。
接下来通过公共数据平台的接口对接,将存储到数据服务器的数据对接到公共数据平台。这时通过公共数据平台,企业可以提供审批数据给不同需求的用户,数据可以以更加灵活的方式得到各方面应用,比如数据展示、数据共享等。
3 群机器人消息推送
企业微信的群机器人,可以通过接口实现在群里发送告警或提醒类的消息通知。人们获取到的审批单详情数据,就可以以群机器人的形式实现消息推送,这样即使不在审批节点中的人也可以查看到审批数据。
3.1 添加群机器人
单击群聊天信息中的添加群机器人,单击新创建一个机器人,填写机器人名称后就可以添加一个机器人到群里。这时在弹出的对话框中,要记好此机器人的Webhook地址。通过这个地址,可实现Webhook协议的自定义接入,实现业务相关通知自动推送到群的功能。
3.2 Markdown消息类型数据设置
企业微信的群机器人支持文本类型、Markdown类型、图文类型和文件类型等多种消息类型。Markdown作为一种简单的标记语法,能使普通的文本具有一定格式[5]。由于审批数据涉及多个字段数据的获取且内容多为数值类型,为使消息醒目和用户容易辨识,文章采用Markdown 消息类型施行审批数据的实时推送。目前企业微信只支持绿色、灰色、橙红色3种内置颜色,实现语法分别是、和,标题根据#的个数支持一至六级标题。在Python中,文章通过如下语句设置审批详情消息的Markdown格式。
MarkDownText = "### 已完成审批单: " "> ### 申请时间: ### 申请人: ### 访客姓名: ### 访客电话: ### 访客所属单位: 访客来访时间:%s" % (sp_name, apply_time, applyer_username ,vist_name_value, vist_name_phone, vist_name_depart,vist_name_date)
其他Markdown 格式类型可结合官方文档,参考本例进行设置。
3.3 消息推送
Markdown 消息的msgtype 参数代表消息类型,是必填项,且值固定为markdown。Markdown消息的content参数代表markdown内容,必须是utf8编码,且内容长度不能超过4 096 个字节。设置好Markdown 消息的内容后,在Python中就可以通过requests模块的post方法进行消息推送,具体代码是requests.post(url=self.webhook, headers=headers, json=data),这里url 表示群机器人的Webhook 地址,headers 代表请求头,json 代表要发送到指定 url 的 JSON 对象,在这里就是Markdown 消息内容。这样结合Python 提供的定时任务模块schedule 和时间模块time,就可以根据企业实际需要完成审批数据详情的实时推送、定时推动等内容。
4 结束语
文章介绍了基于Python 和企业微信服务端API获取企业微信审批数据的方法,将获取到的数据从进行群机器人消息推送、数据汇入公共数据平台参与数据流转等方面研究了企业微信审批数据的应用,为企业微信审批数据的获取和应用提供了一种解决思路和方法。在实际应用中,要结合企业审批流程的实际情况,确定批量获取审批单号的开始时间和结束时间,因为不同企业的不同审批单审批速度有快有慢,从提出申请到审批完毕时间跨度不一,为保障审批数据获取的不重不漏,需要结合企业实际情况进行时间节点的调整。