python实现禅道BUG推送到钉钉

发布时间 2023-08-03 14:48:13作者: 7dao

钉钉通知封装

  pip install DingtalkChatbot  --安装钉钉通知包

  webhook,sign是钉钉机器人的标识

import time
import hmac
import hashlib
import base64
import urllib.parse
from dingtalkchatbot.chatbot import DingtalkChatbot
from utils.datas import data

class DingTalkSendmsg(object):
    def __init__(self):
        self.timestamp = str(round(time.time() * 1000))
        self.sign = self.get_sign()
        self.webhook = 'https://oapi.dingtalk.com/robot/send?access_token='+data['金华出租token']
        self.webhook = self.webhook +'&timestamp='+self.timestamp+'&sign='+self.sign
        self.xiaoding = DingtalkChatbot(self.webhook)

    def get_sign(self):
        secret = data['金华出租屋sign']
        secret_enc = secret.encode('utf-8')
        string_to_sign = '{}\n{}'.format(self.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_markdown(self, title, msg, mobiles=None):

        if not mobiles:
            self.xiaoding.send_markdown(title=title, text=msg, is_at_all=True)
            # self.xiaoding.send_markdown(title=title, text=msg, at_mobiles=['@all'])
        elif isinstance(mobiles, list):
            self.xiaoding.send_markdown(title=title, text=msg, at_mobiles=mobiles)
        else:
            raise TypeError("mobiles类型错误 不是list类型.")

 消息推送

  获取禅道数据,然后通过上面创建的钉钉类推送消息到钉钉

  

from utils.mysql_db import MysqlDB
from utils.DingTalk import DingTalkSendmsg


class Bugs():
    """ bug 日清通知 """


    def get_bugs(self) -> list:
        BUGS = []

        """查询所有项目中未关闭的bug(不包含延期处理)"""
        sql = "select count(a.id) as bugCount, b.realName , c.name, b.mobile from zt_bug as a " \
                  "inner join zt_user as b inner join zt_product as c where a.assignedTo = b.account " \
                  "and a.product = c.id and a.product = '9' and a.deleted = '0' and a.status != 'closed' " \
                  "and resolution != 'postponed'GROUP BY a.assignedTo"

        # 统计出该项目中未关闭的bug对应的负责人,以及未关闭的总数
        bugsCount = MysqlDB().pyodbcSql(sql)
        BUGS.append(bugsCount)
        print(BUGS)
        return BUGS

    def send_Notice_Msg(self):
        """发送钉钉通知@对应的负责人"""
        for bugs in self.get_bugs():
            for i in bugs:
                print(i)
                print(i[0])
                text1 = "#### **禅道处理通知**\n   执   行   人: {0}  \n\n 未处理bug数量: {1} 个 \n\n 所  属  项 目: {2} " \
                        "\n\n[点我查看](http://自己本地url/zentao/bug-browse-9-all-assigntome.html)".format(i[1], i[0], i[2])
                if i[3] != "":
                    # 判断如果禅道中的用户有手机号码,才会@对方
                    DingTalkSendmsg().send_markdown(title="禅道处理通知", msg=text1, mobiles=[i[3]])
                else:
                    DingTalkSendmsg().send_markdown(title="禅道处理通知", msg=text1)


if __name__ == '__main__':
    Bugs().send_Notice_Msg()

  实际效果