using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using Newtonsoft.Json; using RestSharp; using System.Net; using System.Threading.Tasks; using IdentityModel; namespace IRaCIS.Core.Application.Helper.OtherTool; public class WeComAlert { public string Env { get; set; } = ""; public string UserName { get; set; } = ""; public string Api { get; set; } = ""; public string Message { get; set; } = ""; public string? JsonData { get; set; } public string? Stack { get; set; } public bool HasStack => !string.IsNullOrWhiteSpace(Stack); public string[] AtUsers { get; set; } = []; } public static class WeComNotifier { public static async Task SendAlertAsync(string webhook, WeComAlert alert) { try { var client = new RestClient(); var request = new RestRequest(webhook, Method.Post); var time = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"); // 处理 @ var atText = alert.AtUsers != null && alert.AtUsers.Any() ? string.Join("", alert.AtUsers.Select(u => $" <@{u}>")) : ""; // 处理堆栈 var stack = alert.Stack; if (!string.IsNullOrWhiteSpace(stack)) { stack = stack.Replace("\n", "\n> "); if (stack.Length > 1200) stack = stack[..1200] + "...(已截断)"; } var markdown = $@"## 🚨 系统告警 > {atText} > **部署环境:** [{alert.Env}]({alert.Env}) > **发生时间:** {time} > **操作人:** {alert.UserName} > **接口地址:** {alert.Api} ### ❗ 告警信息 {alert.Message}"; if (!string.IsNullOrWhiteSpace(alert.JsonData)) { markdown += $@" > **📦 请求数据(JSON 格式):** ```json {alert.JsonData} ```"; } if (!string.IsNullOrWhiteSpace(stack)) { markdown += $@" ### 堆栈信息(部分) {stack}"; } var payload = new { msgtype = "markdown", markdown = new { content = markdown } }; request.AddHeader("Content-Type", "application/json"); request.AddStringBody(JsonConvert.SerializeObject(payload), DataFormat.Json); await client.ExecuteAsync(request); } catch (Exception ex) { Log.Logger.Error("企业微信告警发送失败: " + ex.Message); } } }