📋 一分钟速览:四维检测 API 集成 → 可复用检测客户端的完整路径

本文核心是一套「逐维打通 → 统一封装 → 容错加固 → 接入闭环」的 API 集成流水线:① 逐个打通谷歌 Safe Browsing / QQ微信 urlsec / 反诈 DNS / Virustotal 四个检测 API,搞清参数和返回解析 → ② 用一个 Python DetectClient 类把四维调用统一封装,detect_all() 一行拿到四维结果 → ③ 给客户端加超时、指数退避重试、并发,让它能扛生产环境 → ④ 接入告警和结果入库,形成全自动检测闭环。核心结论:把检测做成一个可复用客户端,比每次临时拼命令省 10 倍以上时间,而且结果是结构化 JSON,直接进数据库和告警

⏱ 工具:Python requests + json + concurrent.futures | 覆盖四维:谷歌 Safe Browsing / QQ微信 urlsec / 反诈 DNS / APK 文件哈希 | 零成本

为什么要把四维检测结果直接集成进自己的程序,而不是每次手动打开网页逐个测?

很多站长检测域名被红,靠的是「收藏夹里存四五个网址,每次手动打开、输入域名、看结果、截图」。这种方法在只测一两个域名、偶尔测一次时勉强能用,一旦域名多了、频率上来了,问题就暴露:手动测十个域名,光打开网页、等加载、复制结果就要半小时,还容易把「这次测的」和「上次测的」搞混。

把检测 API 集成进程序之后,差别是量级的:一条命令、一个函数调用,就能拿到四个维度的结构化 JSON 结果,可以直接写进数据库、触发告警、生成报告。下面这张图对比了「手动网页检测」和「API 集成检测」的完整流程差异:

手动网页检测 vs API 集成检测:流程对比 手动网页检测 ① 打开谷歌透明度报告 → 输入域名 ② 打开 QQ微信 urlsec → 输入域名 ③ 打开反诈 DNS → 逐个换运营商查 ④ 打开 Virustotal → 查 APK 文件 ⑤ 手动抄结果 / 截图 → 存相册 10 个域名 ≈ 30 分钟 · 结果不可结构化 API 集成检测 ① 调 detect_all(domain) 一个函数 ② 四维 API 并发/串行自动跑完 ③ 返回统一 JSON 结果 ④ 自动入库 + 状态变化告警 ⑤ 全程无人值守 10 个域名 ≈ 3 秒 · 结果结构化 JSON 结论:API 集成 = 快 600 倍 + 结果可直接进数据库、告警、报告 一次封装,永久复用;域名越多,收益越大

▲ 手动网页检测 vs API 集成检测:流程、耗时、结果可复用性三个维度全面对比

换句话说:手动检测的瓶颈不在「会不会测」,而在「每次都要重新人工重复」。API 集成把重复劳动一次性解决,剩下的就是纯粹的数据搬运。下面这张表把两者在四个维度上的差距量化说清楚:

对比维度 手动网页检测 API 集成检测
10 个域名耗时 约 30 分钟 约 3 秒(并发)
结果形态 截图 / 肉眼判断 结构化 JSON,可入库
能否自动告警 ❌ 靠人盯 ✅ 状态一变即推送
能否接入监控后台 ❌ 不行 ✅ 直接写数据库 / API

谷歌、QQ微信、反诈、APK四维检测API分别怎么调用和解析返回结果?

集成第一步,是把四个维度的检测 API 逐个打通,搞清「接口地址、认证方式、关键参数、返回判定」四个要素。四个维度的数据源分别是:谷歌用 Safe Browsing API、QQ微信用腾讯 urlsec、反诈用运营商 DNS 解析、APK 用 Virustotal 文件哈希。下面这张表先给你一个总览:

检测维度 数据源 / 接口 认证方式 返回判定
谷歌域名防红 Safe Browsing API v4 API Key(免费 1 万次/天) 返回空 = 安全;返回 matches = 命中
QQ微信防红 cgi.urlsec.qq.com 无需认证 result 字段 0/1 判断拦截
防反诈屏蔽 运营商 DNS(114/阿里/百度) 无需认证 解析结果是否为拦截页 IP
APK爆毒 Virustotal API v3 x-apikey(免费账号) 引擎检出数 > 0 = 有毒

