1、背景
用户需求每个月提供其数据库AWR报告一份,考虑到后面自动化运维也有发文件到飞书群组的需求,索性接着机会实践一下
注意:笔者并非专职开发,代码搬运工一枚,借助GPT缝缝补补,不过还好最后实现这个功能。
2、设计思路
首先定时生成AWR报告,鉴于生产环境避免创建脚本,所以需要在运维环境远程连接该数据库并生成对应AWR报告,使用shell脚本即可。
而后就是关于飞书如何确认群聊,发送该文件。
3、功能实现
3.1 自动生成AWR报告
shell脚本如下

3.2 飞书转发文件
这里因为之前实现过使用webhook转发告警到飞书机器人,所以了解一点飞书开放平台。
关于文件发送,飞书自定义机器人实现不了。查阅飞书开放平台文档,服务端API分类处查询
上传文件 - 服务端 API - 开发文档 - 飞书开放平台 (feishu.cn)


可以看到支持的文件类型如上,我们要上传的文件未html文件不在支持类型中,但是没关系,可以用stream类型试试看。
OK,现在重新梳理下思路:
首先AWR的html文件我们已经有简单脚本生成了,接下来通过飞书的API将文件上传至飞书开放平台,后面可以配置机器人转发到群里面。
接下来就是功能的实现:
3.2.1 飞书开放平台申请线上应用及权限

申请权限

必备权限:
- 上传文件
- 读取群信息
- 获取群组信息
- 获取与上传图片或文件资源
- 获取与发送单聊、群组消息
注意这里在选择批量开通后,需要将应用发布出去才能到审核流程,当然如果你的账号权限够高可以忽略本操作。
在新建的应用中添加应用能力,新增机器人能力


3.2.2 凭证与基础信息获取
APP ID及APP SECRET后面会使用到

3.2.3 代码设计
这里参考这位大佬的博客
python调用飞书机器人发送文件-CSDN博客
功能1:获取token,这个token通过上面APPID和Secret获取,后面在上传文件及获取群信息都需要使用到

功能2:文件上传,将文件上传至飞书开放平台

这个方法返回的media_id就是后面发送文件功能的file_key,总体来说就是我们将文件发送到飞书开放平台,飞书平台会给我们返回一个file_key通过这个进一步将文件发送出去。
这里文件名配置的比较暴力,直接将文件绝对路径放上去了,因为需求的报告周期为一个月,那么每次生成同名报告就行了,加上获取AWR的脚本第一步是删除这个文件,保证了文件都是最新的。
值得注意的就是file_type,这里需要选择stream的方式。
功能3:获取群chatid,这个功能就是为了后面在推送文件时,确定推送到哪个群
这里要注意下,我们首先需要在对应的群里添加我们的应用,同时记录群聊的名称


这个方法会返回,这个应用所在的所有群聊信息,get_by_name是为了后面通过群聊名称获取指定群chatid
功能4:发送文件
这里主要是使用了file_key和token,file_key确认文件,token做安全验证

至此功能齐全。主函数如下

4、功能测试

OK,配置定时任务,完成需求
5、注意事项
- 权限一定要申请全,不然会出现各种各样的问题
- 获取群chatid部分,要提前将应用放到群里
- python3.6 安装requests_toolbelt这个包会报错,更换一下安装源比如豆瓣或某个大学的源




