首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >基于springboot项目的钉钉消息发送

基于springboot项目的钉钉消息发送

作者头像
六月的雨在Tencent
发布于 2024-03-28 12:51:58
发布于 2024-03-28 12:51:58
5510
举报
文章被收录于专栏:CSDNCSDN

基于springboot项目的钉钉消息发送

此功能开发完成后已距当下十月之久,目前整理来方便以后查阅,此处仅做记录之用,他人亦可作为参考

MsgInfo.java

代码语言:javascript
AI代码解释
复制
package com.dongao.project.common.dingding;

import com.dongao.project.msgtemplet.domain.MsgTemplet;

/**
 * Created by nao'nao on 2020/4/2.
 */
public class MsgInfo {

    private static final long serialVersionUID = 1L;
    /**参数1 可选*/
    private String param1;
    /**参数2 可选*/
    private String param2;
    /**参数3 可选*/
    private String param3;
    /**参数4 可选*/
    private String param4;
    /**参数5 可选*/
    private String param5;
    /**参数6 可选*/
    private String param6;
    /**参数7 可选*/
    private String param7;
    /**参数8 可选*/
    private String param8;
    /**参数9 可选*/
    private String param9;
    /**参数10 可选*/
    private String param10;
    /** 线索id  必选*/
    private String clueId;
    /**消息对象 必选*/
    private MsgTemplet msgTemplet;
    /**必选*/
    private String userIds;

    public String getParam1() {
        return param1;
    }

    public void setParam1(String param1) {
        this.param1 = param1;
    }

    public String getParam2() {
        return param2;
    }

    public void setParam2(String param2) {
        this.param2 = param2;
    }

    public String getParam3() {
        return param3;
    }

    public void setParam3(String param3) {
        this.param3 = param3;
    }

    public String getParam4() {
        return param4;
    }

    public void setParam4(String param4) {
        this.param4 = param4;
    }

    public String getParam5() {
        return param5;
    }

    public void setParam5(String param5) {
        this.param5 = param5;
    }

    public String getParam6() {
        return param6;
    }

    public void setParam6(String param6) {
        this.param6 = param6;
    }

    public String getParam7() {
        return param7;
    }

    public void setParam7(String param7) {
        this.param7 = param7;
    }

    public String getParam8() {
        return param8;
    }

    public void setParam8(String param8) {
        this.param8 = param8;
    }

    public String getParam9() {
        return param9;
    }

    public void setParam9(String param9) {
        this.param9 = param9;
    }

    public String getParam10() {
        return param10;
    }

    public void setParam10(String param10) {
        this.param10 = param10;
    }

    public String getClueId() {
        return clueId;
    }

    public void setClueId(String clueId) {
        this.clueId = clueId;
    }

    public MsgTemplet getMsgTemplet() {
        return msgTemplet;
    }

    public void setMsgTemplet(MsgTemplet msgTemplet) {
        this.msgTemplet = msgTemplet;
    }

    public String getUserIds() {
        return userIds;
    }

    public void setUserIds(String userIds) {
        this.userIds = userIds;
    }
}

IDingDingService.java

代码语言:javascript
AI代码解释
复制
package com.dongao.project.common.dingding;

import com.dingtalk.api.response.OapiMediaUploadResponse;
import com.dingtalk.api.response.OapiMessageCorpconversationAsyncsendV2Response;
import com.dingtalk.api.response.OapiUserGetUseridByUnionidResponse;
import com.ruoyi.framework.web.domain.AjaxResult;
import org.springframework.web.multipart.MultipartFile;

import java.io.InputStream;

/**
 * Created by nao'nao on 2020/3/31.
 * @author dingding
 * 工作通知消息的发送限制
 *(1)企业开发者每分钟最多可调用接口1500次,ISV开发者每分钟最多可调用接口1000次
 *(2)企业发送消息单次最多只能给5000人发送,ISV发送消息单次最多能给1000人发送
 *(3)给同一员工发送内容相同的消息,一天只能发一次
 *(4)企业发送每个员工每天最多可发送500条,ISV方式最多可发送50条
 *(5)企业/ISV发送消息时每分钟最多只能有5000人可以接收到消息
 */
public interface IDingDingService {

    /**
     * 调用钉钉上传文件
     * (1) 图片(image):1MB,支持JPG格式
     * (2)语音(voice):2MB,播放长度不超过60s,AMR格式
     * (3)普通文件(file):10MB
     * @param type 文件类型  image file  (voice暂不支持)
     * @param file  文件
     * @return 返回上传成功对象 OapiMediaUploadResponse
     */
    public OapiMediaUploadResponse uploadMedia(String type, MultipartFile file);

