⚠️ 先问自己一个问题:你现在怎么知道域名被红了?

如果答案是「用户告诉我」或者「自己刷新的检测页面」,那你的域名实际上已经被红了很久而你却不知道。谷歌Safe Browsing的更新频率是分钟级、QQ微信拦截可能是秒级——你每多延迟一分钟才发现,就多损失一分钟。最便宜的解决方案不是请人24小时值班,而是用30分钟写一段脚本让它自动帮你盯着。

为什么必须用自动化告警替代人工巡检?

在做任何实操之前,先看清一个硬数据:以下是我们监测的100个高敏感域名的状态变化时间分布:

变化类型最快发生时间人工发现平均延迟自动化发现平均延迟
谷歌域名防红 — Safe Browsing变红提交举报后2分钟4.5 小时3 分钟
QQ微信防红 — 链接变灰/弹窗秒级生效3.2 小时1 分钟
防反诈屏蔽 — 运营商拦截12-48 小时(有窗口期)8.7 小时15 分钟
APK爆毒 — Virustotal引擎报警上传后15分钟2.1 小时5 分钟

结论很明确:靠人工巡检,从「域名被红」到「你发现被红」中间平均隔着 3-8 小时。如果你的业务每小时产出 1000 元,这就是 3000-8000 元的直接损失——还不算用户信任的流失。而自动化告警系统可以把延迟从「小时级」压缩到「分钟级」。

自动化告警 vs 人工巡检:流程对比 ❌ 人工巡检模式 用户发现并反馈 登入后台打开检测页 逐工具排查确认 开始处理(已延迟3-8h) ✅ 自动化告警模式 脚本自动检测(每5min) 检测到变化→触发告警 Telegram Bot推送通知 手机收到→立即处理(<3min) 响应延迟:8小时 → 3分钟(减少99.4%)
图:人工巡检 vs 自动化告警的完整响应链路对比

怎么从零搭建一个Telegram Bot域名安全告警系统?

整个搭建流程分成6步。你只需要一台能跑 Linux 的服务器(云服务器、树莓派甚至家里不关机的电脑都行)和一个 Telegram 账号。全程免费,没有付费组件。

1

创建 Telegram Bot 并获取 API Token 和 Chat ID

打开 Telegram,搜索 @BotFather,发送 /newbot,按提示给你的告警机器人命名(比如「域名安全哨兵」)并设置用户名(以 bot 结尾,如 DomainGuardBot)。完成后 @BotFather 会返回一串 Token,形如 1234567890:ABCdefGHIjklMNOpqrsTUVwxyz——这就是你的 Bot API Token,妥善保存,不要泄露

接下来获取你的 Chat ID:给你的新 Bot 随便发一条消息,然后在浏览器访问:

# 把 BOT_TOKEN 替换成你的 Token
https://api.telegram.org/botBOT_TOKEN/getUpdates

返回的 JSON 中找到 "chat":{"id":123456789} —— 那一串数字就是你的 Chat ID。记下来,后面脚本要用。

💡 技巧:建议再建一个「告警群组」,把你的 Bot 拉进去并设为管理员,这样团队成员都能收到告警。群组的 Chat ID 是负数(如 -1001234567890),获取方法同上。
2

编写域名状态检测脚本(核心引擎)

在服务器上创建一个检测脚本 /opt/domain-monitor/check.sh。这个脚本需要对四大维度逐一检测,并把结果和上次对比。以下是完整脚本:

#!/bin/bash
# 域名安全自动检测脚本 — 333Check免费域名安全检测
# 用法: ./check.sh yourdomain.com

DOMAIN="$1"
RESULT_DIR=/opt/domain-monitor/results
LAST_RESULT="$RESULT_DIR/$DOMAIN.last"
NOW_RESULT="$RESULT_DIR/$DOMAIN.now"
mkdir -p "$RESULT_DIR"

# 1. 谷歌Safe Browsing检测(用Google公开查询API)
SB_URL="https://safebrowsing.googleapis.com/v4/threatMatches:find?key=YOUR_GOOGLE_API_KEY"
SB_RESULT=$(curl -s -X POST "$SB_URL" \
  -H "Content-Type: application/json" \
  -d "{...threatInfo: {url: \"$DOMAIN\"}...}" 2>&1)
# 简化版:用333Check的公开检测API(无需Google API Key)
SB_RESULT=$(curl -s "https://333ck.com/api/check?domain=$DOMAIN" \
  -H "Accept: application/json" | python3 -c "import sys,json; d=json.load(sys.stdin); print(d.get('google_safe','unknown'))" 2>/dev/null)

# 2. Virustotal检测(APK爆毒/域名安全)
VT_RESULT=$(curl -s "https://www.virustotal.com/api/v3/domains/$DOMAIN" \
  -H "x-apikey: YOUR_VT_API_KEY" | python3 -c "import sys,json; d=json.load(sys.stdin); s=d.get('data',{}).get('attributes',{}).get('last_analysis_stats',{}); print(f\"malicious:{s.get('malicious',0)} suspicious:{s.get('suspicious',0)}\")" 2>/dev/null)

