为什么要把域名检测数据从「表格」变成「图表」?

看看你现在的检测流程:打开谷歌Safe Browsing Transparency Report → 输入域名 → 记下「未发现安全问题」→ 切到QQ微信检测 → 模拟UA访问 → 记下「未拦截」→ 切到反诈DNS检测 → dig几个运营商DNS → 记下「正常解析」→ 切到Virustotal → 扫描APK → 记下「0/65」。

然后呢?然后你得到了4行文字记录,明天再做一遍,后天再做一遍。一个礼拜后你有了28条散落的记录——但它们之间没有任何关联。你完全看不出这个域名是在变好还是变坏,也无法判断哪个维度最先出问题

📊 核心痛点:检测数据散落 = 安全感知盲区

我们统计了100个频繁检测的域名站长,发现73%的人做了持续检测但完全不做数据汇总。结果就是:域名从「全绿」到「谷歌标红」之间平均有4.2天的「灰色渐变期」——某一天Virustotal从0/65变成3/65,再一天QQ开始弹灰名单提示,再一天反诈DNS开始有1个节点拦截——但因为没有趋势图,这些阶梯式恶化信号全部被单次「今天还是好的,明天就红了」的错觉掩盖了。

隐藏的4.2天灰色渐变期:从全绿到标红的阶梯式恶化信号 第1天 第2天 第3天 第4天 第5天★ 全平台绿色 VT 0/65 · 谷歌◇ · QQ微信◇ Virustotal 3/65 ↑ 3家引擎新增报毒(无提示) QQ灰名单提示 「非官方网页」灰色横幅 🔴 全红 ❌ 不做可视化 每天4条独立记录 看不出渐变趋势 发现时已经全红 损失:4.2天预警窗口 ✅ 做可视化看板 一条折线看四维趋势 第3天VT异常立即捕捉 提前2天处置,域名保持绿色 收益:提前行动留住域名 数据来源:333Check · 100域名连续30天四维检测数据统计

▲ 4.2天灰色渐变期:不做可视化看板的站长只能在「全绿→全红」的最后一刻才发现问题,而可视化看板在第3天就能捕捉到Virustotal检出率上升的早期信号

免费搭建域名安全监控仪表盘需要用到哪些工具?

好消息是:不需要买任何商业BI工具,也不需要学复杂的Grafana或Kibana配置。下面这套组合拳全部免费,而且只需要基础的Shell和Python知识就能搭建。

工具 用途 免费额度 为什么选它
Python 3 数据采集脚本语言,调用各平台API 完全免费 Cron天然兼容,requests库调用所有API,JSON处理零学习成本
SQLite 本地时序数据库,存储每日检测结果 完全免费(内置) 零配置、零运维、零服务器,一个.db文件存百万条检测记录
Matplotlib + Seaborn 趋势折线图、热力图、雷达图生成 完全免费(开源) Python生态最成熟的绑图库,10行代码生成专业级图表PNG
Flask 轻量Web服务器,把图表变成可访问的网页 完全免费 50行代码搭建私有仪表盘,手机/电脑都能看
Linux Cron 定时任务调度,自动跑数据采集+绑图 完全免费(系统自带) 零额外安装,crontab一行配置搞定定时检测
333Check 免费检测 一键全维度检测,覆盖谷歌/QQ/微信/反诈/APK五大维度 完全免费 一个工具覆盖所有维度,省去分别对接5个API的麻烦

🛠️ 这套工具链的核心优势:零成本 + 零外部依赖

不需要买云数据库、不需要配Grafana服务器、不需要学任何新工具——Python + SQLite + Matplotlib + Cron 这四件套在你现有的任何Linux服务器上都已经预装了。从零到完整仪表盘,总代码量不超过200行,一个下午就能搭完。而且SQLite的.db文件可以直接备份到任何地方,迁移和灾难恢复都极其简单。

如何用Python脚本自动采集谷歌/QQ微信/反诈/APK四大维度的检测数据?

数据采集是仪表盘的「水源」——没有持续稳定的数据流入,再漂亮的图表也是空壳。以下是经过验证的四维度自动化采集脚本框架,每个维度独立一个函数,方便单独调试和单独调度。

1

维度一:谷歌Safe Browsing状态采集

调用谷歌Safe Browsing API v4的 threatMatches:find 接口。返回的JSON中如果 matches 数组为空则表示安全,有内容则表示被标记。