下面用四张 step-card 逐个打通,每张都给你能直接跑的代码。

1

谷歌 Safe Browsing:POST 查询,返回空 = 安全

Safe Browsing v4 用 POST 提交域名,返回体里如果没有 matches 字段,就代表「未命中」,即谷歌没有标记这个域名。有 matches 就是被谷歌防红。

# 谷歌 Safe Browsing 域名检测(返回空 = 安全) import requests GSB_KEY = "YOUR_GSB_KEY" # Google Cloud Console 免费申请 def check_google_sb(domain): url = "https://safebrowsing.googleapis.com/v4/threatMatches:find?key=" + GSB_KEY body = { "threatInfo": { "threatTypes": ["MALWARE", "SOCIAL_ENGINEERING", "UNWANTED_SOFTWARE"], "platformTypes": ["ANY_PLATFORM"], "threatEntryTypes": ["URL"], "threatEntries": [{"url": "http://" + domain}], } } r = requests.post(url, json=body, timeout=10) return "被红" if r.json().get("matches") else "安全"
💡 Safe Browsing 的 API Key 在 Google Cloud Console 开启「Safe Browsing API」后免费获取,每天 1 万次额度,个人检测绰绰有余。
2

QQ微信 urlsec:GET 查询,看 result 字段

腾讯 urlsec 是 QQ、微信内打开链接时的安全检查接口,无需认证,直接 GET 就能拿到 JSON。关键看返回里的 result 字段:非 0 通常代表被拦截(不同场景取值略有差异,建议同时关注 eviltype 等辅助字段)。

# QQ微信 urlsec 域名检测(result 非 0 = 被拦截) def check_qq_wechat(domain): url = "https://cgi.urlsec.qq.com/index.php" params = {"m": "url", "a": "valid", "url": "http://" + domain} r = requests.get(url, params=params, timeout=10) data = r.json() result = data.get("data", {}).get("result", data.get("result", 0)) return "被拦截" if result else "安全"
💡 urlsec 无需 key、无需注册,是最容易接入的一维。但它的返回字段在不同版本偶有变化,接入时建议把整个 JSON 原文一并保存,方便日后回溯。
3

防反诈屏蔽:DNS 解析,被劫持会返回拦截页 IP

防反诈屏蔽的核心机制是运营商 DNS 劫持——被标记的域名解析结果会被指向一个反诈拦截页的 IP,而不是真实服务器 IP。检测方法就是用多个运营商 DNS 解析域名,对比解析结果是否异常。

# 防反诈屏蔽检测:用多运营商 DNS 解析,比对结果 import subprocess DNS_SERVERS = {"移动": "114.114.114.114", "阿里": "223.5.5.5", "百度": "180.76.76.76"} BLOCK_PAGE_IPS = {"127.0.0.1", "0.0.0.0"} # 常见拦截页/黑洞 IP,按需补充 def check_antifraud(domain): for name, dns in DNS_SERVERS.items(): out = subprocess.run(["dig", "+short", "@" + dns, domain], capture_output=True, text=True).stdout.strip() if not out or any(ip in out for ip in BLOCK_PAGE_IPS): return "被屏蔽(" + name + ")" return "正常解析"
💡 反诈屏蔽有地域差异——同一域名在移动网络被屏蔽、在电信网络正常很常见。所以一定要多运营商交叉解析,单个 DNS 结果不能下结论。
4

APK爆毒:Virustotal 文件哈希 / 域名报告

APK 爆毒这一维,检测的是「你的 APK 文件有没有被安全引擎报毒」。用 Virustotal API v3,先算 APK 文件的 SHA-256,再提交查询,看有多少引擎检出。

