本文目录导读:

要用脚本批量检查域名是否可用,常见的方法是通过DNS解析或WHOIS查询来判断,下面我给你几个不同场景和语言的实现方案。
使用Shell脚本(Linux/macOS)
这是最简单的方法,利用系统自带的 dig 或 nslookup 命令。
#!/bin/bash
# 域名列表文件 (每行一个域名)
DOMAIN_FILE="domains.txt"
# 输出结果文件
AVAILABLE_FILE="available_domains.txt"
UNAVAILABLE_FILE="unavailable_domains.txt"
# 清空结果文件
> "$AVAILABLE_FILE"
> "$UNAVAILABLE_FILE"
# 遍历域名
while read -r domain; do
# 跳过空行
[ -z "$domain" ] && continue
echo "正在检查: $domain"
# 使用dig查询DNS记录,如果返回状态为NOERROR则表示已注册
if dig +short "$domain" @8.8.8.8 | grep -q .; then
echo "$domain" >> "$UNAVAILABLE_FILE"
echo " ✗ 不可用 (已注册)"
else
# 进一步检查WHOIS确认
if whois "$domain" 2>/dev/null | grep -qiE "No match|NOT FOUND|Status: free"; then
echo "$domain" >> "$AVAILABLE_FILE"
echo " ✓ 可用"
else
echo "$domain" >> "$UNAVAILABLE_FILE"
echo " ✗ 不可用 (可能被保留)"
fi
fi
# 避免请求过快被限流
sleep 0.5
done < "$DOMAIN_FILE"
echo "检查完成!"
echo "可用域名: $(wc -l < "$AVAILABLE_FILE")"
echo "不可用域名: $(wc -l < "$UNAVAILABLE_FILE")"
使用Python脚本(推荐)
Python更灵活,可以并发检查提高速度,且跨平台兼容。
#!/usr/bin/env python3
import socket
import whois
import time
from concurrent.futures import ThreadPoolExecutor, as_completed
import sys
def check_domain_available(domain, timeout=5):
"""
检查域名是否可用
返回: (domain, is_available, reason)
"""
try:
# 方法1: 检查DNS解析
socket.setdefaulttimeout(timeout)
socket.gethostbyname(domain)
# DNS有解析,说明域名已被注册
return (domain, False, "DNS已解析")
except socket.gaierror:
# DNS无解析,可能是未注册,需要进一步确认
pass
except Exception as e:
return (domain, None, f"DNS查询错误: {str(e)}")
# 方法2: WHOIS查询 (更准确)
try:
w = whois.whois(domain)
if w.status is None and w.domain_name is None:
# 无状态且无域名信息,很可能可用
# 进一步判断
if "No match for" in str(w.text).upper() or "NOT FOUND" in str(w.text).upper():
return (domain, True, "WHOIS确认可用")
return (domain, True, "疑似可用")
else:
return (domain, False, f"WHOIS状态: {w.status}")
except whois.parser.PywhoisError as e:
# whois查询失败,但通常也是未注册的迹象
if "No match" in str(e):
return (domain, True, "WHOIS无匹配")
return (domain, None, f"WHOIS错误: {str(e)}")
except Exception as e:
return (domain, None, f"其他错误: {str(e)}")
def batch_check_domains(domain_list, max_workers=10):
"""批量检查域名,使用线程池提高效率"""
available = []
unavailable = []
uncertain = []
with ThreadPoolExecutor(max_workers=max_workers) as executor:
# 提交所有任务
future_to_domain = {
executor.submit(check_domain_available, domain.strip()): domain.strip()
for domain in domain_list if domain.strip()
}
# 收集结果
for future in as_completed(future_to_domain):
domain = future_to_domain[future]
try:
domain, is_available, reason = future.result()
if is_available is True:
available.append(domain)
print(f"✓ {domain} - 可用 ({reason})")
elif is_available is False:
unavailable.append(domain)
print(f"✗ {domain} - 不可用 ({reason})")
else:
uncertain.append(domain)
print(f"? {domain} - 不确定 ({reason})")
except Exception as e:
uncertain.append(domain)
print(f"! {domain} - 检查失败: {e}")
# 加小延迟,避免触发反爬
time.sleep(0.1)
return available, unavailable, uncertain
def main():
# 从文件读取域名列表
input_file = "domains.txt"
if len(sys.argv) > 1:
input_file = sys.argv[1]
try:
with open(input_file, 'r') as f:
domains = [line.strip() for line in f if line.strip()]
except FileNotFoundError:
print(f"错误: 文件 '{input_file}' 未找到")
print("用法: python check_domains.py [域名列表文件]")
print(" 默认读取 domains.txt")
sys.exit(1)
print(f"开始检查 {len(domains)} 个域名...")
print("=" * 50)
available, unavailable, uncertain = batch_check_domains(domains, max_workers=20)
print("=" * 50)
print(f"检查完成!")
print(f"可用域名: {len(available)}")
print(f"不可用域名: {len(unavailable)}")
print(f"不确定: {len(uncertain)}")
# 保存结果
with open("available_domains.txt", "w") as f:
f.write("\n".join(available))
with open("unavailable_domains.txt", "w") as f:
f.write("\n".join(unavailable))
if uncertain:
with open("uncertain_domains.txt", "w") as f:
f.write("\n".join(uncertain))
print(f"\n结果已保存到:")
print(f" - available_domains.txt ({len(available)}个)")
print(f" - unavailable_domains.txt ({len(unavailable)}个)")
if uncertain:
print(f" - uncertain_domains.txt ({len(uncertain)}个)")
if __name__ == "__main__":
main()
安装依赖:
pip install python-whois
使用Node.js脚本
const dns = require('dns');
const whois = require('whois-json');
const fs = require('fs');
const { promisify } = require('util');
const readline = require('readline');
const dnsLookup = promisify(dns.lookup);
async function checkDomain(domain) {
// 先检查DNS
try {
await dnsLookup(domain);
return { domain, available: false, reason: 'DNS已解析' };
} catch (e) {
if (e.code !== 'ENOTFOUND') {
return { domain, available: null, reason: `DNS错误: ${e.code}` };
}
}
// WHOIS查询
try {
const result = await whois(domain);
if (!result.domainName && !result.creationDate) {
return { domain, available: true, reason: 'WHOIS无记录' };
}
return { domain, available: false, reason: '已有WHOIS记录' };
} catch (e) {
return { domain, available: null, reason: `WHOIS错误: ${e.message}` };
}
}
async function main() {
const args = process.argv.slice(2);
const inputFile = args[0] || 'domains.txt';
const domains = fs.readFileSync(inputFile, 'utf8')
.split('\n')
.map(d => d.trim())
.filter(Boolean);
console.log(`开始检查 ${domains.length} 个域名...`);
const results = [];
const concurrency = 10;
// 分批处理
for (let i = 0; i < domains.length; i += concurrency) {
const batch = domains.slice(i, i + concurrency);
const promises = batch.map(d => checkDomain(d));
const batchResults = await Promise.all(promises);
results.push(...batchResults);
// 输出进度
batchResults.forEach(r => {
const icon = r.available ? '✓' : r.available === false ? '✗' : '?';
console.log(`${icon} ${r.domain} - ${r.reason}`);
});
}
// 分类并保存结果
const available = results.filter(r => r.available === true).map(r => r.domain);
const unavailable = results.filter(r => r.available === false).map(r => r.domain);
const uncertain = results.filter(r => r.available === null).map(r => r.domain);
fs.writeFileSync('available_domains.txt', available.join('\n'));
fs.writeFileSync('unavailable_domains.txt', unavailable.join('\n'));
console.log('\n检查完成!');
console.log(`可用: ${available.length}`);
console.log(`不可用: ${unavailable.length}`);
console.log(`不确定: ${uncertain.length}`);
}
main().catch(console.error);
安装依赖:
npm install whois-json
使用方法
-
准备域名列表文件 (
domains.txt):google.com myuniquedomain123456.com example.org yourdomainxyz.net -
运行脚本:
- Shell脚本:
chmod +x check_domains.sh && ./check_domains.sh - Python脚本:
python3 check_domains.py - Node.js脚本:
node check_domains.js
- Shell脚本:
-
查看结果:
available_domains.txt- 可用的域名unavailable_domains.txt- 不可用的域名
注意事项
- WHOIS查询限制:WHOIS服务器通常有速率限制,不要并发太高
- DNS缓存:DNS结果可能有缓存,建议使用公共DNS(如8.8.8.8)
- 域名状态:有些域名虽然没被注册但被保留或限制注册
- 隐私保护:很多域名开启了隐私保护,可能影响判断
- 特殊TLD:某些顶级域(如.cn, .de)有特殊的WHOIS查询方式
如果你只需要检查顶级域名(如.com, .net),可以选择这些脚本中的任意一个,如果需要检查更多特殊域名,建议使用专业的域名注册API(如Namecheap, GoDaddy的API),这些API更准确且没有速率限制。
版权声明:NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播