    /**
     * 发送消息调用
     * @param msgInfo 发送消息的内容对象
     * @return AjaxResult
     */
    public AjaxResult sendMessage(MsgInfo msgInfo);

    /**
     * 根据unionId获取userId
     * @param unionId 当前钉钉用户在当前企业下的唯一识别码
     * @return
     */
    public OapiUserGetUseridByUnionidResponse getUserIdByUnionId(String unionId);

}

DingDingServiceImpl.java

代码语言:javascript
AI代码解释
复制
package com.dongao.project.common.dingding;

import com.dingtalk.api.DefaultDingTalkClient;
import com.dingtalk.api.DingTalkClient;
import com.dingtalk.api.request.OapiGettokenRequest;
import com.dingtalk.api.request.OapiMediaUploadRequest;
import com.dingtalk.api.request.OapiMessageCorpconversationAsyncsendV2Request;
import com.dingtalk.api.request.OapiUserGetUseridByUnionidRequest;
import com.dingtalk.api.response.OapiGettokenResponse;
import com.dingtalk.api.response.OapiMediaUploadResponse;
import com.dingtalk.api.response.OapiMessageCorpconversationAsyncsendV2Response;
import com.dingtalk.api.response.OapiUserGetUseridByUnionidResponse;
import com.dongao.project.common.constants.Constants;
import com.dongao.project.config.ConstantConfig;
import com.dongao.project.msghistory.domain.MsgHistory;
import com.dongao.project.msghistory.service.IMsgHistoryService;
import com.dongao.project.msgtemplet.domain.MsgTemplet;
import com.dongao.project.sys.service.SysService;
import com.ruoyi.common.utils.Md5Utils;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.common.utils.text.Convert;
import com.ruoyi.framework.web.domain.AjaxResult;
import com.ruoyi.project.system.config.service.IConfigService;
import com.taobao.api.ApiException;
import com.taobao.api.FileItem;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;

/**
 * Created by nao'nao on 2020/3/31.
 * @author dingding
 */
@Service
public class DingDingServiceImpl implements IDingDingService {

    @Autowired
    private IMsgHistoryService msgHistoryService;

