禅道bug同步到飞书

主要分成两大部分

1.在飞书开发者后台开发一个可以给用户发送消息的应用,如果需要把消息同步到群组还需要开启一个群组机器人(很简单)
2.查询禅道数据库,编辑消息发送给应用机器人或者群组机器人

1.创建飞书应用,开启应用机器人(群组机器人很简单就不在这里写了)

  • 在飞书工作台点击创建应用
    在这里插入图片描述
  • 进入飞书后台点击创建应用

在这里插入图片描述

  • 点创建企业自建应用

在这里插入图片描述

  • 输入应用名称及描述,然后创建
  • 点击刚刚创建好的应用

在这里插入图片描述
需要操作的步骤

  1. 编辑应用基本信息(主要是上传头像,不上传不让上线)
  2. 开启应用机器人
    在这里插入图片描述
  3. 获取对应的权限
    在这里插入图片描述
    在这里插入图片描述
    主要是这几个权限

通过应用发送消息的步骤
就是先要获取应用的token
然后拿着token去发送消息
这两个步骤在api调试里面都有

入口在这里 找到自己需要调控的api
在这里插入图片描述

在这里插入图片描述
请求体里面的内容在应用的凭证和基础信息里面有
粘贴过来就好了,访问地址直接复制到你的发送代码里面就可以了
主要用的api有两个

  1. 通过手机号获取user_id在这里插入图片描述

  2. 通过use_id发送消息在这里插入图片描述

2.查询禅道数据库,然后吧数据发送给机器人

直接上脚本吧(我这里是直接用shell写的,解析在注释里面)

#!/bin/bash

