mirror of
https://github.com/hotyue/IP-Sentinel.git
synced 2026-06-07 09:49:41 +08:00
feat(agent): 彻底重构声呐战报,解决广告字符干扰,实现全库打分矩阵与流媒体高亮排版
This commit is contained in:
@@ -1,6 +1,6 @@
|
||||
#!/bin/bash
|
||||
# ==========================================================
|
||||
# IP-Sentinel: 深海声呐 (IP 质量全维异步检测模块满血版)
|
||||
# IP-Sentinel: 深海声呐 (IP 质量全维异步检测模块终极情报版)
|
||||
# ==========================================================
|
||||
|
||||
source /opt/ip_sentinel/config.conf
|
||||
@@ -8,90 +8,116 @@ source /opt/ip_sentinel/config.conf
|
||||
TARGET_IP=$(echo "${BIND_IP:-$PUBLIC_IP}" | tr -d '[]')
|
||||
IP_PROTO="${IP_PREF:-4}"
|
||||
|
||||
# 1. 静默拉取 JSON
|
||||
JSON_DATA=$(timeout 180 bash <(curl -sL https://IP.Check.Place) -y -j -${IP_PROTO} -i "${TARGET_IP}" 2>/dev/null)
|
||||
# 1. 静默拉取 JSON (剔除头部广告杂音)
|
||||
JSON_DATA=$(timeout 180 bash <(curl -sL https://IP.Check.Place) -y -j -${IP_PROTO} -i "${TARGET_IP}" 2>/dev/null | sed -n '/^{/,$p')
|
||||
|
||||
if [ -z "$JSON_DATA" ]; then
|
||||
if [ -z "$JSON_DATA" ] || ! echo "$JSON_DATA" | jq . >/dev/null 2>&1; then
|
||||
curl -s -X POST "${TG_API_URL}" \
|
||||
-d "chat_id=${CHAT_ID}" \
|
||||
-d "parse_mode=Markdown" \
|
||||
-d "text=❌ *深海声呐探测失败*
|
||||
📍 节点:\`${NODE_ALIAS}\`
|
||||
🌐 锁定IP:\`${PUBLIC_IP}\`
|
||||
⚠️ *未收到回波。检测源超时或 IP 路由受阻。*" >/dev/null
|
||||
⚠️ *未收到有效回波。检测源超时或数据解析受阻。*" >/dev/null
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# 2. 提取全维基础指标
|
||||
# 2. 提取基础物理定位与身份特征
|
||||
IP_ADDR=$(echo "$JSON_DATA" | jq -r '.Head.IP // empty')
|
||||
[ -z "$IP_ADDR" ] && IP_ADDR="$PUBLIC_IP"
|
||||
ASN=$(echo "$JSON_DATA" | jq -r '.Info.ASN // "Unknown"')
|
||||
ORG=$(echo "$JSON_DATA" | jq -r '.Info.Organization // "Unknown"')
|
||||
CITY=$(echo "$JSON_DATA" | jq -r '.Info.City.Name // "Unknown"')
|
||||
IP_TYPE=$(echo "$JSON_DATA" | jq -r '.Info.Type // "Unknown"')
|
||||
USAGE_TYPE=$(echo "$JSON_DATA" | jq -r '.Type.Usage.IPinfo // "Unknown"')
|
||||
COUNTRY=$(echo "$JSON_DATA" | jq -r '.Info.Region.Name // "Unknown"')
|
||||
IP_TYPE=$(echo "$JSON_DATA" | jq -r '.Info.Type // "未知属性"')
|
||||
USAGE_TYPE=$(echo "$JSON_DATA" | jq -r '.Type.Usage.IPinfo // "未知场景"')
|
||||
|
||||
# 3. 提取深度风险评分
|
||||
# 3. 深度欺诈与信用评估 (各大权威库联查)
|
||||
SCAM_SCORE=$(echo "$JSON_DATA" | jq -r '.Score.SCAMALYTICS // "0"')
|
||||
FRAUD_RISK=$(echo "$JSON_DATA" | jq -r '.Score.ipapi // "0%"')
|
||||
ABUSE_SCORE=$(echo "$JSON_DATA" | jq -r '.Score.AbuseIPDB // "0"')
|
||||
IPQS_SCORE=$(echo "$JSON_DATA" | jq -r '.Score.IPQS // "0"')
|
||||
IP2L_SCORE=$(echo "$JSON_DATA" | jq -r '.Score.IP2LOCATION // "0"')
|
||||
FRAUD_RISK=$(echo "$JSON_DATA" | jq -r '.Score.ipapi // "0%"')
|
||||
|
||||
# 4. 提取流媒体与 AI 解锁指标
|
||||
NF_STAT=$(echo "$JSON_DATA" | jq -r '.Media.Netflix.Status // "Unknown"')
|
||||
NF_REG=$(echo "$JSON_DATA" | jq -r '.Media.Netflix.Region // ""')
|
||||
YT_STAT=$(echo "$JSON_DATA" | jq -r '.Media.Youtube.Status // "Unknown"')
|
||||
YT_REG=$(echo "$JSON_DATA" | jq -r '.Media.Youtube.Region // ""')
|
||||
DP_STAT=$(echo "$JSON_DATA" | jq -r '.Media.DisneyPlus.Status // "Unknown"')
|
||||
DP_REG=$(echo "$JSON_DATA" | jq -r '.Media.DisneyPlus.Region // ""')
|
||||
TK_STAT=$(echo "$JSON_DATA" | jq -r '.Media.TikTok.Status // "Unknown"')
|
||||
TK_REG=$(echo "$JSON_DATA" | jq -r '.Media.TikTok.Region // ""')
|
||||
GPT_STAT=$(echo "$JSON_DATA" | jq -r '.Media.ChatGPT.Status // "Unknown"')
|
||||
GPT_REG=$(echo "$JSON_DATA" | jq -r '.Media.ChatGPT.Region // ""')
|
||||
APV_STAT=$(echo "$JSON_DATA" | jq -r '.Media.AmazonPrimeVideo.Status // "Unknown"')
|
||||
APV_REG=$(echo "$JSON_DATA" | jq -r '.Media.AmazonPrimeVideo.Region // ""')
|
||||
# 代理/VPN 特征探针 (只要有一家认为是代理,就亮黄灯)
|
||||
IS_PROXY="🟢 干净"
|
||||
if echo "$JSON_DATA" | jq -e '.Factor.Proxy | to_entries | any(.value == true)' >/dev/null 2>&1 || \
|
||||
echo "$JSON_DATA" | jq -e '.Factor.VPN | to_entries | any(.value == true)' >/dev/null 2>&1; then
|
||||
IS_PROXY="🟡 疑似代理/VPN"
|
||||
fi
|
||||
|
||||
# 4. 提取流媒体与 AI 解锁指标 (带解锁类型)
|
||||
parse_media() {
|
||||
local status=$(echo "$JSON_DATA" | jq -r ".Media.$1.Status // \"未知\"")
|
||||
local reg=$(echo "$JSON_DATA" | jq -r ".Media.$1.Region // \"\"")
|
||||
local type=$(echo "$JSON_DATA" | jq -r ".Media.$1.Type // \"\"")
|
||||
|
||||
if [[ "$status" == *"解锁"* ]]; then
|
||||
echo "🟢 $reg ($type)"
|
||||
elif [[ "$status" == *"屏蔽"* ]] || [[ "$status" == *"失败"* ]]; then
|
||||
echo "🔴 屏蔽"
|
||||
else
|
||||
echo "⚪ $status"
|
||||
fi
|
||||
}
|
||||
|
||||
NF_STAT=$(parse_media "Netflix")
|
||||
YT_STAT=$(parse_media "Youtube")
|
||||
DP_STAT=$(parse_media "DisneyPlus")
|
||||
TK_STAT=$(parse_media "TikTok")
|
||||
GPT_STAT=$(parse_media "ChatGPT")
|
||||
APV_STAT=$(parse_media "AmazonPrimeVideo")
|
||||
|
||||
# 提取原生 JSON 里的原始状态用于底层隐写回传
|
||||
RAW_NF_STAT=$(echo "$JSON_DATA" | jq -r '.Media.Netflix.Status // "Unknown"')
|
||||
RAW_YT_REG=$(echo "$JSON_DATA" | jq -r '.Media.Youtube.Region // ""')
|
||||
RAW_YT_STAT=$(echo "$JSON_DATA" | jq -r '.Media.Youtube.Status // "Unknown"')
|
||||
|
||||
# 5. 邮局连通性与黑名单
|
||||
PORT25=$(echo "$JSON_DATA" | jq -r '.Mail.Port25 // "false"')
|
||||
[ "$PORT25" == "true" ] && P25_TEXT="✅ 放行" || P25_TEXT="❌ 封堵"
|
||||
[ "$PORT25" == "true" ] && P25_TEXT="✅ 畅通" || P25_TEXT="❌ 封堵"
|
||||
DNS_BLACK=$(echo "$JSON_DATA" | jq -r '.Mail.DNSBlacklist.Blacklisted // "0"')
|
||||
DNS_MARK=$(echo "$JSON_DATA" | jq -r '.Mail.DNSBlacklist.Marked // "0"')
|
||||
|
||||
# 6. “送中” 逻辑判定
|
||||
WARNING_MSG=""
|
||||
if [[ "$YT_REG" == *"[CN]"* ]] || [[ "$YT_STAT" == *"China"* ]]; then
|
||||
WARNING_MSG="%0A🚨 **高危警告:该 IP 已被 Google / YouTube 送中!**%0A"
|
||||
if [[ "$RAW_YT_REG" == *"[CN]"* ]] || [[ "$RAW_YT_STAT" == *"China"* ]]; then
|
||||
WARNING_MSG="%0A🚨 **[高危] 该节点已被 Google 判定为中国大陆 (送中)!**%0A"
|
||||
fi
|
||||
|
||||
# 7. 组装 Markdown 战报 (满血版)
|
||||
REPORT="🎯 *深海声呐 - 全维探测报告*
|
||||
# 7. 组装情报级 Markdown 战报
|
||||
REPORT="🎯 *IP-Sentinel 深海声呐报告*
|
||||
📍 节点:\`${NODE_ALIAS}\`
|
||||
🌐 IP:\`${IP_ADDR}\`${WARNING_MSG}
|
||||
🌐 地址:\`${IP_ADDR}\`${WARNING_MSG}
|
||||
|
||||
*🏢 物理定位与特征*
|
||||
• **所属机房:** \`AS${ASN} (${ORG})\`
|
||||
• **物理定位:** \`${CITY}\`
|
||||
• **路由属性:** \`${IP_TYPE}\` | \`${USAGE_TYPE}\`
|
||||
*🏢 物理身份与网络属性*
|
||||
\`AS${ASN}\` | \`${ORG}\`
|
||||
**定位:** \`${COUNTRY} - ${CITY}\`
|
||||
**属性:** \`${IP_TYPE}\` | \`${USAGE_TYPE}\`
|
||||
**探针:** ${IS_PROXY}
|
||||
|
||||
*🛡️ 欺诈与信用评估*
|
||||
• **Scamalytics:** \`${SCAM_SCORE}/100\` (欺诈分)
|
||||
• **AbuseIPDB:** \`${ABUSE_SCORE}/100\` (滥用投诉)
|
||||
• **IPAPI 风险:** \`${FRAUD_RISK}\` (代理与机房概率)
|
||||
*🛡️ 欺诈雷达 (0为最优)*
|
||||
• **Scamalytics:** \`${SCAM_SCORE}/100\`
|
||||
• **AbuseIPDB:** \`${ABUSE_SCORE}/100\`
|
||||
• **IPQuality:** \`${IPQS_SCORE}/100\`
|
||||
• **IP2Location:** \`${IP2L_SCORE}/100\`
|
||||
• **IPAPI 风险率:** \`${FRAUD_RISK}\`
|
||||
|
||||
*🎬 核心解锁雷达*
|
||||
• **YouTube:** \`${YT_STAT}\` ${YT_REG}
|
||||
• **Netflix:** \`${NF_STAT}\` ${NF_REG}
|
||||
• **Disney+:** \`${DP_STAT}\` ${DP_REG}
|
||||
• **PrimeVideo:** \`${APV_STAT}\` ${APV_REG}
|
||||
• **TikTok:** \`${TK_STAT}\` ${TK_REG}
|
||||
• **ChatGPT:** \`${GPT_STAT}\` ${GPT_REG}
|
||||
*🎬 核心业务解锁*
|
||||
• **YouTube:** ${YT_STAT}
|
||||
• **Netflix:** ${NF_STAT}
|
||||
• **Disney+:** ${DP_STAT}
|
||||
• **PrimeVideo:** ${APV_STAT}
|
||||
• **TikTok:** ${TK_STAT}
|
||||
• **ChatGPT:** ${GPT_STAT}
|
||||
|
||||
*✉️ 邮局与纯净度*
|
||||
*✉️ 邮局与污染度*
|
||||
• **25 端口出站:** ${P25_TEXT}
|
||||
• **DNS 黑名单:** \`${DNS_BLACK}\` 严重 | \`${DNS_MARK}\` 轻度
|
||||
• **DNS 污染库:** 严重 \`${DNS_BLACK}\` | 轻微 \`${DNS_MARK}\`
|
||||
|
||||
_👉 [🔍 前往 Scamalytics 查阅详细 IP 报告](https://scamalytics.com/ip/${TARGET_IP})_
|
||||
_👉 [🔍 详细信用图谱直达 (Scamalytics)](https://scamalytics.com/ip/${TARGET_IP})_
|
||||
|
||||
\`[SYSTEM_REPORT]|QUALITY|${NODE_NAME}|${SCAM_SCORE}|${NF_STAT}\`"
|
||||
\`[SYSTEM_REPORT]|QUALITY|${NODE_NAME}|${SCAM_SCORE}|${RAW_NF_STAT}\`"
|
||||
|
||||
# 8. 直送指挥部
|
||||
curl -s -X POST "${TG_API_URL}" \
|
||||
|
||||
Reference in New Issue
Block a user