首页 > 其他分享 >钉钉机器人 自动化发版

钉钉机器人 自动化发版

时间:2024-12-20 12:10:37浏览次数:4  
标签:ding dingtalk app 机器人 webhook test 自动化 msg 发版

钉钉机器人 自动化发版

#1 简介

  • 开发机器人接收消息并调用构建接口, 实现自动化发版
  • 发送指令 -> 机器人接收指令 -> 调用jenkins-job远程构建与部署
  • jenkins配置,勾选job配置的触发远程构建并设置身份验证令牌
#测试 触发远程构建
curl -ks -u user:user_token -X POST \
  jenkins_url/job/job_name/buildWithParameters?token=job_token

#2、创建机器人

#2.1 登录钉钉开放平台
#2.2 创建机器人
  • 应用开发 -> 机器人 -> 创建应用
    • 继续使用旧版,名称如cici
    • 应用信息,复制AppSecret
  • 开发管理,修改,消息接收地址

  • 创建test企业群, 添加机器人cici
  • 复制群机器人token到default_token
#2.3 运行机器人服务

配置环境变量文件.env_lark

#vim .env_dingtalk 
# 钉钉机器人密钥 AppSecret
ding_secret=Q-uG5AMlMgC_Tkn6qhz1601xMYfQgxzeQh3xxx
#默认 机器人token
ding_webhook_default_token=bf5ab6a77cbc1b7c21fcxxx
#jenkins
JenkinsBaseUrl=https://user:user_token@jenkins.elvin.vip/job/

使用docker启动机器人服务

docker rm -f robot-dingtalk &>/dev/null
docker run -dit --name robot-dingtalk \
 --restart=always -h robot-dingtalk --net=host\
 -v $Dir:/opt --env-file .env_dingtalk \
registry.aliyuncs.com/elvin/python:dingtalk-robot \
python3 /opt/dingtalk-robot.py

dingtalk-robot.py 实例在https://gitee.com/alivv/elvin-demo

nignx配置域名和lark反向代理

#dingtalk-cicd
location ~ ^/dingtalk-cicd {
    proxy_pass http://127.0.0.1:8091;
    proxy_set_header Host $host:$server_port;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}

#3 发送消息测试


#3 源码

python实例如下:

#!/usr/bin/python3
# -*- coding: utf-8 -*-
# By Elvin , blog.elvin.vip

import os
import time
import hmac
import hashlib
import base64
import json
from datetime import datetime
from flask import Flask, request
import requests

# 从环境变量加载配置
ding_secret = os.getenv("ding_secret")
ding_webhook_default_token = os.getenv("ding_webhook_default_token")

app = Flask(__name__)

#钉钉发送文本消息
def send_txt_msg(message, webhook_url):
    data = { "msgtype": "text","text": {"content": message}}
    #requests发送post请求
    req = requests.post(webhook_url, json=data)
    print(req)

#签名核对
def check_sign(timestamp=int(time.time() * 1000), app_secret=ding_secret):
    #钉钉消息头部加密
    app_secret_enc = app_secret.encode('utf-8')
    string_to_sign = '{}\n{}'.format(timestamp, app_secret)
    string_to_sign_enc = string_to_sign.encode('utf-8')
    hmac_code = hmac.new(app_secret_enc, string_to_sign_enc, digestmod=hashlib.sha256).digest()
    sign = base64.b64encode(hmac_code).decode('utf-8')
    return sign


# Default route, print user's IP
@app.route('/')
def remoteIP():
    if 'X-Forwarded-For' in request.headers:
        ip = request.headers['X-Forwarded-For'].split(',')[0]
    else:
        ip = request.remote_addr
    return ip + "\n", 200, [("Server", "Go"), ("City", "Shanghai")]


# 接收@机器人的消息
@app.route('/dingtalk-cicd', methods=["POST"])
def index():
    if request.method == "POST":
        timestamp = request.headers.get('Timestamp')
        sign = request.headers.get('Sign')
        if check_sign(timestamp=timestamp) == sign:
            req_data = json.loads(str(request.data, 'utf-8'))
            sender = req_data.get('senderNick')
            text = req_data.get('text').get('content', "").strip()
            ddgroup = req_data.get('conversationTitle').strip()
            #msg
            msg_cicd(ddgroup,text,sender)
            return "succeed"
        else:
            return "not found"
    else:
        return "method not found"


