mirror of
https://github.com/hotyue/IP-Sentinel.git
synced 2026-09-05 15:39:16 +08:00
refactor(report): 战报模块深度重构,支持动态读取功能开关,实现 Google/Trust 数据解耦与自适应排版
This commit is contained in:
+68
-55
@@ -1,8 +1,8 @@
|
|||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
|
|
||||||
# ==========================================================
|
# ==========================================================
|
||||||
# 脚本名称: tg_report.sh (Telegram 每日战报模块 V5.3 缝合加强版)
|
# 脚本名称: tg_report.sh (Telegram 每日战报模块 V6.0 动态拼装版)
|
||||||
# 核心功能: 分析日志并推送 24 小时统计数据到 TG (修复 Markdown 断联Bug)
|
# 核心功能: 适配 Feature Flag 架构,按需展示 Google/Trust 独立统计数据
|
||||||
# ==========================================================
|
# ==========================================================
|
||||||
|
|
||||||
INSTALL_DIR="/opt/ip_sentinel"
|
INSTALL_DIR="/opt/ip_sentinel"
|
||||||
@@ -22,7 +22,7 @@ fi
|
|||||||
NODE_NAME=$(hostname | cut -c 1-15)
|
NODE_NAME=$(hostname | cut -c 1-15)
|
||||||
CURRENT_IP=$(curl -4 -s -m 5 api.ip.sb/ip || echo "Unknown")
|
CURRENT_IP=$(curl -4 -s -m 5 api.ip.sb/ip || echo "Unknown")
|
||||||
|
|
||||||
# 智能判断 IP 属性 (通过检查 ISP 标识)
|
# 智能判断 IP 属性
|
||||||
ISP_INFO=$(curl -4 -s -m 5 api.ip.sb/geoip | jq -r '.organization' 2>/dev/null)
|
ISP_INFO=$(curl -4 -s -m 5 api.ip.sb/geoip | jq -r '.organization' 2>/dev/null)
|
||||||
if [[ "$ISP_INFO" == *"Cloudflare"* ]]; then
|
if [[ "$ISP_INFO" == *"Cloudflare"* ]]; then
|
||||||
IP_TYPE="Cloudflare Warp 🛰️"
|
IP_TYPE="Cloudflare Warp 🛰️"
|
||||||
@@ -30,80 +30,93 @@ else
|
|||||||
IP_TYPE="Native 原生网卡 🏠"
|
IP_TYPE="Native 原生网卡 🏠"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
# 动态国旗
|
||||||
|
case "$REGION_CODE" in
|
||||||
|
"JP") FLAG="🇯🇵" ;;
|
||||||
|
"US") FLAG="🇺🇸" ;;
|
||||||
|
"DE") FLAG="🇩🇪" ;;
|
||||||
|
"SG") FLAG="🇸🇬" ;;
|
||||||
|
"HK") FLAG="🇭🇰" ;;
|
||||||
|
"GB"|"UK") FLAG="🇬🇧" ;;
|
||||||
|
*) FLAG="🌐" ;;
|
||||||
|
esac
|
||||||
|
|
||||||
# 3. 截取过去 24 小时的日志
|
# 3. 截取过去 24 小时的日志
|
||||||
LOG_CONTENT=$(find "$LOG_FILE" -mtime -1 -exec cat {} \; 2>/dev/null)
|
LOG_CONTENT=$(find "$LOG_FILE" -mtime -1 -exec cat {} \; 2>/dev/null)
|
||||||
|
|
||||||
if [ -z "$LOG_CONTENT" ]; then
|
if [ -z "$LOG_CONTENT" ]; then
|
||||||
# 修复了换行问题,统一用 EOF 块构造
|
|
||||||
read -r -d '' MSG <<EOT
|
read -r -d '' MSG <<EOT
|
||||||
🛑 **[IP-Sentinel] 告警:节点异常**
|
🛑 **[IP-Sentinel] 告警:节点异常**
|
||||||
----------------------------
|
----------------------------
|
||||||
📍 **节点名称**: \`${NODE_NAME}\`
|
📍 **节点名称**: \`${NODE_NAME}\`
|
||||||
⚠️ **警告**: 过去 24 小时无运行日志!
|
⚠️ **警告**: 过去 24 小时无运行日志!
|
||||||
🛠️ **建议**: 节点可能刚部署完毕,请手动执行一次 [执行深度伪装]。
|
🛠️ **建议**: 节点可能刚部署完毕,请在面板手动执行一次养护动作。
|
||||||
EOT
|
EOT
|
||||||
else
|
else
|
||||||
# 4. 数据精准分析
|
# ==========================================
|
||||||
TOTAL_SESSIONS=$(echo "$LOG_CONTENT" | grep "\[START\]" -c)
|
# 4. 动态模块数据分析 (核心升级)
|
||||||
SUCCESS_COUNT=$(echo "$LOG_CONTENT" | grep "✅" -c)
|
# ==========================================
|
||||||
FAILED_COUNT=$(echo "$LOG_CONTENT" | grep "❌" -c)
|
|
||||||
UNKNOWN_COUNT=$(echo "$LOG_CONTENT" | grep "⚠️" -c)
|
# 提取最近一次运行的快照 (智能识别所属模块)
|
||||||
|
LAST_LOG_LINE=$(echo "$LOG_CONTENT" | grep "\[SCORE\]" | tail -n 1)
|
||||||
|
LAST_TIME=$(echo "$LAST_LOG_LINE" | awk '{print $1,$2}' | tr -d '[]')
|
||||||
|
LAST_MOD=$(echo "$LAST_LOG_LINE" | awk '{print $4}' | tr -d '[]')
|
||||||
|
LAST_SCORE=$(echo "$LAST_LOG_LINE" | awk -F'自检结论: ' '{print $2}')
|
||||||
|
|
||||||
# 提取最近一次运行的时间和结论文本
|
# 开始组装战报头部
|
||||||
# (⚠️ 核心 Bug 修复: 用 awk 切割并过滤掉中括号 [],防止触发 TG Markdown 语法错误导致消息丢弃)
|
MSG="📊 **IP-Sentinel 每日简报 (${FLAG} ${REGION_NAME})**
|
||||||
LAST_TIME=$(echo "$LOG_CONTENT" | grep "\[END" | tail -n 1 | awk '{print $1,$2}' | tr -d '[]')
|
|
||||||
LAST_SCORE=$(echo "$LOG_CONTENT" | grep "\[SCORE\]" | tail -n 1 | awk -F'自检结论: ' '{print $2}' | tr -d '[]')
|
|
||||||
|
|
||||||
# 计算成功率
|
|
||||||
if [ "$TOTAL_SESSIONS" -gt 0 ]; then
|
|
||||||
RATE=$(awk "BEGIN {printf \"%.1f\", ($SUCCESS_COUNT/$TOTAL_SESSIONS)*100}")
|
|
||||||
else
|
|
||||||
RATE=0
|
|
||||||
fi
|
|
||||||
|
|
||||||
# 状态表情逻辑:成功率 100% 显绿色,0% 显红色,中间显黄色
|
|
||||||
if [ "$SUCCESS_COUNT" -eq "$TOTAL_SESSIONS" ] && [ "$TOTAL_SESSIONS" -gt 0 ]; then
|
|
||||||
STATUS_EMOJI="🟢 隐匿完美"
|
|
||||||
elif [ "$SUCCESS_COUNT" -gt 0 ]; then
|
|
||||||
STATUS_EMOJI="🟡 伪装拉锯中"
|
|
||||||
else
|
|
||||||
STATUS_EMOJI="🔴 目标已暴露"
|
|
||||||
fi
|
|
||||||
|
|
||||||
# 动态国旗
|
|
||||||
case "$REGION_CODE" in
|
|
||||||
"JP") FLAG="🇯🇵" ;;
|
|
||||||
"US") FLAG="🇺🇸" ;;
|
|
||||||
"DE") FLAG="🇩🇪" ;;
|
|
||||||
"SG") FLAG="🇸🇬" ;;
|
|
||||||
*) FLAG="🌐" ;;
|
|
||||||
esac
|
|
||||||
|
|
||||||
# 5. 组装 Markdown 消息体 (吸收了老版本的优点)
|
|
||||||
read -r -d '' MSG <<EOT
|
|
||||||
📊 **IP-Sentinel 每日简报 (${FLAG} ${REGION_NAME})**
|
|
||||||
----------------------------
|
----------------------------
|
||||||
📍 **节点名称**: \`${NODE_NAME}\`
|
📍 **节点名称**: \`${NODE_NAME}\`
|
||||||
📡 **出口 IP**: \`${CURRENT_IP}\`
|
📡 **出口 IP**: \`${CURRENT_IP}\`
|
||||||
🛡️ **IP 属性**: ${IP_TYPE}
|
🛡️ **IP 属性**: ${IP_TYPE}"
|
||||||
🔰 **当前状态**: ${STATUS_EMOJI}
|
|
||||||
|
|
||||||
📅 **24H 统计数据**:
|
# --- [分析块 1: Google 纠偏模块] ---
|
||||||
🚀 执行总数: ${TOTAL_SESSIONS} 次
|
if [ "$ENABLE_GOOGLE" == "true" ]; then
|
||||||
✅ 成功伪装: ${SUCCESS_COUNT} 次
|
GOOGLE_LOGS=$(echo "$LOG_CONTENT" | grep "\[Google")
|
||||||
❌ 判定送中: ${FAILED_COUNT} 次
|
G_TOTAL=$(echo "$GOOGLE_LOGS" | grep "\[START\]" -c)
|
||||||
⚠️ 未知跳转: ${UNKNOWN_COUNT} 次
|
G_SUCCESS=$(echo "$GOOGLE_LOGS" | grep "✅" -c)
|
||||||
📈 综合胜率: **${RATE}%**
|
G_FAILED=$(echo "$GOOGLE_LOGS" | grep "❌" -c)
|
||||||
|
G_WARN=$(echo "$GOOGLE_LOGS" | grep "⚠️" -c)
|
||||||
|
|
||||||
|
G_RATE="0.0"
|
||||||
|
[ "$G_TOTAL" -gt 0 ] && G_RATE=$(awk "BEGIN {printf \"%.1f\", ($G_SUCCESS/$G_TOTAL)*100}")
|
||||||
|
|
||||||
🕒 **最近执行快照**:
|
MSG="$MSG
|
||||||
|
|
||||||
|
🎯 **[Google 区域纠偏]**
|
||||||
|
🚀 执行总数: ${G_TOTAL} 次 (胜率: **${G_RATE}%**)
|
||||||
|
✅ 成功: ${G_SUCCESS} | ❌ 送中: ${G_FAILED} | ⚠️ 警告: ${G_WARN}"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# --- [分析块 2: IP 信用净化模块] ---
|
||||||
|
if [ "$ENABLE_TRUST" == "true" ]; then
|
||||||
|
TRUST_LOGS=$(echo "$LOG_CONTENT" | grep "\[Trust")
|
||||||
|
T_TOTAL=$(echo "$TRUST_LOGS" | grep "\[START\]" -c)
|
||||||
|
T_SUCCESS=$(echo "$TRUST_LOGS" | grep "✅" -c)
|
||||||
|
T_FAILED=$(echo "$TRUST_LOGS" | grep "❌" -c)
|
||||||
|
|
||||||
|
T_RATE="0.0"
|
||||||
|
[ "$T_TOTAL" -gt 0 ] && T_RATE=$(awk "BEGIN {printf \"%.1f\", ($T_SUCCESS/$T_TOTAL)*100}")
|
||||||
|
|
||||||
|
MSG="$MSG
|
||||||
|
|
||||||
|
🔰 **[IP 信用净化]**
|
||||||
|
🚀 净化总数: ${T_TOTAL} 轮 (成功率: **${T_RATE}%**)
|
||||||
|
✅ 成功注入: ${T_SUCCESS} | ❌ 访问受阻: ${T_FAILED}"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# 组装战报尾部 (最近快照)
|
||||||
|
MSG="$MSG
|
||||||
|
|
||||||
|
🕒 **最近执行快照 [${LAST_MOD:-"System"}]:**
|
||||||
时间: ${LAST_TIME:-"暂无数据"}
|
时间: ${LAST_TIME:-"暂无数据"}
|
||||||
结论: ${LAST_SCORE:-"暂无数据"}
|
结论: ${LAST_SCORE:-"暂无数据"}
|
||||||
----------------------------
|
----------------------------
|
||||||
💡 哨兵正在后台默默守护您的资产。
|
💡 哨兵正在后台默默守护您的资产。"
|
||||||
EOT
|
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# 6. 调用 API 推送 (增加返回值校验输出,方便查错)
|
# 5. 调用 API 推送
|
||||||
RESPONSE=$(curl -s -m 10 -X POST "https://api.telegram.org/bot${TG_TOKEN}/sendMessage" \
|
RESPONSE=$(curl -s -m 10 -X POST "https://api.telegram.org/bot${TG_TOKEN}/sendMessage" \
|
||||||
-d "chat_id=${CHAT_ID}" \
|
-d "chat_id=${CHAT_ID}" \
|
||||||
-d "text=${MSG}" \
|
-d "text=${MSG}" \
|
||||||
|
|||||||
Reference in New Issue
Block a user