适用场景从单点检查到多维安全评分在日常运维或安全审计中站点负责人通常需要同时关注 HTTPS 证书是否即将过期、域名是否被恶意举报、ICP 备案是否合规、微信/QQ 内链接是否被拦截、以及网站首次响应速度等多项指标。过去每项指标往往需要调用不同服务或手动查询合并结果时既耗时又容易遗漏。网站安全综合评分 API 将上述五类检查封装为一次请求并在服务端完成加权计算返回一个统一的分值和等级。这使得我们可以在自动化脚本、告警系统和安全报告中快速集成用于每日巡检定时扫描资产中的域名发现证书过期或备案失效的站点。前置检查在业务切换域名或上线新站前自动化评估安全状态。大屏监控将评分数据推送到看板直观展示整体安全水位。接口能力与评分模型该 API 采用五维加权综合评分模型各维度权重如下维度权重主要检测项SSL 证书25%是否启用 HTTPS、证书剩余天数、证书链完整性域名安全20%域名是否被标记、是否存在恶意解析记录ICP 备案20%是否已完成工信部备案、备案信息是否一致微信/QQ 拦截15%域名是否被微信或 QQ 内置浏览器拦截网站性能20%首页响应时间、TCP 连接成功率最终总分范围 0–100对应等级如下等级分数区间含义A90–100优秀无需干预B75–89良好个别项建议关注C60–74中等部分指标需修复D40–59较差应尽快处理接口每次请求返回完整的诊断报告字段中包含各维度的原始得分便于开发者定位薄弱环节。请求参数与鉴权基本请求请求地址https://v1.apizero.cn/api/site-security请求方法GETQPS 限制2 次/秒超过限制将返回 429 状态码Query 参数参数名必填类型说明domain是string要检测的纯域名例如example.comHeader 鉴权参数名必填类型说明Authorization是string填入你的 API Key格式示例Bearer YOUR_API_KEY⚠️ 注意文档中的 curl 示例使用-H X-API-Key: $APIZERO_API_KEY实际请求中以Authorization头为准。请替换为你从后台获取的合法 Key。curl 请求示例可直接复制将YOUR_API_KEY替换为真实 Key将domain替换为目标域名后即可运行curl -sS \ -X GET \ -H Authorization: Bearer YOUR_API_KEY \ https://v1.apizero.cn/api/site-security?domainbaidu.com预期返回 JSON 格式响应包含code、msg和data对象。Python 代码接入requests 库在实际工程中使用 Python 进行循环调用更为常见。以下示例演示了单个域名的调用方法import requests import json API_URL https://v1.apizero.cn/api/site-security API_KEY YOUR_API_KEY # 替换为真实 Key DOMAIN baidu.com # 替换为目标域名 headers { Authorization: fBearer {API_KEY} } params { domain: DOMAIN } try: resp requests.get(API_URL, headersheaders, paramsparams, timeout10) resp.raise_for_status() result resp.json() print(json.dumps(result, indent2, ensure_asciiFalse)) except requests.exceptions.RequestException as e: print(f请求失败: {e})若需要对多个域名进行批量检测可封装为函数并加入time.sleep(0.5)控制 QPSimport time import requests def check_domain(domain, api_key): headers {Authorization: fBearer {api_key}} params {domain: domain} try: r requests.get(API_URL, headersheaders, paramsparams, timeout15) if r.status_code 200: return r.json() else: print(f域名 {domain} 返回状态码 {r.status_code}) return None except Exception as e: print(f域名 {domain} 异常: {e}) return None # 示例批量调用 domains [baidu.com, qq.com, github.com] for domain in domains: data check_domain(domain, API_KEY) if data: print(f{domain}: 总分 {data[data][overall_score]}等级 {data[data][grade]}) time.sleep(1) # 确保不超过 QPS 限制响应字段解析成功时 HTTP 状态码为 200响应体结构如下{ code: 0, msg: 成功, data: { detection_time: 4521ms, domain: baidu.com, grade: A, overall_score: 92, ssl: { days_until_expiry: 365, https_enabled: true, score: 100 } } }顶层字段字段类型说明codeint0 表示业务成功非 0 见错误码msgstring成功时为“成功”错误时描述原因dataobject诊断数据主体data 对象字段字段类型说明domainstring被检测的域名detection_timestring检测耗时如4521msoverall_scoreint综合评分 0–100gradestring等级 A–FsslobjectSSL 证书详情含days_until_expiry(剩余天数)、https_enabled(是否启用HTTPS)、score(本维度得分)domain_securityobject域名安全详情字段以实际返回为准icpobjectICP 备案详情block_statusobject微信/QQ 拦截状态performanceobject性能评分与响应时间注意文档响应示例只展示了ssl子对象实际请求中会根据五维模型返回完整字段。请以真实响应体为准字段缺失时建议做兼容处理。常见错误与处理HTTP 状态码code 字段含义处理建议4001001参数缺失domain 未提供检查请求是否包含 domain 参数4011002鉴权失败API Key 无效或未携带核对 Authorization 头是否正确4291003请求频率超过 QPS 限制2 次/秒加入重试机制等待至少 500ms 后再发5002001服务内部错误或检测网络超时稍后重试或检查域名是否可解析502/503—网关错误服务暂时不可用按指数退避策略重试如 1s, 2s, 4s在代码中建议统一捕获异常并记录日志避免单次失败导致整个巡检流程中断。工程化注意事项1. 缓存机制对于评分稳定的站点如证书剩余天数 30 天的域名可以设置缓存策略。例如将同域名、同一天的评分结果存储在 Redis 或本地文件中过期时间为 24 小时。这样既能减少 API 调用次数又能避免触发 QPS 限制。2. 异步并发控制若需要同时检测上百个域名建议使用协程如asyncioaiohttp或线程池但需要手动控制并发量以保证不超过 2 QPS。可以使用asyncio.Semaphore限制同时进行的请求数并在每次请求后添加固定延迟。3. 结果存储与告警将评分数据存入数据库如 MySQL 或 InfluxDB并设置阈值告警当grade低于 C 时发送邮件或钉钉通知。当ssl.days_until_expiry小于 30 天时提前提醒续期。4. 备用方案由于外部依赖如微信拦截检测可能偶发超时建议在主流程失败时降级处理例如返回上一次缓存的分值而不阻断整个巡检任务。5. 域名格式统一接口要求传入纯域名不要带http://或https://前缀及路径。在代码中可以先对用户输入做清洗import urllib.parse def clean_domain(raw): # 去除协议部分 if raw.startswith(http://) or raw.startswith(https://): raw urllib.parse.urlparse(raw).netloc # 去除路径和端口 return raw.split(:)[0].split(/)[0]参考文档接口文档页https://apizero.cn/aidocs/site-security原始文档Markdown 格式https://apizero.cn/aidocs/site-security/raw.md如需获取 API Key请前往用户控制台创建。本文所有代码和说明基于接口当前版本编写若后续有变更请以官方文档为准。