禅道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
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值