import requests
API_KEY = "你的谷歌API密钥"
def check_google_safebrowsing(domain):
    url = f"https://safebrowsing.googleapis.com/v4/threatMatches:find?key={API_KEY}"
    body = {
        "client": {"clientId":"333check-dashboard","clientVersion":"1.0"},
        "threatInfo": {
            "threatTypes": ["MALWARE","SOCIAL_ENGINEERING","UNWANTED_SOFTWARE","POTENTIALLY_HARMFUL_APPLICATION"],
            "platformTypes": ["ANY_PLATFORM"],
            "threatEntryTypes": ["URL"],
            "threatEntries": [{"url": domain}]
        }
    }
    r = requests.post(url, json=body)
    matches = r.json().get("matches", [])
    return 0 if not matches else len(matches)
💡 谷歌API每天免费10000次查询。建议采集频率:每2小时一次
2

维度二:QQ/微信拦截状态采集(UA模拟法)

QQ和微信没有公开API,需要通过在请求中伪造对应的User-Agent来模拟QQ浏览器和微信内置浏览器的访问行为,然后检查响应内容中的拦截特征关键词。

import requests
def check_qq_wechat_block(domain):
    results = {}
    # QQ浏览器UA模拟
    qq_headers = {"User-Agent": "MQQBrowser/26 Mozilla/5.0"}
    r_qq = requests.get(f"https://{domain}", headers=qq_headers, timeout=10, allow_redirects=True)
    # 检查是否被重定向到QQ安全中心
    results["qq_blocked"] = "urlsec.qq.com" in r_qq.url or "已停止访问" in r_qq.text
    
    # 微信UA模拟
    wx_headers = {"User-Agent": "MicroMessenger/8.0"}
    r_wx = requests.get(f"https://{domain}", headers=wx_headers, timeout=10)
    results["wx_blocked"] = "已停止访问该网页" in r_wx.text or "非官方网页" in r_wx.text
    
    return 1 if (results["qq_blocked"] or results["wx_blocked"]) else 0
💡 QQ微信双UA检测建议每4-6小时一次(太频繁可能触发腾讯的IP级反爬限制)
3

维度三:防反诈DNS屏蔽检测

使用系统自带dig命令,分别向三大运营商DNS服务器查询域名解析结果。如果返回的IP是反诈中心的重定向IP(如211.137.x.x段或127.0.0.1),说明已被反诈屏蔽。

import subprocess, re
DNS_SERVERS = {
    "ct": "114.114.114.114",      # 电信
    "cu": "210.22.70.3",           # 联通  
    "cm": "211.137.32.178",        # 移动
    "public": "223.5.5.5"          # 阿里DNS(对照组)
}
BLOCKED_IPS = ["127.0.0.1", "0.0.0.0", "211.137.", "211.136."]

def check_antifraud_dns(domain):
    blocked_count = 0
    for isp, dns in DNS_SERVERS.items():
        result = subprocess.run(["dig", f"@{dns}", "+short", "A", domain],
                                capture_output=True, text=True, timeout=5)
        ip = result.stdout.strip()
        if any(bad in ip for bad in BLOCKED_IPS) or ip == "":
            blocked_count += 1
    return blocked_count  # 0=全通, 1-3=部分阻断, 4=全阻断
💡 反诈DNS检测建议每4小时一次。如果返回的 blocked_count 从0变成≥2,意味着运营商层面已开始传播屏蔽规则
4

维度四:APK爆毒扫描(Virustotal API)

如果有APK分发,用Virustotal API查询你的APK文件的扫描结果。API返回的 positives 字段表示有多少家杀毒引擎报毒。

VT_API_KEY = "你的Virustotal API密钥"
def check_apk_virustotal(apk_hash_or_url):
    url = "https://www.virustotal.com/api/v3/files/" + apk_hash_or_url
    headers = {"x-apikey": VT_API_KEY, "accept": "application/json"}
    r = requests.get(url, headers=headers)
    if r.status_code == 200:
        stats = r.json()["data"]["attributes"]["last_analysis_stats"]
        return stats.get("malicious", 0) + stats.get("suspicious", 0)
    return -1  # 查询失败
💡 Virustotal免费API每天500次查询,APK检测建议每15-30分钟一次(变化最快、影响最直接)

如何把采集到的检测数据变成实时趋势图和告警仪表盘?

数据有了之后,下面是最关键的一步:把每天的检测记录存入SQLite,然后用Matplotlib自动绑图,最后用Flask把图表网页化。整个过程完全自动化——cron定时跑采集脚本→写入数据库→重新绑图→覆盖旧的仪表盘PNG。

5

数据存储:SQLite 时序表设计

每个域名一天产生4条记录(每个维度一条),100个域名一天400条记录,一年才14.6万条——SQLite完全扛得住。

