SpringBoot應(yīng)用實(shí)現(xiàn)向釘釘發(fā)送帶圖片的消息的兩種方法總結(jié)
在Spring Boot應(yīng)用中向釘釘發(fā)送帶圖片的消息,主要有兩種主流實(shí)現(xiàn)方式:一種是使用機(jī)器人Webhook發(fā)送包含圖片鏈接的消息,另一種是通過釘釘開放平臺(tái)SDK發(fā)送圖片消息。下面我為你詳細(xì)說明這兩種方法的實(shí)現(xiàn)步驟。
兩種發(fā)送釘釘圖片消息的方案對比
| 方案類型 | 實(shí)現(xiàn)方式 | 圖片處理 | 適用場景 | 主要限制 |
|---|---|---|---|---|
| 機(jī)器人Webhook方案 | 通過群機(jī)器人Webhook發(fā)送圖文消息 | 圖片需先上傳至公網(wǎng)可訪問的URL | 群聊通知、監(jiān)控告警 | 圖片需公網(wǎng)可訪問;每分鐘限20條 |
| 釘釘SDK方案 | 使用官方SDK上傳媒體文件并發(fā)送 | 圖片上傳至釘釘服務(wù)器獲取media_id | 企業(yè)內(nèi)部應(yīng)用、精確到人 | 需要企業(yè)應(yīng)用權(quán)限;流程更復(fù)雜 |
方案一:使用釘釘機(jī)器人Webhook發(fā)送圖文消息
這是最常用和簡便的方法,適合向釘釘群發(fā)送帶圖片的通知消息。
1. 創(chuàng)建釘釘群機(jī)器人
首先需要在釘釘群中創(chuàng)建自定義機(jī)器人:
- 進(jìn)入釘釘群設(shè)置 → 智能群助手 → 添加機(jī)器人 → 自定義
- 記錄生成的Webhook地址和加簽密鑰(如有安全設(shè)置)
2. 添加Maven依賴
根據(jù)不同的starter庫,可以選擇以下依賴之一:
<!-- 方案A: snowheart的starter -->
<dependency>
<groupId>cn.snowheart</groupId>
<artifactId>spring-boot-dingtalk-robot-starter</artifactId>
<version>1.0.3.RELEASE</version>
</dependency>
<!-- 方案B: javafamily的starter -->
<dependency>
<groupId>club.javafamily</groupId>
<artifactId>dingtalk-notification-spring-boot-starter</artifactId>
<version>2.3.2-beta.13</version>
</dependency>
3. 配置Webhook參數(shù)
在application.yml中配置機(jī)器人信息:
# 如果使用snowheart的starter
dingtalk:
robot:
prefix: https://oapi.dingtalk.com/robot/send
access-token: your_access_token_here
secret:
secret-enabled: true
secret-token: your_secret_here
# 如果使用javafamily的starter
javafamily:
notify:
dingtalk:
hook-url: https://oapi.dingtalk.com/robot/send?access_token=your_token
enabled: true
4. 實(shí)現(xiàn)圖片消息發(fā)送
以下是幾種常見的帶圖片消息類型的實(shí)現(xiàn)代碼:
A. 發(fā)送Link消息(圖片+標(biāo)題+描述)
@RestController
public class DingTalkController {
@Autowired
private DingTalkRobotClient dingTalkRobotClient; // snowheart starter
/**
* 發(fā)送帶圖片的Link消息
*/
@GetMapping("/sendLinkMessage")
public void sendLinkMessageWithImage() {
// 圖片必須先上傳到公網(wǎng)可訪問的URL
String imageUrl = "https://example.com/your-image.jpg";
String title = "系統(tǒng)監(jiān)控告警";
String text = "服務(wù)器CPU使用率超過90%,請及時(shí)處理!";
String messageUrl = "http://your-system.com/detail"; // 點(diǎn)擊跳轉(zhuǎn)鏈接
LinkMessage linkMessage = new LinkMessage(title, text, imageUrl, messageUrl);
DingTalkResponse response = dingTalkRobotClient.sendLinkMessage(linkMessage);
if (response.getErrcode().longValue() == 0L) {
System.out.println("Link消息發(fā)送成功");
}
}
}
B. 發(fā)送Markdown消息(圖片嵌入正文)
/**
* 發(fā)送Markdown格式的圖片消息
*/
@GetMapping("/sendMarkdownWithImage")
public void sendMarkdownWithImage() {
String imageUrl = "https://example.com/chart.png";
String markdownText = "### 業(yè)務(wù)數(shù)據(jù)報(bào)表\n\n" +
"最新業(yè)務(wù)數(shù)據(jù)統(tǒng)計(jì)圖如下:\n\n" +
"\n\n" +
"**統(tǒng)計(jì)時(shí)間:** " + new Date();
MarkdownMessage markdownMessage = new MarkdownMessage(
"業(yè)務(wù)數(shù)據(jù)通知",
markdownText
);
DingTalkResponse response = dingTalkRobotClient.sendMarkdownMessage(markdownMessage);
if (response.getErrcode().longValue() == 0L) {
System.out.println("Markdown消息發(fā)送成功");
}
}
C. 使用javafamily starter發(fā)送消息
@SpringBootTest
public class DingTalkNotifyTests {
@Autowired
private DingTalkNotifyHandler dingTalkNotifyHandler; // javafamily starter
@Test
void testNotifyLinkMessage() {
String imageUrl = "https://example.com/image.jpg";
DingTalkLinkRequest request = DingTalkLinkRequest.of(
"系統(tǒng)通知",
"發(fā)現(xiàn)異常請求,請及時(shí)查看處理",
"https://your-system.com/detail",
imageUrl
);
String response = dingTalkNotifyHandler.notify(request);
System.out.println("發(fā)送結(jié)果:" + response);
}
}
方案二:使用釘釘官方SDK發(fā)送圖片消息
這種方法適合企業(yè)內(nèi)部應(yīng)用,需要用戶授權(quán),可以發(fā)送給指定用戶。
1. 添加官方SDK依賴
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>alibaba-dingtalk-service-sdk</artifactId>
<version>2.0.0</version>
</dependency>
2. 實(shí)現(xiàn)圖片上傳和發(fā)送
@Component
public class DingTalkService {
@Value("${dingding.app-key}")
private String appKey;
@Value("${dingding.app-secret}")
private String appSecret;
@Value("${dingding.agent-id}")
private Long agentId;
/**
* 獲取AccessToken
*/
public String getAccessToken() throws ApiException {
DingTalkClient client = new DefaultDingTalkClient("https://oapi.dingtalk.com/gettoken");
OapiGettokenRequest request = new OapiGettokenRequest();
request.setAppkey(appKey);
request.setAppsecret(appSecret);
request.setHttpMethod("GET");
OapiGettokenResponse response = client.execute(request);
return response.getAccessToken();
}
/**
* 上傳圖片并發(fā)送
*/
public void sendImageMessage(String userId, String imageUrl) throws ApiException {
String accessToken = getAccessToken();
// 1. 先上傳圖片獲取media_id
String mediaId = uploadImage(accessToken, imageUrl);
// 2. 發(fā)送圖片消息
DingTalkClient client = new DefaultDingTalkClient(
"https://oapi.dingtalk.com/topapi/message/corpconversation/asyncsend_v2");
OapiMessageCorpconversationAsyncsendV2Request req = new OapiMessageCorpconversationAsyncsendV2Request();
req.setAgentId(agentId);
req.setUseridList(userId);
OapiMessageCorpconversationAsyncsendV2Request.Msg msg =
new OapiMessageCorpconversationAsyncsendV2Request.Msg();
msg.setMsgtype("image");
msg.setImage(new OapiMessageCorpconversationAsyncsendV2Request.Image());
msg.getImage().setMediaId(mediaId);
req.setMsg(msg);
OapiMessageCorpconversationAsyncsendV2Response rsp = client.execute(req, accessToken);
if (rsp.getErrcode() != 0) {
throw new RuntimeException("發(fā)送失?。? + rsp.getErrmsg());
}
}
/**
* 上傳圖片到釘釘服務(wù)器
*/
private String uploadImage(String accessToken, String imageUrl) throws ApiException {
DingTalkClient client = new DefaultDingTalkClient("https://oapi.dingtalk.com/media/upload");
OapiMediaUploadRequest request = new OapiMediaUploadRequest();
request.setType("image");
// 需要下載圖片并上傳
FileItem item = new FileItem(new URL(imageUrl).openStream());
request.setMedia(item);
OapiMediaUploadResponse response = client.execute(request, accessToken);
return response.getMediaId();
}
}
重要注意事項(xiàng)
圖片處理要點(diǎn)
- ??圖片URL必須公網(wǎng)可訪問??:釘釘機(jī)器人需要從公網(wǎng)下載圖片進(jìn)行展示
- ??圖片格式支持??:支持JPG、PNG等常見格式,建議圖片大小不超過2MB
- ??圖片緩存??:釘釘會(huì)對圖片進(jìn)行緩存,相同URL的圖片可能不會(huì)實(shí)時(shí)更新
安全限制
- ??頻率限制??:每個(gè)機(jī)器人每分鐘最多發(fā)送20條消息
- ??安全設(shè)置??:支持自定義關(guān)鍵詞、加簽、IP白名單等安全措施
- ??token保護(hù)??:Webhook中的access_token要妥善保管,避免泄露
實(shí)際應(yīng)用示例:監(jiān)控告警帶圖表
@Service
public class MonitorAlertService {
@Autowired
private DingTalkRobotClient dingTalkRobotClient;
public void sendAlertWithChart(String alertMsg, String chartImageUrl) {
String markdownContent = "### ?? 系統(tǒng)監(jiān)控告警\n\n" +
"**告警信息:** " + alertMsg + "\n\n" +
"**趨勢圖表:** \n\n" +
"\n\n" +
"**時(shí)間:** " + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date());
MarkdownMessage message = new MarkdownMessage("系統(tǒng)監(jiān)控告警", markdownContent);
// @所有人
message.setIsAtAll(true);
DingTalkResponse response = dingTalkRobotClient.sendMarkdownMessage(message);
if (response.getErrcode() == 0) {
System.out.println("告警消息發(fā)送成功");
}
}
}
方案選擇建議
- ??對于群通知和監(jiān)控告警??,推薦使用??方案一(機(jī)器人Webhook)??,配置簡單,適合向群內(nèi)發(fā)送帶圖表的通知
- ??對于企業(yè)內(nèi)部精準(zhǔn)推送??,需要??方案二(官方SDK)??,可以指定接收人并確保消息送達(dá)
- ??圖片準(zhǔn)備??:確保圖片已上傳至公網(wǎng)可訪問的圖床或自有CDN
根據(jù)你的具體場景選擇合適的方案,即可實(shí)現(xiàn)Spring Boot應(yīng)用向釘釘發(fā)送帶圖片的消息。
到此這篇關(guān)于SpringBoot應(yīng)用實(shí)現(xiàn)向釘釘發(fā)送帶圖片的消息的兩種方法總結(jié)的文章就介紹到這了,更多相關(guān)SpringBoot釘釘發(fā)送帶圖片消息內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Springboot整合freemarker和相應(yīng)的語法詳解
FreeMarker是一款Spring官方推薦使用的模板引擎。接下來通過本文給大家介紹Springboot整合freemarker和相應(yīng)的語法,感興趣的朋友一起看看吧2021-09-09
Java中使用synchronized關(guān)鍵字實(shí)現(xiàn)簡單同步操作示例
這篇文章主要介紹了Java中使用synchronized關(guān)鍵字實(shí)現(xiàn)簡單同步操作示例,本文起講解了synchronized修飾函數(shù)、synchronized修飾代碼塊、synchronized修飾靜態(tài)方法等內(nèi)容,需要的朋友可以參考下2015-04-04
SpringBoot整合SpringSecurity實(shí)現(xiàn)JWT認(rèn)證的項(xiàng)目實(shí)踐
本文會(huì)通過創(chuàng)建SpringBoot項(xiàng)目整合SpringSecurity,實(shí)現(xiàn)完整的JWT認(rèn)證機(jī)制,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-07-07
Java GZip 基于磁盤實(shí)現(xiàn)壓縮和解壓的方法
這篇文章主要介紹了Java GZip 基于磁盤實(shí)現(xiàn)壓縮和解壓,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考需要的朋友可以參考下2020-08-08
mybatis中<if>標(biāo)簽bool值類型為false判斷方法
這篇文章主要給大家介紹了關(guān)于mybatis中<if>標(biāo)簽bool值類型為false判斷方法,文中通過示例代碼介紹的非常詳細(xì),對大家學(xué)習(xí)或者使用mybatis具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧2019-08-08
Spring Boot實(shí)現(xiàn)郵件服務(wù)(附:常見郵箱的配置)
這篇文章主要給大家介紹了關(guān)于Spring Boot實(shí)現(xiàn)郵件服務(wù)的相關(guān)資料,文中還附上了常見郵箱的配置,通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2018-12-12
Java 獲取網(wǎng)絡(luò)302重定向URL的方法
在本篇文章里小編給大家整理的是關(guān)于Java 獲取網(wǎng)絡(luò)302重定向URL的方法以及相關(guān)知識點(diǎn),有興趣的朋友們參考下。2019-08-08
Java遠(yuǎn)程調(diào)用組件Feign技術(shù)使用詳解
Feign是Netflix公司開發(fā)的一個(gè)聲明式的REST調(diào)用客戶端; Ribbon負(fù)載均衡、 Hystrⅸ服務(wù)熔斷是我們Spring Cloud中進(jìn)行微服務(wù)開發(fā)非?;A(chǔ)的組件,在使用的過程中我們也發(fā)現(xiàn)它們一般都是同時(shí)出現(xiàn)的,而且配置也都非常相似2022-11-11