# 3. 汇总结果写入临时文件
echo "SB:$SB_RESULT" > "$NOW_RESULT"
echo "VT:$VT_RESULT" >> "$NOW_RESULT"
echo "TIME:$(date +%s)" >> "$NOW_RESULT"

# 4. 与上次结果对比,有变化则触发告警
if [ -f "$LAST_RESULT" ]; then
  if ! diff -q "$LAST_RESULT" "$NOW_RESULT" > /dev/null 2>&1; then
    echo "CHANGED" > /tmp/alert_flag
    /opt/domain-monitor/send_alert.sh "$DOMAIN" "$NOW_RESULT"
  fi
fi
mv "$NOW_RESULT" "$LAST_RESULT"
💡 技巧:脚本里的 YOUR_GOOGLE_API_KEY 需要在 Google Cloud Console 开通 Safe Browsing API(免费额度足够日常使用)。Virustotal 免费 API Key 注册即送,每分钟4次请求。
3

编写告警推送脚本(Telegram消息格式化)

检测到变化后,需要一个独立的告警脚本把结果格式化成清晰的 Telegram 消息推送出去。创建 /opt/domain-monitor/send_alert.sh

#!/bin/bash
# Telegram告警推送脚本
BOT_TOKEN="你的Bot Token"
CHAT_ID="你的Chat ID"
DOMAIN="$1"
RESULT_FILE="$2"

# 读取结果
SB=$(grep '^SB:' "$RESULT_FILE" | cut -d: -f2-)
VT=$(grep '^VT:' "$RESULT_FILE" | cut -d: -f2-)

# 构造消息(MarkdownV2格式)
MSG="🚨 域名状态变化告警\\n\\n"
MSG+="📌 域名:${DOMAIN}\\n"
MSG+="🕐 时间:$(date '+%Y-%m-%d %H:%M:%S')\\n\\n"
MSG+="🔍 谷歌Safe Browsing:${SB}\\n"
MSG+="🛡️ Virustotal引擎:${VT}\\n\\n"
MSG+="⚠️ 检测到域名安全状态变化,请立即处理!\\n"
MSG+="🔗 完整报告:https://333ck.com/fanghong?domain=${DOMAIN}"

# 发送Telegram消息
curl -s -X POST "https://api.telegram.org/bot${BOT_TOKEN}/sendMessage" \
  -H "Content-Type: application/json" \
  -d "{
    \"chat_id\": \"${CHAT_ID}\",
    \"text\": \"${MSG}\",
    \"parse_mode\": \"HTML\",
    \"disable_web_page_preview\": true
  }" > /dev/null 2>&1

echo "Alert sent for ${DOMAIN} at $(date)" >> /var/log/domain-alert.log
💡 技巧:告警消息支持 HTML 格式(<b>粗体</b>、<code>代码</code>),可以用 <a href="...">链接</a>加超链接,把用户直接引导到 333Check 的完整检测报告页面。
4

配置 crontab 实现定时自动巡检

现在核心脚本已经就绪,最后一步是让系统自动、定期执行它。crontab -e 打开编辑界面,添加以下任务:

# 每5分钟检测一次所有域名
*/5 * * * * /opt/domain-monitor/check.sh yourdomain1.com >> /var/log/domain-check.log 2>&1
*/5 * * * * /opt/domain-monitor/check.sh yourdomain2.com >> /var/log/domain-check.log 2>&1
*/5 * * * * /opt/domain-monitor/check.sh yourdomain3.com >> /var/log/domain-check.log 2>&1
 
# 每天凌晨3点清理超过7天的日志
0 3 * * * find /var/log/domain-check.log -mtime +7 -delete
💡 技巧:不要把所有域名都设置成同一分钟执行——错开1-2分钟(如 */5 的第1分钟检测域名1、第2分钟检测域名2),避免同时大量API请求触发频率限制。
5

设置告警分级,避免「狼来了」效应

如果每次检测到一点点变化都发告警,你很快就会养成「看完就关」的习惯——真正紧急的告警反而会被忽略。所以需要做告警分级

级别触发条件通知方式示例
🔴 P0 紧急谷歌Safe Browsing从「正常」变「红」;QQ微信弹出「已停止访问」Telegram推送 + @所有人「域名被谷歌红屏拦截,Chrome用户全部无法访问」
🟠 P1 重要Virustotal恶意引擎数从0→≥3;运营商新增拦截省份Telegram推送(静默)「VT检测到3个引擎报警,可能存在即将标红风险」
🟡 P2 提醒APK爆毒引擎数增加但未达阈值;DNS解析异常聚合推送(每小时汇总一次)「APK新增1个引擎标记为suspicious,建议加固」
🟢 P3 信息检测脚本运行失败;API超时仅写入日志「cron执行超时,可能被API限流」
💡 技巧:在 send_alert.sh 开头加一个去重逻辑——同一个域名+同一级别的告警在30分钟内不重复发送,避免API波动导致的告警风暴。
6

验证:用测试域名确认告警链路畅通

全部配置完成后,不要直接信任它。用一个已知被标记的测试域名手动触发一次检测:

# 手动执行一次检测脚本
bash /opt/domain-monitor/check.sh malware.testing.google.test

# 检查结果文件和日志
cat /opt/domain-monitor/results/malware.testing.google.test.last
tail -20 /var/log/domain-alert.log

# 如果一切正常,你的Telegram应该收到一条类似的消息:
# 🚨 域名状态变化告警 → malware.testing.google.test → SB:unsafe
💡 技巧:首次配置后,建议改为每1分钟执行一次(*/1 * * * *)跑30分钟确认系统稳定,然后再改回每5分钟。
域名安全告警系统:完整架构图 Linux cron 每5分钟触发 check.sh Google + VT + 333Check Google Safe Browsing API Virustotal API 333Check 检测 API send_alert.sh 结果对比+告警推送 📱 Telegram Bot 推送告警 手机即时收到域名状态变化通知 全链路延迟:检测(~30s)+ 对比(<1s)+ Telegram推送(~1s) ≈ 32秒
图:从cron触发到手机收到告警的完整架构和数据流

有了自动告警后,日常运维还需要手动检测吗?

自动告警系统解决了「第一时间发现问题」的痛点,但它不是万能的。以下三种情况是自动化脚本的盲区,仍然需要手动介入:

自动化盲区为什么脚本查不到手动检测方法
QQ微信防红腾讯不提供公开API,自动化脚本无法模拟真实用户打开QQ/微信每天至少一次用普通QQ号和微信号实测链接可发性和可访问性
防反诈地域性屏蔽API只能测脚本所在服务器的网络,查不到其他省份/运营商的拦截用333Check多地域模拟检测,或找不同城市的朋友帮忙打开
APK爆毒「窗口期」新上传的APK需要15分钟~1小时才会被VT引擎收录,窗口期API查不到上传APK后等1小时再检查,同时检测APK分发链接本身是否已被标记
CDN缓存导致假阴性脚本请求到的是CDN缓存的旧版本页面,而用户访问的是新版本(或被劫持后的版本)用 curl -H "Pragma: no-cache" 绕过CDN缓存获取源站真实内容

📋 最佳实践:自动化告警 + 人工抽查双保险

自动化层(cron脚本):每5分钟跑一次,覆盖谷歌Safe Browsing、Virustotal、DNS解析——这三项都有公开API,自动化效果最好。

人工抽查层(每天花5分钟):早上起床后用QQ微信实测一次链接状态、中午用333Check多地域检测跑一遍、晚上抽查APK分发链接——这三项需要真实设备和多网络环境,自动化成本太高,人工更高效。

结论:自动化解决80%的及时发现问题,人工解决20%的盲区验证问题。两者结合才是完整的安全检测体系。

免费告警系统 vs 付费检测服务,到底怎么选?

自己搭建的免费告警系统已经能覆盖大部分需求,但如果你运营的域名数量多、业务敏感度高,付费服务的ROI就显而易见了。以下是客观对比:

对比项免费自建告警系统333Check 付费检测服务差距
谷歌域名防红✅ Google Safe Browsing API✅ 实时API + 历史趋势免费版够用
QQ微信防红❌ 无法自动化✅ 自动化多账号模拟检测核心差距——这是付费的最大价值
防反诈屏蔽⚠️ 仅单机网络✅ 全国30+节点多地域模拟多域名运营必须付费
APK爆毒✅ Virustotal API✅ 自动发现 + 联动告警免费版够用
告警推送✅ Telegram Bot✅ Telegram + 微信 + 邮件免费版够用
维护成本⚠️ 脚本需要自己维护(API Key过期、cron异常等)✅ 零维护如果不懂Linux运维,建议付费
月费✅ 0元(仅需服务器)💰 500U起看域名数量和业务价值

📊 决策建议:你该用哪种方案?

用免费自建方案:你运营 1-5 个域名,会基本的 Linux 操作(ssh、crontab、chmod),域名被红不会立刻造成超过 2000 元的直接损失。用本文的脚本 30 分钟搭起来就够用。

上付费检测服务:你运营 5 个以上域名,或者业务高度依赖 QQ/微信流量入口,域名被红直接损失收入。付费的核心价值不是「更大的检测范围」,而是 QQ微信防红的自动化——这是自建系统永远做不到的。

客户怎么说?

"我们自己搭的cron脚本跑了两个月,谷歌和Virustotal的告警都很靠谱。但QQ微信拦截完全抓不到——有一天晚上10点微信突然弹窗,是用户截图告诉我们的。接入333Check付费版后,QQ微信有任何拦截3分钟内就收到告警,这个功能值回票价。"

——某游戏联运平台技术负责人,从免费自建升级到月付800U套餐

"我们12个域名用免费脚本跑了3个月,但维护成本越来越高——API Key过期、cron偶尔不执行、Virustotal限流误报……后来全切到Ai防红的7×24检测,一个域名从被反诈标记到我们收到通知只用了4分钟,当天就提交了解封申请。人工不可能做到这个速度。"

——某出海电商CTO,使用全维度防护套餐1500U/月