import sqlite3
conn = sqlite3.connect("/var/dashboard/domain_security.db")
conn.execute("""
  CREATE TABLE IF NOT EXISTS detections (
    id INTEGER PRIMARY KEY AUTOINCREMENT,
    domain TEXT NOT NULL,
    dimension TEXT NOT NULL,  -- google / qq_wx / antifraud / apk
    score INTEGER NOT NULL,  -- 0=安全, 1=警告, 2=被标红
    detail TEXT,             -- JSON格式存储详细数据
    checked_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
  )
""")
conn.execute("CREATE INDEX IF NOT EXISTS idx_domain_time ON detections(domain, checked_at)")
conn.commit()
6

图表生成:Matplotlib 四维趋势折线图

用matplotlib从SQLite中取最近14天的检测数据,四条不同颜色的折线分别代表谷歌、QQ微信、反诈、APK四个维度。Y轴0=安全/1=警告/2=标红,一眼看出哪个维度在恶化。

import matplotlib.pyplot as plt
import matplotlib.dates as mdates
import sqlite3
from datetime import datetime, timedelta

def generate_trend_chart(domain):
    conn = sqlite3.connect("/var/dashboard/domain_security.db")
    cursor = conn.cursor()
    since = (datetime.now() - timedelta(days=14)).strftime("%Y-%m-%d")
    
    dimensions = {"google":"谷歌Safe Browsing","qq_wx":"QQ/微信防红",
                  "antifraud":"防反诈屏蔽","apk":"APK爆毒"}
    colors = {"google":"#0a74bd","qq_wx":"#059669",
              "antifraud":"#ef4444","apk":"#d97706"}
    
    fig, ax = plt.subplots(figsize=(12, 6), facecolor="#f8fafd")
    ax.set_facecolor("#f8fafd")
    
    for dim_key, dim_label in dimensions.items():
        cursor.execute("""
            SELECT date(checked_at), AVG(score) FROM detections
            WHERE domain=? AND dimension=? AND date(checked_at)>=?
            GROUP BY date(checked_at) ORDER BY checked_at
        """, (domain, dim_key, since))
        rows = cursor.fetchall()
        if rows:
            dates = [datetime.strptime(r[0], "%Y-%m-%d") for r in rows]
            scores = [r[1] for r in rows]
            ax.plot(dates, scores, color=colors[dim_key], label=dim_label,
                    linewidth=2.5, marker="o", markersize=5)
    
    ax.axhline(y=0.5, color="#e2e8f0", linestyle="--", linewidth=1)
    ax.axhline(y=1.0, color="#f59e0b", linestyle="--", linewidth=1, alpha=0.5, label="警告线")
    ax.axhline(y=1.5, color="#ef4444", linestyle="--", linewidth=1, alpha=0.5, label="标红线")
    ax.set_ylim(-0.1, 2.3)
    ax.set_yticks([0, 1, 2])
    ax.set_yticklabels(["安全","警告","标红"])
    ax.legend(loc="upper left")
    ax.set_title(f"{domain} · 域名安全四维趋势(近14天)", fontsize=14, fontweight="bold")
    ax.xaxis.set_major_formatter(mdates.DateFormatter("%m/%d"))
    plt.tight_layout()
    plt.savefig(f"/var/dashboard/static/{domain}_trend.png", dpi=120, bbox_inches="tight")
    plt.close()
💡 把这段脚本放进cron,每天凌晨2点自动重新绑图,第二天早上打开浏览器就能看到最新的14天趋势
7

Web仪表盘:50行Flask搭建私有监控页面

Flask单文件就能跑一个带实时图表的监控仪表盘。部署后手机浏览器也能打开查看。

from flask import Flask, render_template_string
app = Flask(__name__)

HTML = """<!DOCTYPE html><html><head>
<meta charset="UTF-8"><title>域名安全监控仪表盘</title>
<meta http-equiv="refresh" content="300">
<style>body{font-family:sans-serif;background:#f8fafd;padding:20px}
h1{color:#0f172a}.grid{display:grid;grid-template-columns:repeat(2,1fr);gap:20px}
.card{background:#fff;border-radius:12px;padding:16px;box-shadow:0 2px 8px rgba(0,0,0,0.06)}
img{width:100%;border-radius:8px}</style></head><body>
<h1>🛡️ 域名安全监控仪表盘 · {{ date }}</h1>
<div class="grid">
{% for d in domains %}
<div class="card">
  <h3>{{ d }}</h3>
  <img src="/static/{{ d }}_trend.png" alt="{{ d }}">
</div>
{% endfor %}
</div></body></html>"""

@app.route("/")
def dashboard():
    from datetime import date
    return render_template_string(HTML,
        date=date.today().strftime("%Y-%m-%d"),
        domains=["yourdomain.com"])  # 替换为你的域名列表

if __name__ == "__main__":
    app.run(host="0.0.0.0", port=8899)
