diff --git a/apps/web/src/lib/traffic-alert.ts b/apps/web/src/lib/traffic-alert.ts index dc3e4a1..69aa508 100644 --- a/apps/web/src/lib/traffic-alert.ts +++ b/apps/web/src/lib/traffic-alert.ts @@ -121,27 +121,25 @@ async function resolveTelegramChatId(): Promise { return resolveTelegramFallbackChatId(); } -function escapeMarkdown(value: unknown) { +function escapeHtml(value: unknown) { if (value === null || value === undefined) return ""; - return String(value) - .replace(/([_*[\]()~`>#+=|{}.!-])/g, "\\$1") - .replace(/\n/g, "\\n"); + return String(value).replace(/&/g, "&").replace(//g, ">"); } function buildTelegramMessage(event: TrafficAlertEvent) { return ( - `*VibeWork 流量告警*` + - `\n- 平台: \`agent-bounty-protocol\`` + - `\n- 等級: \`${event.level}\`` + - `\n- 行為: \`${event.action}\`` + - `\n- 通道: \`${event.surface}\`` + - `\n- Actor: \`${event.actorType}/${event.actorId}\`` + - `\n- Source IP: \`${event.sourceIp || "n/a"}\`` + - `\n- User-Agent: \`${event.userAgent || "n/a"}\`` + - `\n- 回應: \`${typeof event.metadata?.response_status === "number" ? event.metadata.response_status : "n/a"}\`` + - `\n- 任務: \`${event.taskId || "n/a"}\`` + - `\n- request_id: \`${typeof event.metadata?.request_id === "string" ? event.metadata.request_id : "n/a"}\`` + - `\n- 訊息: ${escapeMarkdown(event.message)}` + `VibeWork 流量告警` + + `\n- 平台: agent-bounty-protocol` + + `\n- 等級: ${escapeHtml(event.level)}` + + `\n- 行為: ${escapeHtml(event.action)}` + + `\n- 通道: ${escapeHtml(event.surface)}` + + `\n- Actor: ${escapeHtml(`${event.actorType}/${event.actorId}`)}` + + `\n- Source IP: ${escapeHtml(event.sourceIp || "n/a")}` + + `\n- User-Agent: ${escapeHtml(event.userAgent || "n/a")}` + + `\n- 回應: ${escapeHtml(typeof event.metadata?.response_status === "number" ? event.metadata.response_status : "n/a")}` + + `\n- 任務: ${escapeHtml(event.taskId || "n/a")}` + + `\n- request_id: ${escapeHtml(typeof event.metadata?.request_id === "string" ? event.metadata.request_id : "n/a")}` + + `\n- 訊息: ${escapeHtml(event.message)}` ); } @@ -277,7 +275,7 @@ export async function sendTrafficAlert(event: TrafficAlertEvent): Promise body: JSON.stringify({ chat_id: resolvedTelegramChatId, text: buildTelegramMessage(event), - parse_mode: "MarkdownV2", + parse_mode: "HTML", }), }, },