使用钉钉机器人将禅道任务,自动发送到钉钉群组

一、为什么要开发这样一个功能?

禅道,是公司用来对项目进行管理的软件,主要是用来对项目任务、产品bug进行追踪和管理.
钉钉,是公司所有员工用来工作沟通的软件

将禅道上面,每个员工工作任务的情况,进行汇总并同步到钉钉群,有助于项目人员及管理人员对项目执行情况快速及时的掌握

下图是最终实现的效果图,钉钉机器人将项目组成员,一周任务完成情况,进行汇总。未完成的任务点击链接可传送到禅道对应的任务页面,进行快速处理

二、实现原理

  • 钉钉的webhook机制
  • 禅道的二次开发API
  • python脚本
  • crontab定时器

钉钉的webhook机制
钉钉的webhook,是可以通过向一个url地址,发送消息,然后钉钉解析之后,会根据消息类型展示不同的样式卡片,而这个url,就是通常我们说的webhook,翻译成中文就是“网络钩子的意思”

添加一个钉钉群组机器人,大概需要以下四步
第一步: 群组中进入群设置

第二步:点击智能助手,进入机器人设置页

第三步:勾选自定义机器人,并进入机器人设置页

第四步:机器人添加设置页

禅道的二级开发api
想要实现我们的效果,需要拿到每个员工的任务列表,而拿到任务列表,需要获取每个员工的编号,禅道里面是用户名。通过用户名获取该用户的所有任务列表。

首先遇到的问题是,
登录问题
禅道是需要进行登录的,登录是要建立会话的,这里使用的session进行会话管理,但是并不是每一个登录用户都可以随意获取别人的任务状态,这里涉及到另外一个问题
权限问题
权限找田新亮,将账户提升为“admin开发者”。

至此禅道api的大体流程就出来了!

  1. 获取禅道sid
  2. 拿到sid与admin开发者权限的账号进行登录
  3. 获取需要汇报任务的成员username
  4. 根据username去获取任务状态,任务状态分为:未开始、进行中、已完成

python脚
python脚本主要是实现,上述所说的禅道获取任务列表,以及将消息发送到webhook的钉钉机器人,代码比较多,这里贴一部分核心代码,主要是禅道的登录与任务列表的获取
禅道登录与任务列表获取核心代码

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
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
class Zentao_cli(object):
session = None # 用于实现单例类,避免多次申请sessionID
sid = None

def __init__(self, url, account, password, override=False):
self.url = url
self.account = account # 账号
self.password = password # 密码
self.session_override = override # 是否覆盖原会话
self.pages = {
"sid": "/api-getsessionid.json", # 获取sid的接口
"login": "/user-login.json?account={0}&password={1}&zentaosid={2}", # 登录的接口
"get_story_list_by_projectID": "/index.php?t=json&m=story&f=ajaxGetProjectStories&projectID={0}",
"get_task_list_by_account": "/task-ajaxGetUserTasks-{0}-1-{1}.json",
# "get_task_list_by_account": "/user-view-chengyan.json",
"get_story_list_by_account": "/index.php?"
}
self.s = None
self.sid = None

def req(self, url):
# 请求并返回结果
print(url)
web = self.s.get(url)

print(web.content)
if web.status_code == 200:
resp = json.loads(web.content)
if resp.get("status") == "success":
return True, resp
else:
return False, resp

def login(self):
if self.s is None:
if not self.session_override and Zentao_cli.session is not None:
self.s = Zentao_cli.session
self.sid = Zentao_cli.sid
else:
# 新建会话
self.s = requests.session()
res, resp = self.req(self.url.rstrip("/") + self.pages["sid"])
if res:
print("获取sessionID成功")
self.sid = json.loads(resp["data"])["sessionID"]
Zentao_cli.sid = self.sid
login_res, login_resp = self.req(
self.url.rstrip("/") + self.pages["login"].format(self.account, self.password, self.sid))
if login_res:
print("登录成功")
Zentao_cli.session = self.s

crontab定时器
作为一个机器人,肯定是需要自己去做一些事情,我们脚本开发完成之后,肯定不能再去浪费时间去手动操作了,那么在macos或linux系统里面,需要用到crontab 定时去执行我们的脚本,我这里设置的时间是每周六的下午5.30分,去定时跑一下脚本,然后就会发消息到钉钉群了
crontab的写法比较简单,下面是我这次用到的写法

1
30 17 * * 6  /Users/chengyan/Desktop/quanqiuwa/zandaoPlugin/main.py>>/Users/chengyan/Desktop/quanqiuwa/zanDaoPlugin/zandaoPlugin.log 2>&1

三、后续计划与改进

  1. @未完成任务小伙伴
    群组消息太多,可能会有小伙伴将群设置为勿扰模式,那么针对没有完成任务的小伙伴,当然很多时候,并不是真的没有完成任务,而是忘了修改禅道任务的状态,考虑添加一个功能是:有未完成任务的小伙伴,会去主动的@一下

  2. 禅道bug未解决情况汇总
    禅道还支持,获取未完成bug的列表拉去,这个目前不是很紧急,等项目不忙的时候,可以搞起来

四、小结
做这个功能的出发点是利用自己所掌握的知识做一些效能提高方面的事情,总的来说还是希望在人工智能时代,将一些非人工的事情,让机器去做,节省人力成本,后续如果有希望帮助的小伙伴,可以随时钉钉联系我,一起为公司的发展、壮大添砖加瓦。

使用钉钉机器人将禅道任务,自动发送到钉钉群组

http://example.com/2020/12/15/使用钉钉机器人将禅道任务,自动发送到钉钉群组/

作者

火三

发布于

2020-12-15

更新于

2024-04-21

许可协议