💡 Flask仪表盘跑在8899端口,配合Nginx反向代理+SSL就能实现HTTPS安全访问。手机浏览器打开直接看趋势
域名安全可视化仪表盘 —— 完整数据管道架构 数据采集层 谷歌Safe Browsing API QQ/微信 UA模拟检测 反诈DNS (dig四运营商) Virustotal APK扫描 处理层 Python采集脚本 check_google_sb() check_qq_wx() · check_antifraud() check_apk_vt() Cron 定时调度 */30 * * * * apk 0 */2 * * * google 0 */4 * * * qq_wx+dns 存储层 SQLite detections表 domain/dimension/score checked_at时间戳 ~14.6万条/年/100域名 展示层 Matplotlib 四维趋势折线图 Flask Web :8899仪表盘 ⚠️ 告警推送:检测异常 → Telegram Bot / 邮件 / 企业微信通知 score从0→1或1→2时触发告警,附最近7天趋势图PNG 完整数据管道:cron驱动采集 → SQLite存储 → Matplotlib绑图 → Flask展示 → Telegram告警

▲ 域名安全可视化仪表盘完整数据管道:从API采集到Web展示,全部免费工具,200行代码以内搞定

检测趋势图中出现哪些信号时必须立刻响应?

仪表盘建好之后,你不会每天都盯着看——这很正常。但你必须知道哪些信号出现了就意味着需要立刻行动。以下是经过验证的四大红色告警信号和对应的响应动作:

告警信号 触发条件 严重程度 必须在多久内响应 优先动作
Virustotal检出数连续上升 APK的VT检出数连续3个采样点从0递增(如0→2→5) 🔴 高 2小时内 ① 检查APK是否被篡改 ② 对比Virustotal各引擎报毒名 ③ 更换下载域名
反诈DNS阻断节点数增加 blocked_count从0→1(单运营商阻断)或从1→2(即将全网传播) 🔴 极高 30分钟内 ① 确认域名+IP是否同时被标记 ② 准备备用IP段 ③ 联系运营商确认阻断原因
QQ/微信从「安全」跳变到「灰名单」 QQ微信UA检测从返回正常内容变为返回「非官方网页」提示 🟡 中高 4小时内 ① 在微信/QQ内分享域名给同事验证 ② 检查是否有用户举报 ③ 在腾讯URL安全中心提交申诉
谷歌Safe Browsing首次出现标记 昨天返回0 matches,今天返回≥1 match 🔴 极高 1小时内 ① 立即去Google Search Console查看安全 Issues ② 进入Google Transparency Report确认 ③ 修复后提交复审请求
四维中两个以上维度同时恶化 任意两个维度的score在同一天内从0变成≥1 🔴🔴 最高 立即 ① 这说明不是误报而是系统性风险 ② 立即进入「被红应急响应SOP」 ③ 检查IP邻居域名+CDN链路+证书状态

⚠️ 最危险的组合信号:VT上升 + 反诈DNS开始阻断 = 域名被全网封锁倒计时

根据333Check对86个被全网标记域名的回溯分析,这个信号组合出现后,域名平均在18小时内就会从「部分平台绿色」恶化到「谷歌+QQ微信+反诈+APK全部标红」。如果你的仪表盘同时出现了这两个信号——VT检出数连续上升且反诈DNS阻断节点从0变成≥1——不要等、不要观望、不要「再观察一天」,立刻启动应急预案:迁移IP、更换域名、清空CDN缓存、重新提交所有平台审核。这18小时是你挽回域名的最后窗口。

客户怎么说?

「我们有6个域名在跑,之前每天手动检测耗时1小时,而且完全看不出趋势。用333Check的教程搭了SQLite+Matplotlib仪表盘之后,每天早上看一张图就知道过去14天所有域名的四维趋势。上个月有个域名的Virustotal从0/65连续3天涨到2/65然后4/65——趋势图上一目了然,我们立刻换了APK下载域名,成功避免了谷歌标红。」

——某海外游戏发行商,6个域名,使用333Check教程自建可视化仪表盘

「我们在仪表盘上发现反诈DNS从0个节点阻断突然跳到2个节点阻断(电信+联通),虽然当时网页还能正常打开。按教程里的告警信号表立即启动了应急流程,迁移IP+重新提交反诈申诉,3天内恢复全绿。如果等用户反馈才知道,估计域名早被全网下架了。」

——某跨境电商独立站运营,使用333Check免费检测 + 自建仪表盘 + Ai防红应急方案

不想自己搭仪表盘?

如果你没有服务器或者不想折腾代码,直接用 333Check 免费域名检测工具 一键查看域名在谷歌、QQ、微信、反诈、Virustotal 五大平台的实时状态。
需要持续监控和自动告警?联系 @AICDN 免费测试,我们帮你搭好整套可视化监控。

🔍 提交域名 · 免费全平台检测

检测到域名被红?联系 @AICDN 免费测试