#筛选消息,执行指令
def msg_cicd(ddgroup,text,sender):
    msg = text
    sender = sender
    ddGroup = ddgroup
    print(datetime.now().strftime('%Y-%m-%d %H:%M:%S'), " msg->: ",  msg)
    #check ddgroup
    if ddGroup == "test" or ddGroup == "DevOps":
        webhook = ding_webhook_test
        appInfoMap = dict(appTest, **appProd)
        myMenu = {"help", "test", "prod"}
        if msg in appInfoMap:
            app_env = appInfoMap[msg][0]
            app_name = appInfoMap[msg][1]
            app_url = appInfoMap[msg][2]
            #app_url = appInfoMap[msg][2] + appInfoMap[msg][1]
            app_url = app_url + app_env + "&app_list=" + app_name
            if app_env != "":
                #执行通知
                msg = "By:  %s\nenv:  %s\napp:  %s" % (sender, app_env, app_name)
                send_txt_msg(msg,webhook)
                head = { 'User-Agent': "webhook-dingtalk-robot" }
                #向webhook发起post请求
                res = requests.post(url=app_url, headers=head)
                print(datetime.now().strftime('%Y-%m-%d %H:%M:%S'), "run", app_env, app_name, res.reason)
                return "succeed"
            else:
                print(msg, "nothing")
                return "succeed"
        elif msg in myMenu:
            #打印命令列表
            print(datetime.now().strftime('%Y-%m-%d %H:%M:%S'), "print menu ", msg)
            msgTitle = "#命令  名称\n"
            if msg == "help":
                msgTitle2 = "#命令  获取列表\n"
                msg = msgTitle2 + "test  app-test-list\nprod  app-prod-list"
            elif msg == "test":
                msg = msgTitle
                for i in appTest:
                    msg = msg + i + "  " + appInfoMap[i][1] + "\n"
            elif msg == "prod":
                msg = msgTitle
                for i in appProd:
                    msg = msg + i + "  " + appInfoMap[i][1] + "\n"
            msg = msg.rstrip('\n')
            send_txt_msg(msg,webhook)
            return "succeed"
        else:
            msg = f"已收到: {msg} \n发送 help@cici 查看支持指令"
            send_txt_msg(msg,webhook)
            return "succeed"

    else:
        print(datetime.now().strftime('%Y-%m-%d %H:%M:%S')," no ddGroup config for ",ddGroup)
        webhook = ding_webhook_default
        msg = f"已收到: {msg} \n未发现组{ddGroup}支持指令"
        send_txt_msg(msg,webhook)
        return "succeed"


#webhook
ding_webhook_base_url = "https://oapi.dingtalk.com/robot/send?access_token="
ding_webhook_default = ding_webhook_base_url + ding_webhook_default_token

ding_webhook_test = ding_webhook_default

#webhook url for jenkins 
JenkinsBaseUrl = os.getenv("JenkinsBaseUrl")

#job
appDeploy = "test-app-deploy/buildWithParameters?token=cicdTest&app_branch=master&app_build=true&docker_build=true&create_git_tag=false&notice_msg=true&app_deploy=true&image_update=true&input_pass=true&deploy_tag=tag&deploy_env="

#ci url
appDeployUrl = JenkinsBaseUrl + appDeploy

#hybrid list
appTest = {
"#app-test-k8s-list:": ["","", ""],
"s201": ["test","app-web", appDeployUrl],
"s202": ["test","app-svc", appDeployUrl],
"s203": ["test","app-api", appDeployUrl],
"s204": ["test","app-event", appDeployUrl],
"s205": ["test","app-admin", appDeployUrl],
}

appProd = {
"#app-prod-k8s-list:": ["","", ""],
"s101": ["prod","app-web", appDeployUrl],
"s102": ["prod","app-svc", appDeployUrl],
"s103": ["prod","app-api", appDeployUrl],
"s104": ["prod","app-event", appDeployUrl],
"s105": ["prod","app-admin", appDeployUrl],
}

if __name__ == '__main__':
    app.run(host='0.0.0.0', port=8091)

source: https://gitee.com/alivv/elvin-demo

标签:ding,dingtalk,app,机器人,webhook,test,自动化,msg,发版
From: https://www.cnblogs.com/elvi/p/18619018

