当前位置: 首页 > news >正文

对接钉钉消息样例:DING消息、机器人

一、钉钉开放平台配置信息

private static String robotCode =
private static String appkey =
private static String appsecret = 
private static Long agentId = 

二、钉钉开放平台token、用户信息

    public static Client createClient() throws Exception {Config config = new Config();config.protocol = "https";config.regionId = "central";return new com.aliyun.dingtalkrobot_1_0.Client(config);}/*** 根据手机号获取钉钉ID** @param phone* @return*/private static String getDingUserId(String phone) {String userId = "";try {DingTalkClient client = new DefaultDingTalkClient("https://oapi.dingtalk.com/topapi/v2/user/getbymobile");OapiV2UserGetbymobileRequest req = new OapiV2UserGetbymobileRequest();req.setMobile(phone);req.setSupportExclusiveAccountSearch(true);OapiV2UserGetbymobileResponse rsp = client.execute(req, getAccessToken());log.info("获取userId:{}", JSON.toJSONString(rsp.getResult()));userId = rsp.getResult().getExclusiveAccountUseridList().get(0);} catch (ApiException e) {log.error("根据手机号获取userID失败:{}", e.getMessage());}return userId;}/*** 获取钉钉accessToken** @return*/private static String getAccessToken() {DingTalkClient client = new DefaultDingTalkClient("https://oapi.dingtalk.com/gettoken");OapiGettokenRequest req = new OapiGettokenRequest();req.setAppkey(appkey);req.setAppsecret(appsecret);req.setHttpMethod("GET");OapiGettokenResponse rsp = null;try {rsp = client.execute(req);return rsp.getAccessToken();} catch (ApiException e) {log.error("获取钉钉accessToken失败:{}", e.getMessage());}return null;}

2.1、发送DING消息

    @Retryable(value = {Exception.class}, maxAttempts = 3, backoff = @Backoff(delay = 1000))public static String snedDingdingMessage(String content, String phone) throws Exception {Client client = DingDingRobotUtil.createClient();RobotSendDingHeaders robotSendDingHeaders = new RobotSendDingHeaders();robotSendDingHeaders.xAcsDingtalkAccessToken = getAccessToken();String dingUserId = getDingUserId(phone);if (StrUtil.isBlank(dingUserId)) {return "获取钉钉userId失败";}RobotSendDingRequest robotSendDingRequest = new RobotSendDingRequest().setRobotCode(robotCode).setContent(content).setRemindType(1).setReceiverUserIdList(Arrays.asList(dingUserId));log.info("钉钉消息:{}", robotSendDingRequest);RobotSendDingResponse response;try {response = client.robotSendDingWithOptions(robotSendDingRequest, robotSendDingHeaders, new RuntimeOptions());log.info("消息发送结果:{}", JSON.toJSONString(response));return JSON.toJSONString(response);} catch (Exception e) {return e.getMessage();}}

2.2、发送机器人消息-图文形式

图片转为base64编码,然后上传钉钉获取media_id,发送图文消息

  public static String messageNoticePush(String base64, String content, String phone) {try {// 1. 获取accessToken和用户IDString accessToken = getAccessToken();String dingUserId = getDingUserId(phone);log.info("获取token了:{}" + accessToken);// 2. 初始化客户端DingTalkClient talkClient = new DefaultDingTalkClient("https://oapi.dingtalk.com/topapi/message/corpconversation/asyncsend_v2");// 3. 构建请求基础信息OapiMessageCorpconversationAsyncsendV2Request request = new OapiMessageCorpconversationAsyncsendV2Request();request.setUseridList(dingUserId);request.setAgentId(agentId); // 替换为你的实际AgentIdOapiMessageCorpconversationAsyncsendV2Request.Msg msg = new OapiMessageCorpconversationAsyncsendV2Request.Msg();//            图片msg.setMsgtype("markdown");OapiMessageCorpconversationAsyncsendV2Request.Markdown markdown = new OapiMessageCorpconversationAsyncsendV2Request.Markdown();markdown.setTitle("设备预警");// 4. 上传图片获取media_idif (StrUtil.isNotBlank(base64)) {log.info("存在图片");String mediaId = upload(base64); // 假设这是你上传图片的方法markdown.setText(content + "\n " +"> ![image](" + mediaId + ") \n ");} else {log.info("无图片");markdown.setText(content);}msg.setMarkdown(markdown);request.setMsg(msg);OapiMessageCorpconversationAsyncsendV2Response response = talkClient.execute(request, accessToken);log.info("调用钉钉接口完毕:{}" + response);if (response.getErrcode().equals(0L)) {log.info("推送成功: {}", response.getBody());return "success";} else {log.error("推送失败,错误码: {}, 错误信息: {}", response.getErrcode(), response.getErrmsg());return "failed";}} catch (Exception e) {log.error("推送失败: ", e);return "error";}}public static String upload(String base64Pic) throws IOException {String pureBase64 = base64Pic.replaceFirst("data:image/\\w+;base64,", "");byte[] fileBytes = Base64.getDecoder().decode(pureBase64);HttpRequest body = HttpUtil.createPost("https://oapi.dingtalk.com/media/upload?access_token=" + getAccessToken()).header("Content-Type", "multipart/form-data").form("type", "image").form("media", fileBytes, "image.png");String result = body.execute().body();JSONObject json = JSONUtil.parseObj(result);log.info("上传文件:{}" + json);if (json.getInt("errcode") != 0) {throw new IOException("钉钉返回错误: " + json.getStr("errmsg"));}return json.getStr("media_id");}

注意:普通文本发送图文消息是文字+图片url链接(BING\机器人均可);

base64格式的图片只能通过机器人;

钉钉链接地址:发送DING消息 - 钉钉开放平台

http://www.dtcms.com/a/208163.html

相关文章:

  • iOS 直播弹幕礼物功能详解
  • 多模态AI终极形态?GPT-5与Stable Diffusion 3的融合实验报告
  • 【49. 字母异位词分组】
  • iOS 上线前的性能与稳定性检查流程实录:开发者的“最后一公里”(含 KeyMob 应用经验)
  • C# 高效读取大文件
  • Spark on Yarn 高可用模式部署流程
  • 如何提高服务器的QPS来应对618活动的并发流量
  • 如何将带有LFS对象的git仓库推送到gitlab
  • 前端(小程序)学习笔记(CLASS 2):WXML模板语法与WXSS模板样式
  • C语言实现顺序存储结构
  • PostgreSQL中的权限管理简介
  • Python爬虫(35)Python爬虫高阶:基于Docker集群的动态页面自动化采集系统实战
  • Terraform创建阿里云基础组件资源
  • Java SpringBoot 扣子CozeAI SseEmitter流式对话完整实战 打字机效果
  • Android 网络全栈攻略(五)—— 从 OkHttp 拦截器来看 HTTP 协议二
  • 使用OpenSSL生成根证书并自签署证书
  • 数据结构(6)线性表-队列
  • 【leetcode】3356. 零数组变换②
  • 字节跳动旗下火山引擎都覆盖哪些领域
  • 四、GPU是如何成为当前电脑中不可或缺的一部分的,opengl在其中起到了什么效果
  • 基于SpringMVC的动态时钟设计
  • youyu:91501
  • 学习黑客Nmap 是什么?
  • React从基础入门到高级实战:React 基础入门 - 简介与开发环境搭建
  • [逻辑回归]机器学习-part11
  • 相机--基础
  • Widget进阶
  • Python训练营打卡 Day25
  • 5.2.3 使用配置文件方式整合MyBatis
  • 《数据结构初阶》【八大排序——巅峰决战】