原创

actionview绑定钉钉机器人

actionview是一个面向中小企业的、开源免费的、简单易用的、类Jira的问题需求跟踪工具。安装actionview的过程自行查找,actionview自带了webhook功能,但是没有适配钉钉机器人。actionview接入钉钉机器人的思路就是写一个web服务,通过actionview的webhook功能调用web服务的接口,通过web服务再调用钉钉机器人。
先看效果:
在这里插入图片描述

实现的功能如下:

  • 点击通知中的项目名称跳转到actionview面板
  • 问题打开时@分配人
  • 问题解决时@报告人

    一、建立钉钉机器人调用服务

    新建一个python文件,这里用了flask框架代码如下:
import requests as send
from flask import Flask
from flask import request
from flask import Flask
from flask import jsonify
import json
import time
import hmac
import hashlib
import base64
import urllib.parse

app = Flask(__name__)
#钉钉注册人的名字和手机号码
user_dict = {
    "张三": "187xxxxxxxx",
    "李四": "176xxxxxxxx",
}

event_dict = {
  "create_issue": '创建问题',
  "del_issue": '删除问题',
  "close_issue": '关闭问题',
  "add_worklog": '添加工作日志',
  "create_version": '创建版本',
  "release_version": '发布版本',
  "del_version": '删除版本',
  "merge_version": '合并版本',
  "edit_version": '编辑版本',
  "edit_worklog": '编辑工作日志',
  "reopen_issue": '重新打开问题',
  "resolve_issue": '解决问题',
  "edit_issue": '编辑问题'
}

state_dict ={
    "Open":'打开',
    "Closed":'关闭',
    "Resolved":'已解决',
    "Reopened":'重新打开',
}
#钉钉机器人的加签秘钥
secret = "SECe31bae28035fa3f633a580f12d53d582c815bdd0465xxxxxxxxxxxxxxxx"
#钉钉机器人的token
access_token = "525a0f16a91db7993bb4835842fbcf8ad1b0768ead4bbxxxxxxxxxxxxx"


def create_sign(timestamp):
    secret_enc = secret.encode('utf-8')
    string_to_sign = '{}\n{}'.format(timestamp, secret)
    string_to_sign_enc = string_to_sign.encode('utf-8')
    hmac_code = hmac.new(secret_enc, string_to_sign_enc, digestmod=hashlib.sha256).digest()
    sign = urllib.parse.quote_plus(base64.b64encode(hmac_code))
    return sign

def send_post(request_data):
    timestamp = str(round(time.time() * 1000))
    sign = create_sign(timestamp)
    headers = {
        'Content-Type': 'application/json'
    }
    api_url = "https://oapi.dingtalk.com/robot/send?access_token="+ access_token +"&timestamp="+timestamp+"&sign="+sign
    reps = send.post(url=api_url, data=json.dumps(
        request_data), headers=headers)


@app.route('/send/dingtalk', methods=['POST'])
def hello_world():
    if not request.data:  # 检测是否有数据
        return ('fail')
    data_ = request.data.decode('utf-8')
    data = json.loads(data_)
    project = data["project_key"]
    event = event_dict[data["event"]]
    title = data["title"]
    labels = data["labels"] if 'labels' in data else []
    reporter = data["reporter"]["name"] if 'reporter' in data else ''
    modifier = data["modifier"]["name"] if 'modifer' in data else ''
    assignee = data["assignee"]["name"] if 'assignee' in data else ''
    at_assignee = ("@" + user_dict[assignee]) if (assignee in user_dict) else assignee
    at_reportor = ("@" + user_dict[reporter]) if (reporter in user_dict) else reporter
    assignee_text = at_assignee if data["state"] =='Reopened' or data["state"] =='Open' else assignee 
    reportor_text = at_reportor if data["state"] =='Resolved' else reporter
    no = data["no"]
    state = state_dict[data["state"]] if data["state"] in state_dict else data["state"]
    message = (
        "#### ActionView通知: \n "
        "> 项目:["+project +"](http://jira.hl.bd/actionview/project/"+project+"/issue)  \n  "
        "问题:**"+title+"**  \n  "
        "问题编号:"+str(no)+"  \n  "
        "操作:**"+event+"**  \n  "
        "分配给:"+assignee_text+"  \n  "
        "报告人:"+reportor_text+"  \n  "
        "修改人:"+modifier+"  \n  "
        "状态:**"+state+"**  \n  "
        "  \n"
    )
    text = {
        "msgtype": "markdown",
        "markdown": {
            "title": "ActionView通知:",
            "text": message
        },
        "at": {
            "atMobiles": [
                 user_dict[assignee] if (assignee in user_dict) else '',
                 user_dict[reporter] if (reporter in user_dict) else '',
            ],
            "isAtAll": False
        }
    }
    send_post(text)
    return 'ok'

if __name__ == '__main__':
    # app.run(host, port, debug, options)
    # 默认值:host="127.0.0.1", port=5000, debug=False
    app.run(host="0.0.0.0", port=80)

二、新建钉钉机器人

点击群聊右上角的设置按钮打开智能群助手
在这里插入图片描述
添加一个自定义机器人
在这里插入图片描述

1.钉钉机器人的加签秘钥主要是做安全验证,将上面代码中的secret 变量改为获取到的秘钥,获取方式如下:
在这里插入图片描述
2.将上面代码中的access_token改为自己机器人的token,token获取方式如下:
在这里插入图片描述

三、actionview配置webhook

使用管理员账号建完项目后,新建webhook
在这里插入图片描述
在这里插入图片描述
url地址填为flask项目中的地址,上述代码中的用的是/send/dingtalk,所以这里就填http://127.0.0.1:80/send/dingtalk

注意事项

actonview注册的用户名要和钉钉中的用户名字一样,不然无法@

正文到此结束