You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

176 lines
7.2 KiB

3 months ago
3 months ago
3 months ago
3 months ago
3 months ago
3 months ago
3 months ago
3 months ago
  1. package com.example.demo.Util;
  2. import com.alibaba.fastjson.JSON;
  3. import com.alibaba.fastjson.JSONObject;
  4. import com.example.demo.domain.vo.coin.ExecutionContext;
  5. import com.example.demo.config.EnvConfig;
  6. import org.apache.http.HttpResponse;
  7. import org.apache.http.HttpStatus;
  8. import org.apache.http.client.methods.HttpPost;
  9. import org.apache.http.entity.StringEntity;
  10. import org.apache.http.impl.client.CloseableHttpClient;
  11. import org.apache.http.impl.client.HttpClients;
  12. import org.apache.http.util.EntityUtils;
  13. import org.springframework.beans.factory.annotation.Value;
  14. import org.springframework.stereotype.Component;
  15. import java.io.IOException;
  16. import java.text.SimpleDateFormat;
  17. import java.util.*;
  18. /**
  19. * 飞书报警信息发送工具类
  20. */
  21. @Component
  22. public class FeiShuAlertUtil {
  23. @Value("${feishu.webhook.url}")
  24. private static String webhookUrl;
  25. private static final String FEISHU_WEBHOOK_URL_PROD = "https://open.feishu.cn/open-apis/bot/v2/hook/1a515b19-b64f-46b7-9486-35842b9539fe";
  26. private static final String FEISHU_WEBHOOK_URL_TEST = webhookUrl;
  27. private static final SimpleDateFormat DATE_FORMAT = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
  28. static {
  29. DATE_FORMAT.setTimeZone(TimeZone.getTimeZone("Asia/Shanghai"));
  30. }
  31. /**
  32. * 发送报警信息到飞书群紧凑单行格式
  33. *
  34. * @param context 请求接口
  35. * @param errorFile 错误文件
  36. * @param errorLine 错误行数
  37. * @param errorMsg 错误信息
  38. * @param params 脚本执行时需要手动传参如果时API请求则无需传自动获取参数
  39. * @return 是否发送成功
  40. */
  41. public static boolean sendAlertMessage(ExecutionContext context,
  42. String errorFile, int errorLine,
  43. String errorMsg, String params) {
  44. JSONObject message = new JSONObject();
  45. message.put("msg_type", "post");
  46. JSONObject content = new JSONObject();
  47. JSONObject post = new JSONObject();
  48. JSONObject zhCn = new JSONObject();
  49. String title = "⚠️ 系统异常报警 ⚠️";
  50. zhCn.put("title", title);
  51. List<List<JSONObject>> contentList = new ArrayList<>();
  52. List<JSONObject> elements = new ArrayList<>();
  53. StringBuilder contentBuilder = new StringBuilder();
  54. contentBuilder.append("------------------------------\n\n");
  55. if ("API".equals(context.getExecutionType())) {
  56. contentBuilder.append("**执行类型**: API请求\n\n");
  57. contentBuilder.append("**请求接口**: ").append(context.getApiUrl()).append("\n\n");
  58. contentBuilder.append("**请求参数**: ").append(params).append("\n\n");
  59. contentBuilder.append("**请求方法**: ").append(context.getMethod()).append("\n\n");
  60. if (context.getToken() != null) {
  61. contentBuilder.append("**请求Token**: ")
  62. .append(context.getToken().length() > 10 ?
  63. context.getToken().substring(0, 10) + "..." :
  64. context.getToken())
  65. .append("\n\n");
  66. }
  67. } else {
  68. contentBuilder.append("**执行类型**: 脚本执行\n\n");
  69. contentBuilder.append("**脚本文件**: ").append(context.getScriptFile()).append("\n\n");
  70. contentBuilder.append("**请求参数**: ").append(params).append("\n\n");
  71. }
  72. contentBuilder.append("**错误位置**: ").append(errorFile).append(":").append(errorLine).append("\n\n");
  73. contentBuilder.append("**错误信息**: ").append(errorMsg).append("\n\n");
  74. contentBuilder.append("**执行时间**: ").append(formatDate(context.getExecutionTime())).append("\n\n");
  75. contentBuilder.append("**报警时间**: ").append(formatDate(new Date())).append("\n\n");
  76. contentBuilder.append("------------------------------");
  77. addContentElement(elements, "text", contentBuilder.toString());
  78. contentList.add(elements);
  79. zhCn.put("content", contentList);
  80. post.put("zh_cn", zhCn);
  81. content.put("post", post);
  82. message.put("content", content);
  83. return sendMessage(message);
  84. }
  85. private static String formatDate(Date date) {
  86. // 实现日期格式化方法
  87. return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(date);
  88. }
  89. private static void addContentElement(List<JSONObject> elements, String tag, String text) {
  90. JSONObject element = new JSONObject();
  91. element.put("tag", tag);
  92. element.put("text", text);
  93. elements.add(element);
  94. }
  95. private static boolean sendMessage(JSONObject message) {
  96. try (CloseableHttpClient httpClient = HttpClients.createDefault()) {
  97. String FEISHU_WEBHOOK_URL;
  98. String environment = EnvConfig.ENV;
  99. System.out.println("当前环境变量:" + environment);
  100. if (Objects.equals(environment, "unknown") || environment.equals("dev")) {
  101. FEISHU_WEBHOOK_URL = FEISHU_WEBHOOK_URL_TEST;
  102. } else {
  103. FEISHU_WEBHOOK_URL = FEISHU_WEBHOOK_URL_PROD;
  104. }
  105. HttpPost httpPost = new HttpPost(FEISHU_WEBHOOK_URL);
  106. httpPost.addHeader("Content-Type", "application/json; charset=utf-8");
  107. StringEntity entity = new StringEntity(message.toJSONString(), "UTF-8");
  108. httpPost.setEntity(entity);
  109. HttpResponse response = httpClient.execute(httpPost);
  110. if (response.getStatusLine().getStatusCode() == HttpStatus.SC_OK) {
  111. String result = EntityUtils.toString(response.getEntity());
  112. JSONObject obj = JSON.parseObject(result);
  113. return obj.getInteger("code") == 0;
  114. }
  115. } catch (IOException e) {
  116. System.out.println("发送飞书异常" + e.getMessage());
  117. e.printStackTrace();
  118. }
  119. return false;
  120. }
  121. /**
  122. * 发送普通信息到飞书群
  123. *
  124. * @param title 消息标题
  125. * @param content 消息内容
  126. * @return 是否发送成功
  127. */
  128. public static boolean sendNormalMessage(String title, String content) {
  129. JSONObject message = new JSONObject();
  130. message.put("msg_type", "post");
  131. JSONObject messageContent = new JSONObject();
  132. JSONObject post = new JSONObject();
  133. JSONObject zhCn = new JSONObject();
  134. zhCn.put("title", title);
  135. List<List<JSONObject>> contentList = new ArrayList<>();
  136. List<JSONObject> elements = new ArrayList<>();
  137. StringBuilder contentBuilder = new StringBuilder();
  138. contentBuilder.append("------------------------------\n\n");
  139. contentBuilder.append(content).append("\n\n");
  140. contentBuilder.append("**发送时间**: ").append(formatDate(new Date())).append("\n\n");
  141. contentBuilder.append("------------------------------");
  142. addContentElement(elements, "text", contentBuilder.toString());
  143. contentList.add(elements);
  144. zhCn.put("content", contentList);
  145. post.put("zh_cn", zhCn);
  146. messageContent.put("post", post);
  147. message.put("content", messageContent);
  148. return sendMessage(message);
  149. }
  150. }