• 禅道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='"'${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='"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
    
    
    • 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
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87
    • 88
    • 89
    • 90
    • 91
    • 92
    • 93
    • 94
    • 95
    • 96
    • 97
    • 98
    • 99
    • 100
    • 101
    • 102
    • 103
    • 104
    • 105
    • 106
    • 107
    • 108
    • 109
    • 110
    • 111
    • 112
    • 113
    • 114
    • 115
    • 116
    • 117
    • 118
  • 相关阅读:
    Python数据分析与机器学习2-Numpy
    ESP32 Arduino实战基础篇-使用中断和定时器
    C语言常识
    kafka 3.5 主题分区ISR伸缩源码
    Java进阶指南:高级面试问题与精辟解答(四)
    Python使用openpyxl和pandas处理Excel文件实现数据脱敏案例一则
    Linux如何安装Maven?
    异常(exception)
    ffmpeg v4l2集成分析
    C++ 多线程(包含linux) cmake
  • 原文地址:https://blog.csdn.net/weixin_44742962/article/details/127693047