相关文章

  • 《刚刚问世》系列初窥篇-Java+Playwright自动化测试-8- 元素高级定位技巧(详细教程)
    1.简介随着网页的复杂性和动态性的增加,自动化测试变得越来越重要。Playwright作为一款强大的无头浏览器测试库,提供了多种元素定位方式,使得我们能够轻松地对网页进行自动化操作。在基础的定位方式如通过id、classname和tagname等之外,Playwright还提供了更高级的定位技巧,如nth()......
  • 企业微信群机器人发送消息通知
    开发文档官方开发文档文本类型直接发送消息及通知人即可defsend_text_msg(bot_key,msg,mentioned_list=None,mentioned_mobile_list=None,at_all=False):'''向指定机器人发送文本消息:parambot_key:企微机器人key:parammsg:文本消息:param......
  • Minium+PageObject:小程序UI自动化测试实践
    随着小程序的普及,用户体验成为各大开发团队追求的核心目标。UI自动化测试不仅提高了开发效率,更在提升用户满意度方面起到了至关重要的作用。而当你还在手动测试时,有人已经借助Minium+PageObject架构完成了全自动化的UI测试。那么,Minium+PageObject是如何为小程序UI自动化测......
  • 库卡机器人KR240电源模块维修思路讲解
    一、库卡机器人KR240电源模块故障诊断故障诊断是维修过程中的关键步骤。使用库卡提供的诊断工具或软件,对库卡机器人KR240电源模块进行故障诊断。重点关注电源供应、输出电压、电流等关键参数。通过诊断结果,确定故障的具体位置和性质,为后续的库卡机器人维修工作提供明确方向。二......
  • abb机器人3d模型,abb机器人模型下载 一文全了解
    ‌ABB机器人是一种工业机器人,由ABB集团研发和生产。ABB是全球领先的机器人与机械自动化供应商之一,总部位于瑞士苏黎世。‌ABB机器人以其运动控制技术为核心,能够实现高精度的循径控制、快速的运动速度和可靠的周期时间,从而大幅度提高生产的质量、效率和可靠性。‌abb机器人主要......
  • 自动化工具ansible部署和实践
    1介绍和部署1.1介绍ansible的功能我爱你在当今的IT自动化领域,Ansible无疑是一个无法被忽视的重要角色。其便利性和高效性受到了广大开发者和系统管理员的一致好评,成为了配置管理和应用部署的首选工具。然而,对于一些初学者来说,Ansible的概念和架构可能会显得有些复杂和难......
  • 面试革命:RPA自动化如何让招聘流程飞起来?
    一、面试时间协调方面根据面试官和候选人的时区自动调整面试时间。举例:如果面试官在不同时区,RPA可以自动计算出合适的面试时间,避免时间冲突。分析面试官和候选人的日程安排,找出最佳的面试时间窗口。例如,优先选择双方都有较长连续空闲时间的时段进行面试安排。对于紧急......
  • abb喷涂机器人保养
    ABB喷涂机器人的日常保养应该每天进行一次。具体的保养内容包括:  - 检查设备的运行状况:每天检查设备的运行状况,确保设备正常运行。  - 清洁设备表面:每天清洁设备表面,防止灰尘和污垢对设备造成损害。  - 检查喷涂效果:每天检查喷涂效果,确保喷涂质量。  - 检......
  • 自然语言处理NLP——基于电影知识图谱和大型语言模型(LLM)的KBQA问答机器人(增加自然语言
    文章目录参考可视化逻辑运行演示参考https://github.com/Xiaoheizi2023/NLP_KBQA可视化逻辑提取出实体后去neo4j搜寻实体相关的图谱,然后返回数据再进行可视化可视化工具cytoscape.js提取实体逻辑:分词后比对关键词运行数据库:Mysql(保存聊天和用户和帖子信息)neo......
  • 《刚刚问世》系列初窥篇-Java+Playwright自动化测试-7-元素基础定位方式-下篇 (详细教
    1.简介上一篇主要是讲解我们日常工作中在使用Playwright进行元素定位的一些比较常用的基础定位方式的理论基础知识以及在什么情况下推荐使用。今天这一篇讲解和分享一下剩下部分的基础定位方式。2.过滤器定位例如以下DOM结构,我们要在其中单击第二个产品卡的购买按钮。我们有几......