# APK 爆毒检测:算文件哈希 → Virustotal 查检出数 import hashlib VT_KEY = "YOUR_VT_KEY" # Virustotal 账号免费获取 def check_apk(apk_path): sha = hashlib.sha256(open(apk_path, "rb").read()).hexdigest() url = "https://www.virustotal.com/api/v3/files/" + sha r = requests.get(url, headers={"x-apikey": VT_KEY}, timeout=15) stats = r.json()["data"]["attributes"]["last_analysis_stats"] return stats # {malicious: N, suspicious: N, ...}
💡 APK 爆毒和域名是「连坐」关系:APK 被大量引擎报毒,往往连带下载它的域名一起被标记。所以 APK 和域名两维要一起测。

⚠️ 最容易踩的一个坑:只测一个维度就下「安全」结论

四个维度的检测是独立的——谷歌没红不代表 QQ 微信没拦,QQ 微信没拦不代表反诈没屏蔽,域名正常不代表 APK 没爆毒。正确做法永远是四维一起测、一起看,任何一维命中都要当回事。下一节封装的 detect_all() 就是为了逼你一次看全四维。

怎么用Python封装一个可复用的四维检测客户端类?

四个维度各自打通之后,如果每次还要手动拼四个函数、分别处理结果,那只是把「打开网页」换成了「跑四段代码」,还不够省事。正确做法是把四维调用统一封装成一个 DetectClient,对外只暴露一个 detect_all(domain) 方法,一行代码返回四维结果。

下面是这个客户端类的设计结构,先看整体再动手写:

DetectClient 类结构:四维方法 + 统一出口 detect_all(domain) —— 唯一对外入口 一行调用,返回四维统一 JSON check_google_sb 谷歌域名防红 check_qq_wechat QQ微信防红 check_antifraud 防反诈屏蔽 check_apk APK爆毒 _retry() 重试 / _timeout 超时 / 并发调度 统一的容错层,四个方法共用 四维方法各司其职,统一容错层兜底,detect_all 一键汇总

▲ DetectClient 类结构:四维检测方法 + 统一容错层 + detect_all 单一出口

下面是完整的客户端类代码,把前面四个维度的函数收进来,加上统一的结果格式和超时:

1

写 DetectClient 类,detect_all 一键返回四维结果

# detect_client.py —— 可复用的四维检测客户端 import requests, subprocess, hashlib, datetime class DetectClient: def __init__(self, gsb_key, vt_key, timeout=10): self.gsb_key = gsb_key self.vt_key = vt_key self.timeout = timeout # ---- 四维检测方法(前面已逐个实现,这里收进来) ---- def check_google_sb(self, domain): ... def check_qq_wechat(self, domain): ... def check_antifraud(self, domain): ... def check_apk(self, apk_path): ... # ---- 统一入口:一行拿到四维结构化结果 ---- def detect_all(self, domain, apk_path=None): result = { "domain": domain, "timestamp": datetime.datetime.now().isoformat(), "dimensions": { "谷歌域名防红": self.check_google_sb(domain), "QQ微信防红": self.check_qq_wechat(domain), "防反诈屏蔽": self.check_antifraud(domain), "APK爆毒": self.check_apk(apk_path) if apk_path else "未提供APK", } } return result # 用法: client = DetectClient(gsb_key="YOUR_GSB_KEY", vt_key="YOUR_VT_KEY") result = client.detect_all("example.com", apk_path="app.apk") print(result)
💡 返回结果统一用 dimensions 字典包四维,后续入库、告警、生成报告都直接读这个字典,格式固定、好扩展。
2

把结果落成 JSON,方便后续任意程序读取

检测客户端返回的是 Python 字典,落成 JSON 文件后,任何语言、任何脚本都能读取。这一步让「检测」和「使用检测结果」彻底解耦。

# 把四维结果落成 result.json import json json.dump(result, open("result.json", "w", encoding="utf-8"), ensure_ascii=False, indent=2) print("result.json 已生成")
💡 一旦有 JSON,后面的告警脚本、SQLite 入库、PDF 报告生成都能复用同一份数据——「一次检测,处处使用」。

检测API的限流、超时、重试和并发怎么处理,才能稳定跑在生产环境?

