事件起因
近期因为经常忘记录入绩效任务,所以做了一个绩效提醒的定时任务,工作日每天下午五点半群机器人在指定群发送绩效填报提醒的消息,包含当天的天气、日期、绩效系统链接等,实现效果如下:(不过不是本篇重点)
获得灵感
这两天觉得群机器人实现的功能太过单调,因此想要增加一些任务的提醒,无独有偶,在少数派网站发现了这篇文章通用状态监控通知脚本,订阅状态通知
在看完这篇文章之后,感觉可以进行实现,因为都是用的禅道,虽然版本可能存在差别,但思路都是通用的,影响比较小。
具体实现
总体实现分为以下几部分:
1.查看禅道:首先要确定好要请求禅道的哪个接口,因为要获取指派 bug 的数据,因此选择了/my-bug-assignedTo.html 这个接口,这个接口会返回指派给当前用户的 bug 信息,要获取的就是这部分内容:
接口请求头中需要注意 cookie 要获取用户的 id:
2.获取数据:python 代码如果要实现发送请求,获取响应内容还是比较简单的,这块也没有问题
3.发送消息:发送消息选择了企业微信的群机器人,也可以选择其他的消息推送,比如微信可以用 server 酱
4.定时任务:定时任务的实现主要用了 Jenkins,最近在本地虚拟机上部署了 Jenkins,刚好用一下
至此,整体思路已经完善,可以上手编写代码了,具体代码内容如下:
import time
from datetime import datetime
from bs4 import BeautifulSoup
import json
user_data = (
('zentaosid1', 'user1', 'phone_number1'),
('zentaosid2', 'user2', 'phone_number2')
)
# 获取禅道数据
def get_zenbug(zentaosid):
url = "http://zentao12.demo.haogs.cn/my-bug-assignedTo.html"
# 请求头
headers = {
"Accept":"text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7",
"Cookie":f"zentaosid={zentaosid}",
"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/115.0.0.0 Safari/537.36 Edg/115.0.1901.183"
}
response = requests.get(url,headers=headers)
# 获取响应的html
texthtml = response.text
soup = BeautifulSoup(texthtml, 'html.parser')
selected_elements = soup.select('span[class="label label-light label-badge"]')
bugcount = selected_elements[0].text
return bugcount
# 企业微信发送消息
def send_message(webhook_url, message, user, phone_number):
data = {
"msgtype": "text",
"text": {
"content": message,
"mentioned_list":[f"{user}"],
"mentioned_mobile_list":[f"{phone_number}"]
}
}
response = requests.post(webhook_url, json=data)
if response.status_code == 200:
print("消息发送成功")
else:
print("消息发送失败")
if __name__ == "__main__":
webhook_url = "webhook_url"
# 使用循环提取数据
for user in user_data_list:
zentaosid = user[0]
user = user[1]
phone_number = user[2]
bugcount = get_zenbug(zentaosid)
bugcount = int(bugcount)
print(bugcount)
if bugcount > 0:
message = f"禅道有未关闭bug{bugcount}个,请及时关闭"
send_message(webhook_url, message, user, phone_number)
else:
print("暂无禅道bug")
本地执行成功后,把文件上传到虚拟机的指定目录:
设置文件的权限:
Jenkins 创建任务:
企业微信最终效果:
后续扩展
多人提醒
当前的多人提醒是写在代码的元组中,如果有多个人的话,可以考虑使用 excel 进行读取
丰富内容
获取到禅道 bug 的标题,提醒的时候把 bug 标题附带上,超过固定长度省略后续内容
获取到禅道 bug 的 id,把固定的 URL 和 id 拼接,提醒的时候附带链接,如下
https://zentao12.demo.haogs.cn/bug-view-bugid.html