HOST_NAME='127.0.0.1'
DB_PORT='3306'
DB_NAME='zentao'
USER_NAME='***'
PASSWD='***'
tmpFile=/***.txt
#因为接口返回的值都是json 这里写一个解析json的方法,方便我们直接取出想要的值
#解析json方法
getJsonValuesByAwk() {
    awk -v json="$1" -v key="$2" -v defaultValue="$3" 'BEGIN{
        foundKeyCount = 0
        while (length(json) > 0) {
            # pos = index(json, "\""key"\""); ## 这行更快一些,但是如果有value是字符串,且刚好与要查找的key相同,会被误认为是key而导致值获取错误
            pos = match(json, "\""key"\"[ \\t]*?:[ \\t]*");
            if (pos == 0) {if (foundKeyCount == 0) {print defaultValue;} exit 0;}

            ++foundKeyCount;
            start = 0; stop = 0; layer = 0;
            for (i = pos + length(key) + 1; i <= length(json); ++i) {
                lastChar = substr(json, i - 1, 1)
                currChar = substr(json, i, 1)

                if (start <= 0) {
                    if (lastChar == ":") {
                        start = currChar == " " ? i + 1: i;
                        if (currChar == "{" || currChar == "[") {
                            layer = 1;
                        }
                    }
                } else {
                    if (currChar == "{" || currChar == "[") {
                        ++layer;
                    }
                    if (currChar == "}" || currChar == "]") {
                        --layer;
                    }
                    if ((currChar == "," || currChar == "}" || currChar == "]") && layer <= 0) {
                        stop = currChar == "," ? i : i + 1 + layer;
                        break;
                    }
                }
            }

            if (start <= 0 || stop <= 0 || start > length(json) || stop > length(json) || start >= stop) {
                if (foundKeyCount == 0) {print defaultValue;} exit 0;
            } else {
                print substr(json, start, stop - start);
            }

            json = substr(json, stop + 1, length(json) - stop)
        }
    }'
}

#==获取token 直接把上面获取token对应的请求头请求体 和url粘贴过来就可以了
tokenUrl='https://open.feishu.cn/open-apis/auth/v3/tenant_access_token/internal'
headers='Content-Type:application/json'
#应用信息
data='{"app_id": "cli_********","app_secret":"*************"}'
tokenResult=`curl -s ${tokenUrl} -X POST  -H "${headers}" -d "${data}"`
#解析token
token=`getJsonValuesByAwk ${tokenResult} tenant_access_token defaultValue|sed 's/\"//g'`
#echo ${token}"*******"

#查询禅道数据库 把最近一分钟的数据查出来,最后的时间是因为数据库所在服务器没有配置时区,和们数据保存的时间不同步,做了一下特殊处理,两边一致就可以
# 把数据写到一个文件里
echo "SELECT b.id , b.title, b.severity, b.pri, u.realname, u1.realname as openName, u.mobile FROM zt_bug b LEFT JOIN zt_user u ON b.assignedTo = u.account LEFT JOIN zt_user u1 ON b.openedBy = u1.account  WHERE b.status like '%active%' and b.assignedDate between date_add(now(), interval +479 minute) and date_add(now(), interval +480 minute) " | mysql -h${HOST_NAME} -P${DB_PORT} -u${USER_NAME} -p${PASSWD} --skip-column-names  ${DB_NAME} > ${tmpFile}

#设置read 命令分隔符
IFS=$'\t\n'  

cat ${tmpFile}|while read line || [[ -n ${line} ]]
do
        array=($line)
        id=${array[0]}
        title=${array[1]}
        severity=${array[2]}
        pri=${array[3]}
        realname=${array[4]}
        openName=${array[5]}
        mobile=${array[6]}
        #这里写了个正则,判断手机号是否正确 如果没有手机号的话就发送到群里面
        if [[ "${mobile}" =~ ^(\+86|\+86\-)?1[3-9][0-9]{9}$ ]]
        # if [ ! -z ${mobile} ] -o [ "${mobile}" =~ ^1[3-9][0-9]{9}$ ]
        then
            #手机号不为空发消息给个人 (请求url 请求体,请求头直接在飞书api后台粘贴就好了)
            #获取用户id
            userurl='https://open.feishu.cn/open-apis/contact/v3/users/batch_get_id?user_id_type=open_id'
            tokenHeaders='Authorization:bearer '${token}
            #echo ${tokenHeaders}
            mobilesData='{"mobiles": ["'${mobile}'"]}'
            userResult=`curl -s "${userurl}" -X POST -H "${headers}" -H "${tokenHeaders}" -d "${mobilesData}"`
            #echo ${userResult}"=========="
            userId=`getJsonValuesByAwk ${userResult} user_id defaultValue|sed 's/\"//g'`
            
            #echo 'userId='${userId}
            
            #把数据发送出去 (请求url 请求体,请求头直接在飞书api后台粘贴就好了)
            bugUrl='http://cd.luokung.com/bug-view-'${id}'.html'
            userMsgBody='\\n标题:'${title}'\\nBUG_ID:'${id}'\\n接收人:'${realname}'\\n发起人:'${openName}'\\n地址:'${bugUrl}
            userMsgText='<at user_id=\\\"'${userId}'\\\"></at>'${userMsgBody}
            userMsg='{"receive_id": "'${userId}'","msg_type": "text","content": "{\"text\":\"'${userMsgText}'\"}"}'
            sendUserUrl='https://open.feishu.cn/open-apis/im/v1/messages?receive_id_type=open_id'
            `curl -s "${sendUserUrl}" -X POST  -H "${headers}" -H "${tokenHeaders}" -d "${userMsg}" >/dev/null  2>&1`
        else
            #手机号为空发消息到群 url 为飞书群组机器人的hook地址
            bugUrl='http://cd.luokung.com/bug-view-'${id}'.html'
            chatMsgBody='\\n标题:'${title}'\\nBUG_ID:'${id}'\\n接收人:'${realname}'\\n发起人:'${openName}'\\n地址:'${bugUrl}
            #https://open.feishu.cn/open-apis/bot/v2/hook/***********
            chatMsgText='<at user_id=\\\"all\\\"></at>'${chatMsgBody}
            chatMsg='{"msg_type": "text","content": "{\"text\":\"'${chatMsgText}'\"}"}'
            sendChatUrl='https://open.feishu.cn/open-apis/bot/v2/hook/49190eb2-f238-486b-9caf-84b3b7be51fa'
            `curl -s "${sendChatUrl}" -X POST  -H "${headers}" -H "${tokenHeaders}" -d "${chatMsg}" >/dev/null  2>&1`
        fi	
done

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
在使用Python提督道(Pythonic)地解决bug时,我们遵循一些原则和实践来提高代码的可读性、可维护性和可扩展性。 首先,我们应尽可能使用Python的内置函数和库来解决问题,而不是重复造轮子。Python提供了许多功能强大的内置函数和模块,如`os`、`sys`、`re`等,它们提供了许多用于处理文件、系统、正则表达式等常见任务的函数。同时,Python还提供了许多标准库,如`datetime`、`json`等,它们提供了处理日期时间、JSON等常见任务的函数和类。因此,在解决bug时,我们应首先查看Python官方文档,探索是否有现成的解决方案可用。 其次,我们应充分利用Python的异常处理机制来捕获和处理bug。Python提供了`try-except`结构,它能够捕获代码中可能出现的错误并进行相应的处理。在处理bug时,我们应该使用`try-except`块来尽量捕获并处理异常,以避免程序崩溃或产生不可预测的结果。同时,我们还可以使用`finally`关键字来确保无论是否发生异常,都能执行必要的清理工作。 此外,Python还支持面向对象编程(OOP),我们可以使用类和对象来组织和封装代码,以提高代码的可重用性和可维护性。在解决bug时,我们可以使用OOP的思想来设计和实现自定义的异常类、封装复杂逻辑的类等,以提高代码的可读性和扩展性。 最后,为了尽量避免和减少bug的产生,我们应遵循一些良好的编码风格和规范,如PEP 8,它提供了Python编码的指导原则。良好的编码风格和规范能够使我们的代码更加整洁、易读,并减少潜在的bug。同时,我们还可以使用一些静态代码分析工具来检测常见的错误和潜在的问题,如PyLint、Flake8等。 总之,使用Python提bug意味着我们要充分利用Python的内置函数和模块、异常处理机制、面向对象编程等特性,同时遵循良好的编码风格和规范,以提高代码的质量和可维护性,从而高效地解决bug
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值