把客户端写出来只算「能用」,要让它「在生产环境稳定跑」,还得解决四个现实问题:免费 API 有配额限流、网络会抖动超时、偶发失败要重试、多个域名要并发。缺了这四样,你的客户端在测试时好好的,一上量就各种崩。下面这张表先把四个问题和对应策略列清楚:

问题 症状 应对策略 建议参数
限流 (Rate Limit) HTTP 429 报错 请求间加间隔 + 尊重 Retry-After 单维 ≥ 200ms 间隔
超时 (Timeout) 请求一直挂起 每个请求设 timeout 10~15 秒
偶发失败 网络抖动 / 5xx 指数退避重试 最多 3 次,退避 1/2/4 秒
批量域名 串行太慢 线程池并发 并发数 4~8

下面三步把「限流、超时、重试、并发」逐个落地。核心是给客户端加一个统一的 _retry() 装饰器,让四个维度的方法都自动获得重试和超时能力,而不是每个方法里各写一遍。

1

给所有请求加超时 + 指数退避重试

用一个 _retry 装饰器包住请求逻辑:失败或超时就按 1 秒、2 秒、4 秒退避重试,最多 3 次。四个维度的方法都不用改,套上装饰器就自动获得重试能力。

# 统一的指数退避重试装饰器 import time, functools def retry(times=3, base=1.0): def deco(fn): @functools.wraps(fn) def wrapper(*a, **kw): for i in range(times): try: return fn(*a, **kw) except Exception as e: if i == times - 1: return "检测失败:" + str(e) time.sleep(base * (2 ** i)) # 1s → 2s → 4s return wrapper return deco # 用法:给四个检测方法套上装饰器 @retry(times=3) def check_google_sb(self, domain): ... # 内部请求必须带 timeout=10
💡 退避重试的关键是「只重试幂等请求」——四维检测都是只读查询,重试安全;换成有副作用的写操作就不能这么套。
2

处理限流:请求间加间隔 + 尊重 Retry-After

免费 API 都有配额,尤其 Virustotal 免费版每分钟只有 4 次请求。遇到 429 时,应该读取响应头里的 Retry-After 字段,按它指定的秒数等待,而不是盲目重试。

# 限流友好:遇到 429 尊重 Retry-After 头 def _get(url, **kw): r = requests.get(url, timeout=10, **kw) if r.status_code == 429: wait = int(r.headers.get("Retry-After", 5)) time.sleep(wait) r = requests.get(url, timeout=10, **kw) return r
💡 Virustotal 免费版限流严格(4 次/分钟),批量检测 APK 时一定要加间隔,否则连续 429 会被临时封 key。
3

用线程池并发检测批量域名

检测 50 个域名,串行要几十秒甚至几分钟(APK 维最慢)。用 ThreadPoolExecutor 并发,把总耗时压到和单个域名差不多。注意并发数别开太高,否则撞限流。

# 线程池并发检测批量域名 from concurrent.futures import ThreadPoolExecutor domains = ["a.com", "b.com", "c.com", ...] # 你的域名列表 with ThreadPoolExecutor(max_workers=4) as pool: results = list(pool.map(client.detect_all, domains)) for r in results: print(r["domain"], r["dimensions"])
💡 并发数建议 4~8:太小没提速,太大撞限流。APK 维受 Virustotal 配额限制,可单独降并发、加间隔。
❌ 常见误区:「检测脚本一次跑通就能上生产,不用管限流和重试」

很多人在本地测通一次就以为万事大吉。真实生产环境里,限流 429、网络超时、5xx 偶发错误是常态而非例外——尤其免费 API 配额低,批量一跑就触发。不做重试和限流处理,脚本上量第一天就可能大面积报错,漏掉关键的被红告警。正确做法是:从第一版就把超时、退避重试、限流间隔一起做进去,后面才省心。

集成完成后怎么接告警和结果入库,形成全自动检测闭环?

客户端写好了、容错也加固了,最后一步是把「检测」接进你的业务闭环:结果入库 → 状态变化告警 → 定时运行。这样你的域名安全就从「想起来才测一次」变成「全天候自动盯防」。下面三步落地:

1

四维结果写入 SQLite,形成可追溯历史

把每次 detect_all 的结果写进 SQLite 表,就能积累检测历史,日后要查「哪天开始被红」直接 SQL 一查就有。

# 四维结果写入 SQLite import sqlite3 conn = sqlite3.connect("detect.db") conn.execute("""CREATE TABLE IF NOT EXISTS results( domain TEXT, ts TEXT, gsb TEXT, qq TEXT, fz TEXT, apk TEXT)""") conn.execute("INSERT INTO results VALUES (?,?,?,?,?,?)", ( result["domain"], result["timestamp"], result["dimensions"]["谷歌域名防红"], result["dimensions"]["QQ微信防红"], result["dimensions"]["防反诈屏蔽"], result["dimensions"]["APK爆毒"], )) conn.commit()
💡 历史库是「告警」和「趋势分析」的基础——只有先有历史,才能比对出「状态变了」。
2

状态一变就推送告警(Telegram / 企业微信)

每次检测完,和上一次的结果比对,四维任何一维从「安全」变成「被红」,立刻推送告警。这样被红的第一时间你就知道,而不是等用户来投诉。

# 状态变化告警:从安全→被红 时推送 if result["dimensions"]["谷歌域名防红"] != last["dimensions"]["谷歌域名防红"]: requests.get("https://api.telegram.org/botYOUR_TOKEN/sendMessage", params={"chat_id": "YOUR_CHAT", "text": "⚠️ 域名状态变化: " + result["domain"]})
💡 告警文案里带上域名、变化的维度、前后状态、时间戳,方便收到后直接定位问题。
3

挂到 crontab,定时自动运行

把整个客户端 + 入库 + 告警串成一个脚本,交给 crontab 定时跑。参考四大平台数据库刷新时间(谷歌约 2 小时、反诈约 4 小时、QQ微信约 6 小时),建议每天固定几个时间点运行。

# crontab -e 添加:每天 9:00 / 15:00 / 21:00 自动跑检测闭环 0 9 * * * cd /root/detect && python3 run.py >> /var/log/detect.log 2>&1 0 15 * * * cd /root/detect && python3 run.py >> /var/log/detect.log 2>&1 0 21 * * * cd /root/detect && python3 run.py >> /var/log/detect.log 2>&1
💡 到这里,你就拥有了一套「自动检测 + 历史入库 + 状态告警」的完整域名安全监控闭环,全部基于免费 API 和自建脚本。
✅ 推荐落地顺序(一次搭好,长期受益)

第 1 步:逐个打通四维检测 API → 第 2 步:封装 DetectClient 类,detect_all 一行出结果 → 第 3 步:加超时、退避重试、限流、并发 → 第 4 步:结果入库 + 状态变化告警 + crontab 定时。
整套零成本、纯开源工具,一次写完之后每天自动运行,你只需要在被红告警响起来的时候去处理。

客户怎么说?

"我们的棋牌APP之前每天被封,接入Ai防红后连续运营90天零封禁。"

——某东南亚游戏运营商,月付1500U套餐

"谷歌防红提交后24小时解除Safe Browsing警告,比自己申诉快10倍。"

——某海外贸易平台,使用谷歌防红500U/月

"以前几十个域名要专人每天手动打开网页测,累还总漏。后来把四维检测API封装成客户端挂到crontab,状态一变自动告警,人工全省了。"

——某批量域名运营者,用API集成方案替代人工检测后人力成本下降80%

不想自己写代码集成?怎么用333Check免费拿到四维检测结果?

本文教你用免费 API 自己把四维检测集成进程序——完全可以零成本自建。
如果你希望跳过写代码,直接拿到覆盖谷歌域名防红、QQ微信防红、防反诈屏蔽、APK爆毒四维的结构化检测结果,联系 @AICDN 免费测试。
我们帮你跑第一次全维度检测并出具结果,3 分钟出报告。

🔍 提交域名 · 免费获取四维检测结果