简介:微信QQ域名检测接口源码包专为需要接入微信、QQ官方域名验证能力的开发者与企业准备,解决登录、分享、消息传递等场景中域名真实性校验与安全合规问题。资源共956个文件,压缩包整体约3.62MB,内容结构以JS源码、Markdown说明文档、JSON配置三类为主,同时包含TypeScript类型定义、License许可文件及命令行工具脚本,便于读者理解接口调用逻辑、查阅配置项、梳理认证流程并快速集成到自有服务中。已有357人学习下载,说明这套源码对中小团队和个人开发者都有实际借鉴意义。包内API调用示例与认证流程相关资料可直接对照官方文档展开联调;使用前需留意微信、QQ官方的授权与调用规范,避免过度请求或触碰隐私红线,在此基础上可将域名检测能力接入社交应用反欺诈、电商交易方真实性核验、企业内部通讯安全等实际业务场景。
1. 微信QQ域名检测接口源码:把官方检测能力变成自己的安全基座
很多团队在做营销落地页、短链接跳转、小程序业务域名的时候,最担心的一件事不是服务器挂了,而是域名被微信或QQ悄悄判了「风险状态」。用户点进去直接看到拦截提示,前面的投放全白干。市面上确实有各种第三方检测平台,可数据来源不明、更新慢,关键时刻还掉链子。这份「微信QQ域名检测接口源码 纯官方接口 带API.zip」的价值,在于它是直接对接官方检测能力的一套可运行源码,拿来改一改就能部署成内部的域名巡检服务,而不是一个只能看不能用的演示页。适合手里有业务域名、需要持续监测可用状态的开发者,也适合想搞懂官方检测接口调用流程的人。下面我会从接口原理讲起,一直拆到部署、参数调整和排错。
2. 接口原理与源码组成:先搞清楚检测的是「域名状态」还是「域名真伪」
2.1 官方检测接口的底层逻辑:拦截状态、风险标记与备案信息
微信和QQ的域名检测接口,本质上是把客户端里那套「访问前安全检查」的能力开放出来。你在微信里打开一个陌生链接,客户端会先向安全中心查询这个域名有没有被用户投诉、是否命中欺诈库、是不是短链跳转黑名单。官方接口做的就是这个查询动作的服务器端版本。
理解这个接口,关键要区分两个概念:域名「真实性验证」和域名「风险状态查询」。有些资料把两者混在一起,实际上接口返回的数据主要分三类。
第一类是拦截状态,也就是该域名当前是否被微信或QQ屏蔽,返回码通常用数字区分「正常」「提示风险」「完全拦截」。第二类是风险标记,比如是否命中诈骗、色情、垃圾营销等类别,这部分数据来自用户举报和平台检测,更新频率很高。第三类是基础属性,包括域名的ICP备案情况、注册主体等,用来辅助判断这个域名是不是「有主」的,而不是刚注册的野域名。
所以你在接入前最好先想清楚:你的业务要的是「防用户被骗」的质量检测,还是「防自己域名被误伤」的状态监控。两者关注点不同,调用频率和告警策略也不一样。前者需要每次用户跳转前实时查,后者只需要每分钟或每几分钟巡检一次。
2.2 源码包里的核心文件:从证书到调用示例的分工
把压缩包解开后,第一眼会看到一批类似sshpk-conv.1和.cmd的文件,容易让人误以为资源很杂。其实这是打包时把依赖库和文档一起塞进来了。真正干活的是下面这几个文件,我按用途排了个清单。
| 文件/目录 | 作用 | 使用阶段 |
|---|---|---|
api_client.py | 封装了域名检测请求的客户端,包含签名逻辑 | 核心调用 |
config.ini | 存放API密钥、应用ID、回调地址等配置 | 部署前必改 |
domain_check.py | 批量检测入口,支持从文本文件读入域名列表 | 日常巡检 |
result_parser.py | 解析接口返回的JSON,输出人类可读状态 | 结果处理 |
docs/接口说明.md | 官方文档的整理版,包含签名算法和参数表 | 二次开发参考 |
api_client.py里最先要看的是签名函数。官方接口通常要求请求带签名,防止请求被篡改。签名一般是对请求参数排序后拼接密钥做哈希。源码里写好了算法,你不需要重造轮子,但建议把签名过程完整读一遍,后面排查「返回签名错误」时能快速定位。
config.ini则是每个人的必改项。这里会填官方分配的应用ID和API密钥。注意不要把密钥硬编码到代码里,部署时用环境变量或者配置文件管理,并把这个文件加入.gitignore,否则一提交代码密钥就泄露了。另外docs/接口说明.md里有一张参数表,列了app_id、timestamp、nonce、sign、domain这几个核心字段,每个字段的取值范围和是否必填都写得很清楚。
2.3 API密钥、白名单与调用频率:官方约束下的使用边界
官方接口不是注册就能随便调的。一般来说,你需要在对应的开放平台创建一个应用,审核通过后才能拿到 API 密钥。这个密钥会绑定你的应用身份,也决定了你能调多少量。
调用频率是第一个要注意的边界。以常见的官方安全接口为例,个人认证的应用往往只有每分钟几十次的额度,企业认证会高一些。源码的批量检测模块里默认加了线程池,但如果你直接把线程数调到几十,很容易触发限流,返回错误码45009之类。所以拿到源码后第一件事,是去查你账号的实际配额,然后调整config.ini里的max_workers参数。
白名单机制也值得提。部分接口要求把服务器的出口IP加入白名单,否则请求直接被拒绝。如果你的服务器在云上,出口IP是固定的,配置一次就好;如果用了负载均衡或多地域部署,要把每个出口IP都加进去。源码里没有封装这一步,因为每个平台的设置入口不同,但它的错误码处理会明确提示你「IP不在白名单」。
还有一类容易忽略的约束是「调用用途」。官方接口的使用条款会禁止两类行为:一是把检测能力包装成开放服务给别人调用,二是用检测结果做任何形式的用户画像和隐私判断。源码可以帮你快速实现功能,但合规边界得自己守住。尤其是企业里做安全风控的,上线前最好让法务过一遍使用场景。
2.4 为什么说「纯官方接口」比第三方聚合接口更值得依赖
网上搜「域名检测接口」能出来一大堆第三方平台,但这份源码强调的是对接官方能力。第三方聚合接口看起来方便,往往一个 HTTP 请求就返回结果,可它的数据来源是什么?什么时候更新的?是否完整覆盖微信和QQ两套体系?这些都是黑匣子。
官方接口的好处是数据链路短,客户端用什么规则,你调用的就是什么规则。域名状态发生变化时,官方接口的反馈往往比第三方聚合接口早几个小时甚至一天。对做投放的人来说,这几个小时可能就是止损窗口。
当然官方接口也有短板,比如配额严格、文档分散、错误码需要自己摸索。这份源码的价值恰恰是把这个短板补上了:签名、重试、解析、告警都有人替你跑通了一版,你只需要在上面改业务逻辑。
3. 从源码到能跑的检测服务:配置、调用与返回解析
3.1 环境准备与密钥配置:让源码在本地先跑起来
先准备一个干净的 Python 3.8+ 环境。源码依赖的库不多,主要是requests和cryptography,用于发请求和做签名。安装完依赖后,先改config.ini。
[api] app_id = 你的应用ID api_key = 你的API密钥 base_url = https://api.example.com/domain/check timeout = 5 max_workers = 3 [callback] use_callback = false callback_url = sign_token =配置项里最容易被忽略的是timeout。域名检测接口在高流量时段偶尔会变慢,如果你把超时设成 3 秒,线上会频繁报「请求失败」。我一般设成 5 秒,重试次数 2 次,既不会卡太久,也能挡住瞬时抖动。
密钥不要直接写在文件里提交到仓库。常见做法是把这个文件放到部署服务器的/etc/app_config/目录,用环境变量覆盖敏感字段。源码读取config.ini后,会优先取环境变量里的值,这点在代码里已经做了兼容。
环境装好后,先不要急着跑批量。拿一个你确定「正常」的域名和一个你确定「有风险」的域名做单测,确认返回结构和文档一致。这一步半小时能省下后面一整天的排查时间。
3.2 调用检测接口的完整代码与参数说明
启动入口在domain_check.py,它支持两种输入:单域名参数或一个文本文件。下面这段是它的核心调用逻辑,我把注释写在了关键位置。
import configparser import hashlib import time import requests from concurrent.futures import ThreadPoolExecutor def build_sign(params: dict, api_key: str) -> str: """生成接口签名,按参数名排序后拼接并做MD5""" sorted_keys = sorted(params.keys()) raw = "&".join(f"{k}={params[k]}" for k in sorted_keys) + api_key return hashlib.md5(raw.encode("utf-8")).hexdigest() def check_domain(domain: str, cfg: configparser.ConfigParser) -> dict: """检测单个域名,返回接口原始JSON""" app_id = cfg.get("api", "app_id") api_key = cfg.get("api", "api_key") params = { "app_id": app_id, "domain": domain, "timestamp": str(int(time.time())), "nonce": hashlib.md5(f"{domain}{time.time()}".encode()).hexdigest()[:8], } params["sign"] = build_sign(params, api_key) resp = requests.post( cfg.get("api", "base_url"), json=params, timeout=int(cfg.get("api", "timeout")), ) resp.raise_for_status() return resp.json() if __name__ == "__main__": cfg = configparser.ConfigParser() cfg.read("config.ini") domains = ["example.com", "api.example.com", "blog.example.org"] with ThreadPoolExecutor(max_workers=int(cfg.get("api", "max_workers"))) as pool: results = pool.map(lambda d: check_domain(d, cfg), domains) for domain, res in zip(domains, results): print(domain, res)签名算法是不是非对称加密?不是,这里用的是最常见的排序后拼接密钥做 MD5。为什么要有timestamp和nonce?因为官方要防重放攻击。同一个请求如果被拦截重发,服务端靠这两个参数判断是否过期。你的服务器时间和标准时间如果差太多,就算签名正确也会返回「时间戳无效」。所以部署完第一件事是校时,用ntpdate或云平台的自动同步都行。
max_workers控制并发数。官方限流不是按每秒多少请求简单计数的,它往往按「每分钟总次数」和「瞬时 QPS」双维度限制。线程池设置成 3,每分钟跑几百个域名也够用。不要贪快,真被限流后要等一分钟才会解封,巡检任务会拖得更久。
这里还有一个细节:nonce是随机生成的,源码用了时间戳加域名做哈希。你可以改成uuid4的短字符串,效果一样,只要保证每请求唯一即可。
3.3 返回结果解析与业务接入建议
接口返回的 JSON 结构大致如下,不同平台字段名略有差异,但语义差不多:
{ "code": 0, "data": { "domain": "example.com", "status": 1, "risk_level": "safe", "category": "", "icp": "京ICP备XXXX号", "checked_at": 1710000000 } }status是关键,一般约定0表示检测失败、1表示正常、2表示提示风险、3表示完全拦截。risk_level是更细粒度的风险等级,category会给出具体分类,比如「欺诈」「色情」「广告」。icp字段是备案号,能帮你识别这个域名是不是国内正规站点。
解析模块result_parser.py里已经有类似逻辑,它会根据status和risk_level组合出一个建议动作,比如「放行」「二次验证」「直接阻断」。但我不建议你直接全盘信任默认映射。比如一个刚注册的域名,ICP备案还没下来,icp为空是很正常的,可有些默认规则会把「无备案」直接判成高风险,导致误伤。接入时最好把业务白名单优先级的逻辑放在前面:先查自己的白名单,再查接口结果。
3.4 批量检测与结果持久化:不丢数据地跑完一轮巡检
单域名调用只是热身,实际使用中你要面对的是几十上百个域名。源码里默认从domains.txt读域名,每行一个。我建议把输出落到 SQLite 或者至少是 CSV,而不是只打到控制台。
import csv import json from datetime import datetime def save_results(results: list, output_path: str = "status_log.csv") -> None: with open(output_path, "a", newline="", encoding="utf-8") as f: writer = csv.writer(f) for item in results: writer.writerow([ item.get("domain"), item.get("status"), item.get("risk_level"), datetime.now().isoformat(), json.dumps(item, ensure_ascii=False), ])这样每次巡检都留下原始返回,后面即使要回溯口径,也能找到证据。为什么强调「原始返回」?因为解析器可能升级,同样的 status 在不同版本里含义可能变。你把原始 JSON 存下来,随时可以重新解析。
4. 避坑指南:域名检测实践中的常见翻车现场
4.1 密钥泄露:配置库提交后接口被刷爆
现象:部署完第二天,后台看到调用量暴涨,额度在几分钟内耗尽,接口返回限流错误。 原因:config.ini带着明文密钥被提交到了 Git 仓库,而且仓库是公开的。有爬虫专门扫这类源码里的密钥。 解决:立刻去开放平台重置密钥;用git log找到历史提交并清理,最省事的是直接把仓库改为私有;以后所有密钥一律走环境变量或密钥管理服务,配置文件里只留占位符。我自己的做法是给.gitignore里加了三行:config.ini、*.env、status_log.csv。
4.2 新域名检测一直返回「未收录」或「无风险信息」
现象:刚买的域名,调用接口返回code=0但status是空值,或者直接提示「未收录」。 原因:官方安全库不是实时的。新域名没有任何用户访问记录,也没有举报数据,安全中心还没有给它建立档案。这种情况下接口给出的结论是「未知」,而很多新手把它当成「安全」,这是最大的误判。 解决:把「未收录」单独映射为「待观察」,不要放行也不要拦截,而是走人工审核。同时给域名做 3 到 7 天的观察期,观察期内主动访问几次,触发客户端的检查逻辑,让域名尽快进入安全库。线上如果急着用,可以临时加一个「观察期域名」专用提示页,等档案建好再切回正常流程。
4.3 接口超时:服务器到官方节点网络抖动
现象:检测脚本跑批时,随机几个域名报timeout,但用curl手动测同一个接口又是通的。 原因:批量请求时并发数过高,或者服务器与官方接口之间的网络链路存在抖动。更隐蔽的原因是本地 DNS 解析慢,每次请求都要重新解析域名。 解决:把max_workers从 10 降到 3,timeout提高到 5 秒;在系统层面把 API 域名解析结果缓存到/etc/hosts,或者改用 HTTP 连接池并开启 keep-alive。源码里用requests.Session()也能复用连接,改一行就行。如果超时集中在某些域名上,那多半是接口对特定域名返回较慢,可以给这部分域名单独设更长的超时。
4.4 检测结果与微信内实际访问不一致
现象:接口显示「正常」,但用微信打开测试链接仍然出现拦截提示。 原因:官方接口返回的是「检测时点」的安全状态,而微信客户端还叠加了本地缓存、用户举报时效、短链解析结果等因子。接口状态更新通常有 5 到 30 分钟的延迟。 解决:做告警阈值时不要用单次结果直接下结论。连续检测 3 次,每次间隔 1 分钟,如果状态一致再触发告警。对短链接场景,要检测的是跳转后的最终落地域名,而不是短链本身。另外微信里有个「停止访问该网页」的页面,用户截图给你的 URL 可能是一串带参数的长链,检测前要记得做归一化处理,去掉utm_之类的追踪参数。
4.5 异步回调地址收不到通知
现象:配置了检测完成后的异步回调,但服务器一直收不到 POST 请求。 原因:回调地址必须是公网可访问的 HTTPS 地址,且不能带路径参数。很多人在开放平台填的是http://localhost:8080/callback,自己测试时当然收不到。 解决:先用工具如ngrok临时暴露本地服务接收回调,验证签名逻辑;正式环境用 HTTPS 并固定出口 IP。源码里自带callback_verify.py,可以用来校验回调签名,防止伪造通知。收到后一定要返回 HTTP 200,否则官方会认为投递失败并按照自己的策略重试,重试超过 3 次后可能直接丢弃,导致你这边没有记录。
5. 把检测结果变成自动化运营能力:定时巡检与报警的落地技巧
5.1 用定时任务做域名健康巡检
单次检测只能看到当前状态,真正有价值的是持续巡检。把domain_check.py改成批量读文件后,用 cron 每 5 分钟跑一次,状态有变化就写日志。
*/5 * * * * cd /opt/domain-check && python3 domain_check.py --file domains.txt --output status_$(date +\%Y\%m\%d\%H\%M).json >> check.log 2>&1这里我特别建议把--output指定为带时间戳的文件,比如status_20250213_1530.json,方便事后回溯。巡检频率别超过每 3 分钟一次,官方接口的检测结果变化周期就是分钟级,太频繁只会浪费配额。
5.2 把结果接入企业微信或 QQ 机器人通知
检测到风险状态后,人工盯日志不合理。我一般会在脚本里加一个告警函数,检测到status >= 2时把域名、状态码、时间拼成消息,扔到企业微信群机器人或 QQ 频道机器人。机器人用的还是官方 Webhook,跟域名检测接口不冲突。
def send_alert(domain: str, status: int, risk_level: str) -> None: webhook_url = os.environ["ALERT_WEBHOOK_URL"] text = f"域名告警:{domain} 状态 {status},风险等级 {risk_level}" data = {"msgtype": "text", "text": {"content": text}} requests.post(webhook_url, json=data, timeout=3)注意 webhook 地址本身也是敏感信息,不要写死在代码里。另外机器人消息有频率限制,真要连续告警时加个去重:同一个域名 10 分钟内只发一次。
5.3 验证与回溯:每次上线前强制走一遍手动验证
自动巡检解决的是「已知域名」的状态变化,但新上线的域名呢?我自己的习惯是,任何新接入的域名,上线前必须跑一遍这个检测脚本,并且把返回的 JSON 原文存到发布记录里。这个动作看起来简单,却能避免很多扯皮:运营说域名被拦截了,开发说接口显示正常,两边拿的是不同时间点的数据。
除此以外,我还会对告警做一次「回放验证」:拿历史上真实拦截过的域名列表,跑一遍当前脚本和解析规则,确认所有拦截都能被识别出来。这能防止解析规则改错后,一批风险域名被静默放行。从那以后,我每次部署新域名或改跳转路径,都会强制在发布单里附上一张检测截图和原始返回。模式很笨,但确实有效。希望这个习惯和这篇拆解能帮到你,少走几步冤枉路。
本文还有配套的精品资源,点击获取