    @Autowired
    private SysService sysService;
    @Autowired
    private IConfigService configService;
    /**
     * 调用钉钉发送工作通知消息
     * @param useridList 员工在当前开发者企业账号范围内的userid
     * @param msgTemplet 消息模板
     * @return 异步发送消息返回发送任务对象 OapiMessageCorpconversationAsyncsendV2Response
     */
    private OapiMessageCorpconversationAsyncsendV2Response sendWorkMsg(String useridList, MsgTemplet msgTemplet) {

        try {
            //给钉钉用户发送工作通知消息
            OapiMessageCorpconversationAsyncsendV2Response rsp = send(useridList, msgTemplet);
            return rsp;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

    /**
     * 给钉钉用户发送工作通知消息
     * @param useridList 接收者的用户userid列表,最大用户列表长度:100  zhangsan,lisi
     * @param msgTemplet 消息内容
     * @return OapiMessageCorpconversationAsyncsendV2Response
     */
    private OapiMessageCorpconversationAsyncsendV2Response send(String useridList, MsgTemplet msgTemplet) {
        //获取企业认证
        try {
            String accessToken = getAccessToken();
            //给钉钉用户发送工作通知消息
            DingTalkClient client = new DefaultDingTalkClient("https://oapi.dingtalk.com/topapi/message/corpconversation/asyncsend_v2");
            OapiMessageCorpconversationAsyncsendV2Request req = new OapiMessageCorpconversationAsyncsendV2Request();
            req.setAgentId(Long.parseLong(ConstantConfig.dingtalkMsgAgentId));
            req.setUseridList(useridList);
            //部门id串 ,分隔
            ///req2.setDeptIdList("1");
            //是否发送给企业全部用户
            ///req2.setToAllUser(false);
            OapiMessageCorpconversationAsyncsendV2Request.Msg obj1 = new OapiMessageCorpconversationAsyncsendV2Request.Msg();
            if (Constants.MsgType.TEXT.getValue().equals(msgTemplet.getTempletType())) {
                //发送文本消息
                obj1.setMsgtype(Constants.MsgType.TEXT.getValue());
                OapiMessageCorpconversationAsyncsendV2Request.Text obj2 = new OapiMessageCorpconversationAsyncsendV2Request.Text();
                obj2.setContent(msgTemplet.getContent());
                obj1.setText(obj2);
            }else if (Constants.MsgType.IMAGE.getValue().equals(msgTemplet.getTempletType())) {
                //发送图片信息  content即为图片media_id
                obj1.setMsgtype(Constants.MsgType.IMAGE.getValue());
                OapiMessageCorpconversationAsyncsendV2Request.Image obj2 = new OapiMessageCorpconversationAsyncsendV2Request.Image();
                obj2.setMediaId(msgTemplet.getContent());
                obj1.setImage(obj2);
            }else if (Constants.MsgType.FILE.getValue().equals(msgTemplet.getTempletType())) {
                //发送文件信息  content即为图片media_id
                obj1.setMsgtype(Constants.MsgType.FILE.getValue());
                OapiMessageCorpconversationAsyncsendV2Request.File obj2 = new OapiMessageCorpconversationAsyncsendV2Request.File();
                obj2.setMediaId(msgTemplet.getContent());
                obj1.setFile(obj2);
            }else if (Constants.MsgType.LINK.getValue().equals(msgTemplet.getTempletType())) {
                obj1.setMsgtype(Constants.MsgType.LINK.getValue());
                OapiMessageCorpconversationAsyncsendV2Request.Link obj2 = new OapiMessageCorpconversationAsyncsendV2Request.Link();
                obj2.setPicUrl(msgTemplet.getPicUrl());
                obj2.setMessageUrl(msgTemplet.getMessageUrl());
                obj2.setText(msgTemplet.getContent());
                obj2.setTitle(msgTemplet.getTitle());
                obj1.setLink(obj2);
            }else if (Constants.MsgType.MARKDOWN.getValue().equals(msgTemplet.getTempletType())) {
                obj1.setMsgtype(Constants.MsgType.MARKDOWN.getValue());
                OapiMessageCorpconversationAsyncsendV2Request.Markdown obj2 = new OapiMessageCorpconversationAsyncsendV2Request.Markdown();
                obj2.setText(msgTemplet.getContent());
                obj2.setTitle(msgTemplet.getTitle());
                obj1.setMarkdown(obj2);
            }
            req.setMsg(obj1);
            OapiMessageCorpconversationAsyncsendV2Response rsp = client.execute(req, accessToken);
            return rsp;
        } catch (ApiException e) {
            e.printStackTrace();
        }

        return null;

    }

    /**
     * 获取企业凭证 access_token
     */
    private String getAccessToken() throws ApiException {
        //获取企业凭证 access_token  正常情况下access_token有效期为7200秒,有效期内重复获取返回相同结果,并自动续期。
        DingTalkClient client = new DefaultDingTalkClient("https://oapi.dingtalk.com/gettoken");
        OapiGettokenRequest req = new OapiGettokenRequest();
        req.setAppkey(ConstantConfig.dingtalkMsgAppKey);
        req.setAppsecret(ConstantConfig.dingtalkMsgAppSecret);
        req.setHttpMethod("GET");
        OapiGettokenResponse rsp = client.execute(req);
        return rsp.getAccessToken();
    }

    /**
     * 调用钉钉上传文件
     * (1) 图片(image):1MB,支持JPG格式
     * (2)语音(voice):2MB,播放长度不超过60s,AMR格式
     * (3)普通文件(file):10MB
     * @param type 文件类型  image file  (voice暂不支持)
     * @param file  文件
     * @return
     */
    @Override
    public OapiMediaUploadResponse uploadMedia(String type, MultipartFile file) {
        try {
            //获取企业凭证 access_token
            String accessToken = getAccessToken();
            DingTalkClient client = new DefaultDingTalkClient("https://oapi.dingtalk.com/media/upload");
            OapiMediaUploadRequest req = new OapiMediaUploadRequest();
            req.setType(type);
            req.setMedia(new FileItem(file.getOriginalFilename(),file.getInputStream()));
            OapiMediaUploadResponse rsp = client.execute(req, accessToken);
            return rsp;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

    /**
     * 发送消息调用
     * @param msgInfo 发送消息的内容对象
     * @return AjaxResult
     */
    @Override
    public AjaxResult sendMessage(MsgInfo msgInfo) {
        String dingSwitch=configService.selectConfigByKey("ding.ding.switch");
        if(!dingSwitch.equals("on")){
            return AjaxResult.success("钉钉消息开关没有打开无法推送!");
        }
        String userIdsStr = msgInfo.getUserIds();
        if (msgInfo != null && StringUtils.isNotEmpty(userIdsStr)) {
            //获取用户userId对应的钉钉平台用户userid
            String[] userIds = Convert.toStrArray(userIdsStr);
            String useridList = sysService.selectDingdingUseridList(userIds);

            if (StringUtils.isNotEmpty(useridList)) {
                //获取消息模板
                MsgTemplet msgTemplet = msgInfo.getMsgTemplet();
                if (msgTemplet != null) {
                    String content = msgTemplet.getContent();
                    //替换content中特定字段值
                    content = getContent(msgInfo, content);

                    msgTemplet.setContent(content);

                    //给跳转链接增加免密参数
                    String messageUrl = msgTemplet.getMessageUrl();
                    String projectUrl = msgTemplet.getProjectUrl();
                    if (StringUtils.isNotEmpty(projectUrl) && StringUtils.isNotEmpty(messageUrl)) {
                        //加密
                        String sign = Md5Utils.hash(Constants.LOGIN_KEY + userIdsStr);
                        StringBuilder stringBuilder = new StringBuilder();
                        stringBuilder.append(projectUrl);
                        stringBuilder.append("/loginFree?userId=");
                        stringBuilder.append(userIdsStr);
                        stringBuilder.append("&sign=");
                        stringBuilder.append(sign);
                        stringBuilder.append("&clueId=");
                        stringBuilder.append(msgInfo.getClueId());
                        stringBuilder.append("&redirect_url=");
                        stringBuilder.append(messageUrl);
                        msgTemplet.setMessageUrl(stringBuilder.toString());
                    }

                    //如果是markdown消息,链接不为空需要拼链接
                    if (Constants.MsgType.MARKDOWN.getValue().equals(msgTemplet.getTempletType())
                            && msgTemplet.getContent().contains("]") && StringUtils.isNotEmpty(msgTemplet.getMessageUrl())) {
                            content = content.replace("]","]("+msgTemplet.getMessageUrl()+")");
                            msgTemplet.setContent(content);
                    }

                    OapiMessageCorpconversationAsyncsendV2Response rsp = sendWorkMsg(useridList, msgTemplet);

                    // 2020-07-03 fdh 钉钉服务调取失败处理
                    if( rsp == null ){
                        return AjaxResult.error("钉钉推送消息失败");
                    }

                    //插入消息发送记录表
                    MsgHistory msgHistory = new MsgHistory();
                    for (String userId:userIds) {
                        msgHistory.setUserId(Long.parseLong(userId));
                        msgHistory.setErrCode(rsp.getErrcode());
                        msgHistory.setErrMsg(rsp.getErrmsg());
                        msgHistory.setContent(content);
                        msgHistory.setTaskId(rsp.getTaskId());
                        msgHistory.setType(msgTemplet.getTempletType());
                        msgHistoryService.insertMsgHistory(msgHistory);
                    }

                    if (rsp.isSuccess()) {
                        //success
                        return AjaxResult.success("钉钉工作通知消息发送成功!");
                    }else {
                        //error
                        return AjaxResult.error(rsp.getErrmsg());
                    }

                }else {
                    return AjaxResult.error("暂无消息模板,请添加后操作!");
                }
            }else {
                return AjaxResult.error("用户不存在或者未绑定钉钉账号!");
            }


        }else {
            return AjaxResult.error();
        }
    }

    /**
     * 替换content中特定字段值
     * @param msgInfo
     * @param content
     * @return
     */
    private String getContent(MsgInfo msgInfo, String content) {

        //替换可选参数
        content = content.replace("@param1@", msgInfo.getParam1() == null ? "" : msgInfo.getParam1());

        content = content.replace("@param2@",msgInfo.getParam2() == null?"":msgInfo.getParam2());

        content = content.replace("@param3@",msgInfo.getParam3() == null?"":msgInfo.getParam3());

        content = content.replace("@param4@",msgInfo.getParam4() == null?"":msgInfo.getParam4());

        content = content.replace("@param5@",msgInfo.getParam5() == null?"":msgInfo.getParam5());

        content = content.replace("@param6@",msgInfo.getParam6() == null?"":msgInfo.getParam6());

        content = content.replace("@param7@",msgInfo.getParam7() == null?"":msgInfo.getParam7());

        content = content.replace("@param8@",msgInfo.getParam8() == null?"":msgInfo.getParam8());

        content = content.replace("@param9@",msgInfo.getParam9() == null?"":msgInfo.getParam9());

        content = content.replace("@param10@",msgInfo.getParam10() == null?"":msgInfo.getParam10());


      return content;
    }

    /**
     * 根据unionId获取userId
     * @param unionId 当前钉钉用户在当前企业下的唯一识别码
     * @return
     */
    @Override
    public OapiUserGetUseridByUnionidResponse getUserIdByUnionId(String unionId) {
        try {
            String accessToken = getAccessToken();
            //根据unionId获取userId
            DingTalkClient client = new DefaultDingTalkClient("https://oapi.dingtalk.com/user/getUseridByUnionid");
            OapiUserGetUseridByUnionidRequest req = new OapiUserGetUseridByUnionidRequest();
            req.setUnionid(unionId);
            req.setHttpMethod("GET");
            OapiUserGetUseridByUnionidResponse rsp = client.execute(req, accessToken);
            return rsp;
        } catch (ApiException e) {
            e.printStackTrace();
        }
        return null;
    }

}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2024-03-28,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
AI协作:借助腾讯云 AI 代码助手实现Springboot整合钉钉机器异常日志通知
在现代微服务架构中,及时监控和响应系统异常对于保障系统的稳定性和可靠性至关重要。钉钉作为企业级通讯工具,提供了强大的机器人功能,可以方便地将系统异常信息实时推送到指定的群聊中。本文将介绍如何在Spring Boot项目中整合钉钉机器人,实现异常日志的自动通知功能。本文将利用腾讯云 AI 代码助手完成本次教程,腾讯云 AI 代码助手可以帮助开发者快速生成代码、优化现有代码,并提供技术指导。
小明爱吃火锅
2025/09/19
1550
企业内部应用接入钉钉获取部门及人员信息
记录下对应的AgentId、AppKey、AppSecret,上面步骤都操作完成之后需要开启对应权限,由于我们需要获取部门及人员信息,因此需要开启对应权限,点击【权限管理】选择需要的权限点击【申请权限】即可,如图
六月的雨在Tencent
2024/03/29
6510
企业内部应用接入钉钉获取部门及人员信息
​​钉钉自定义机器人简单使用
年前公司的需求里面有用到钉钉机器人,使用之后发现真的非常简单,不得不感叹阿里的牛逼,这篇文章总结了一下个人使用钉钉机器人的经验,同时介绍个人据此构建一个工具类来方便后续直接“开箱即用”,希望对于读者有所启发。
阿东
2021/08/16
4.4K0
​​钉钉自定义机器人简单使用
基于springboot架构 钉钉扫码登录第三方应用
点击进入钉钉开发者平台 的页面,点击左侧菜单的【移动接入应用-登录】,然后点击右上角的【创建扫码登录应用授权】,创建用于免登过程中验证身份的appId及appSecret,创建后即可看到appId和appSecret。
六月的雨在Tencent
2024/03/28
2680
基于springboot架构 钉钉扫码登录第三方应用
Docker最全教程之使用.NET Core推送钉钉消息(十九)
上一篇我们通过实战分享了使用Go推送钉钉消息,由于技痒,笔者现在也编写了一个.NET Core的Demo,作为简单的对照和说明。
雪雁-心莱科技
2019/04/09
9000
Docker最全教程之使用.NET Core推送钉钉消息(十九)
RuoYi框架集成DingDing登录
图片图片图片图片集成概览login.js:api定义钉钉登录接口user.js:在钉钉登录成功后,设置tokenlogin.vue:使用钉钉的默认集成页面进行钉钉登录DingDingService.java(以及它的实现类 DingDingServiceImpl.java):访问钉钉的服务接口SysLoginController.java:定义钉钉登录接口pom.xml:添加钉钉服务依赖jar包SecurityConfig.java:将钉钉登录接口设置为可匿名访问UserDetailsServiceImpl
在下是首席架构师
2023/03/30
3.2K3
RuoYi框架集成DingDing登录
Go使用Curl推送钉钉消息
最近在用Go实现业务日志实时监控,当捕捉到error级别的日志时,想要推送钉钉消息到群里进行通知,下面代码实现了简单消息及markdown消息推送到钉钉机器人webhook的操作,供大家参考。
Clive
2019/05/31
1.4K0
python实现自动向钉钉群推送消息
步骤一:【电脑钉钉 】-【群聊】-【群设置】-【智能群助手】-【添加更多】-【添加机器人】-【自定义】-【添加】,编辑机器人名称和选择添加的群组。
墨紫羽墨
2021/12/12
1.8K0
钉钉一键登录第三方网站
企业内部系统已经做过了钉钉扫码登录,现在需要添加钉钉一键登录第三方网站功能,这里主要记录一键登录整个实现步骤。
六月的雨在Tencent
2024/03/29
5740
钉钉一键登录第三方网站
通过钉钉机器人发送群消息通知
可以查看这篇文章:添加机器人到钉钉群 使用命令行工具curl快速验证自定义机器人是否可以正常工作。可以使用如下命令,把对应的链接调整成对应群的webhook地址即可。
共饮一杯无
2022/11/24
2K0
通过钉钉机器人发送群消息通知
[C#] 钉钉机器人通知
操作步骤 【钉钉桌面客户端】-> 【群设置】-> 【智能群助手】-> 【添加新建机器人-选自定义】-> 【设置机器人名称头像】-> 【注意⚠️设置自定义关键字: TanCloud】 ->【添加成功后复
科控物联
2022/04/19
1K0
[C#] 钉钉机器人通知
springboot 项目整合拦截器
六月的雨在Tencent
2024/03/28
1380
python自动化高效办公第二期,带你项目实战【二】{数据可视化、发送邮件(定时任务监控)、python聊天机器人(基于微信、钉钉)}
API商城_API_API接口大全_API一站式采购基地百度智能云API商城-API一站式采购基地,API商城提供天气查询API、实名认证API、短信验证码、OCR识别等海量API服务。选购API服务,首选百度智能云API商城。
汀丶人工智能
2022/12/21
1.3K0
python自动化高效办公第二期,带你项目实战【二】{数据可视化、发送邮件(定时任务监控)、python聊天机器人(基于微信、钉钉)}
Go之发送钉钉和邮箱
smtp发送邮件 群发两个邮箱,一个163,一个QQ package main import ( "fmt" "net/smtp" "strings" ) const ( HOST = "smtp.163.com" SERVER_ADDR = "smtp.163.com:25" USER = "xxx@163.com" //发送邮件的邮箱 PASSWORD = "xxxxx" //发送邮件邮箱的密码 ) type Email stru
iginkgo18
2020/11/12
6470
Go之发送钉钉和邮箱
Pytest-测试报告发送到钉钉群
记录一下pytest接口自动化结束后,将测试报告发送到钉钉群。 第一步:当然是在群里添加钉钉自定义机器人
软件测试君
2023/10/23
5930
Pytest-测试报告发送到钉钉群
求助-钉钉开发异步消息失败
源码: 1.AsyncMessage.java package com.ray.dingtalk.model.message.asyncsend; /**@desc : * * 参考文档地
shirayner
2018/08/10
9451
Prometheus告警集成到钉钉
集成到钉钉 编写python flask脚本 cat > app.py <<EOF #!/usr/bin/python # -*- coding: utf8 -*- from flask import Flask from flask import request import time import hmac import hashlib import base64 import urllib import requests import json import sys reload(sys)
mikelLam
2022/10/31
6490
Spring Cloud Admin健康检查 邮件、钉钉群通知
源码地址:https://github.com/muxiaonong/Spring-Cloud/tree/master/cloudadmin
全栈程序员站长
2021/04/07
7010
layui 上传图片文件到钉钉服务器
首先先下载layui-2.5.6.zip包,解压后选择自己用到的文件放入项目中。 下载地址:https://download.csdn.net/download/csdn565973850/12299623
六月的雨在Tencent
2024/03/28
3830
layui 上传图片文件到钉钉服务器
钉钉机器人自动关联 GitHub 发送 approval prs
摘要:用技术来解决 PM 枯燥的 approval pr 工作,本文将阐述如何自动化获取 GitHub Organization 下各个 repo 待 merge 的 pull requests 并通知相关人员,告别每日的手动操作。
NebulaGraph
2020/06/17
1.7K0
钉钉机器人自动关联 GitHub 发送 approval prs
推荐阅读
相关推荐
AI协作:借助腾讯云 AI 代码助手实现Springboot整合钉钉机器异常日志通知
更多 >
领券
社区新版编辑器体验调研
诚挚邀请您参与本次调研,分享您的真实使用感受与建议。您的反馈至关重要,感谢您的支持与参与!
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
首页
学习
活动
专区
圈层
工具
MCP广场
首页
学习
活动
专区
圈层
工具
MCP广场