微信机器人和 Redmine 整合能做些什么?

概述

公司使用 Redmine 作为项目管理工具,同时使用微信群进行工作交流。日常管理中会有一些需求,但是需要打通微信和 Redmine 之间数据交互才能完成。下面我来介绍下,目前已经完成的功能。

依赖环境

  • Redmine

    是一个网页界面的项目管理与缺陷跟踪管理系统的自由及开放源代码软件工具。它集成了项目管理所需的各项功能:日历、燃尽图和甘特图 以协助可视化表现项目与时间限制,问题跟踪和版本控制。此外,Redmine 也可以同时处理多个项目。

  • Python
  • itChat

    是一个开源的微信个人号接口,使用 python 调用微信从未如此简单。

  • python-redmine

    is a library for communicating with a Redmine project management application.

整合的功能

微信群每天的工作汇报检查

目的

部门有一个微信群,要求每个员工在工作日 9:00 之前汇报自己当天的任务安排。而且汇报任务时,必须 @自己的领导。由于人数较多,检查谁没有发送会比较困难,所以想通过机器人来解决。

实现

  1. 使用 itchat 的消息监听,获取部门微信群的聊天记录
  2. 使用 peewee 将聊天记录存储到数据库中
  3. 使用 schedule 运行启动线程,每天 10:00 运行
  4. 从数据库查询当天 0:00~10:00 的微信群聊天记录,包含 @ 并以组员分组,得到当天 已汇报的人员列表
  5. 使用 itchat.search_chatrooms() 获取部门群
  6. 从部门群获取所有成员 MemberList = rooms[0].get('MemberList')
  7. 分别判断组员是否在 已汇报人员列表 中,不在的,记录到 未汇报结果
  8. 未汇报结果 发送给指定人员或微信群

微信聊天记录汇总到 Redmine

目的

每个项目都会有一个或多个对应的微信群,这些微信群中的聊天记录很多都是有价值的,需要保留的。但是现在的微信群是无法长时间保存历史信息的。同时,每个项目在 Redmine 中都会有对应的 Issue,如果能将微信群和 Issue 对应起来,那么对于后续项目推进,项目背景了解,定制开发等都会有很大帮助。

约束

  • 微信群名称风格要统一,如:群名称 #issueId, 测试群 #1234

实现

  1. 保存微信群聊天记录到数据库(和上面一样不再累述)
  2. 每天 23 点,从数据库查询当天的所有聊天记录,并以微信群名称分组
  3. 分别汇总每个微信群的聊天记录(注意按时间排序)
  4. 从群名称中获取 issueId
  5. 使用 redmine.issue.update 将聊天记录更新到对应的 Issue

Redmine 未完成工作提醒

目的

Redmine 中每个人都被分派了很多任务,时间久了,会忘记这些任务,导致有些任务没有执行或者执行后没有关闭。

实现

  1. 从微信群获取所有组员
  2. 根据组员姓名到 Redmine 查询组员在 Redmine 中的唯一 ID(redmine.user.filter
  3. 根据组员 Id 到 Redmine 查询未完成的 issues(redmine.issue.filter
  4. 合并所有待完成的任务信息
  5. 使用微信发送任务给指定组员

Redmine 工时未填写提醒

目的

公司要求所有员工,在每天下班之前,填写好自己的工作日志。但是因为各种情况,出差、加班、忘记了等会导致日志填写不准确。

实现

  1. 从微信群获取所有组员,并根据组员姓名获取在 Redmine 的 Id
  2. 获取待检查的日期,可以设定为最近 7 天,内的工作日
  3. 使用 redmine.time_entry.filter 查询每个员工在指定日期的工作日志
  4. 判断一天内的工时总数是否 > 7.5,不满足则记录到检查结果中
  5. 汇总所有员工的检查结果
  6. 发送检查结果到微信群

效果

结语

其实这些功能的实现并没有很高的技术含量,我做的不过是写写代码。很佩服我的 leader 能想到可以这么去做。

FAQ

记录一些我觉得容易出错问题吧,如果能帮到你们,那最好了。

使用 pip install peewee 出现权限问题,无法安装

我的开发环境是 Mac,系统有默认的 Python 环境。出现上述问题后,我使用 sudo pip install peewee,可以安装。但是后续运行脚本时,提示无法找到 peewee 模块。
后面我查了一下,大家推荐的方式是,安装virtualenvs英语不好的点这里
再啰嗦一句,退出虚拟环境后,再次进入的方法是: source / 你的虚拟环境目录 / bin/activate

1
2
MacBook-Pro:Documents corning$ source ~/pyvirs/wxrobot/bin/activate
(wxrobot) MacBook-Pro:Documents corning$

微信群是中文名时,调用 itchat.search_chatrooms(name='中文') 会报错

解决方法是,转换中文名为 unicode 编码,如:itchat.search_chatrooms(name=u'中文')

Redmine 中根据姓名查询用户时,可以根据姓名全称查询,但是姓和名之间要有空格

1
2
3
name = u'张三丰'
filterName = name[0] + "" + name[1:len(name)]
users = redmine.user.filter(name=filterName, status=1)

下面是官方文档的参数说明,怪我看的不仔细😢

name (string) – (optional). Filter users on their login, firstname, lastname and mail. If the pattern contains a space, it will also return users whose firstname match the first word or lastname match the second word.

itChat 中的 UserNameDisplayNameNickName 具体是什么?

  • UserName

    用户或微信群在微信中的唯一 ID,可以通过次 Id 发送消息等
    一般如:@@absdeeddvvvffss

  • DisplayName

    微信显示的名称

  • NickName

    群昵称