本文目录导读:

- 使用Cloudflare API (Python脚本)
- 从CSV文件读取批量添加
- 使用Bash脚本 (cURL + Cloudflare API)
- 使用阿里云DNS API (Python)
- 使用dnspython库 (通用)
- 安装依赖
- 使用建议
我来介绍几种批量添加DNS记录的方法:
使用Cloudflare API (Python脚本)
#!/usr/bin/env python3
import os
import requests
import json
from typing import List, Dict
# 配置
CLOUDFLARE_EMAIL = "your_email@example.com"
CLOUDFLARE_API_KEY = "your_api_key"
ZONE_ID = "your_zone_id"
DOMAIN = "yourdomain.com"
headers = {
"X-Auth-Email": CLOUDFLARE_EMAIL,
"X-Auth-Key": CLOUDFLARE_API_KEY,
"Content-Type": "application/json"
}
def add_dns_record(record_type: str, name: str, content: str, ttl: int = 120, proxied: bool = False):
"""添加单个DNS记录"""
url = f"https://api.cloudflare.com/client/v4/zones/{ZONE_ID}/dns_records"
data = {
"type": record_type,
"name": name,
"content": content,
"ttl": ttl,
"proxied": proxied
}
response = requests.post(url, headers=headers, json=data)
if response.status_code == 200:
print(f"✓ 添加成功: {name}.{DOMAIN} -> {content}")
return True
else:
print(f"✗ 添加失败: {name}.{DOMAIN} - {response.json()['errors']}")
return False
def batch_add_records(records: List[Dict]):
"""批量添加DNS记录"""
success_count = 0
fail_count = 0
for record in records:
if add_dns_record(**record):
success_count += 1
else:
fail_count += 1
print(f"\n批量添加完成: 成功 {success_count}, 失败 {fail_count}")
# 示例数据 - 从CSV文件或数组读取
records_to_add = [
{"record_type": "A", "name": "www", "content": "1.2.3.4", "ttl": 120},
{"record_type": "A", "name": "api", "content": "1.2.3.5", "ttl": 120},
{"record_type": "CNAME", "name": "blog", "content": "blog.example.com", "ttl": 300},
{"record_type": "MX", "name": "@", "content": "mail.example.com", "ttl": 300},
{"record_type": "TXT", "name": "@", "content": "v=spf1 include:_spf.example.com ~all", "ttl": 300}
]
if __name__ == "__main__":
batch_add_records(records_to_add)
从CSV文件读取批量添加
#!/usr/bin/env python3
import csv
import requests
def import_from_csv(csv_file: str):
"""从CSV文件导入DNS记录"""
with open(csv_file, 'r', encoding='utf-8') as file:
reader = csv.DictReader(file)
records = list(reader)
batch_add_records(records)
# CSV文件格式示例 (dns_records.csv):
# type,name,content,ttl,proxied
# A,www,1.2.3.4,120,false
# CNAME,blog,blog.example.com,300,false
# MX,@,mail.example.com,300,false
if __name__ == "__main__":
import_from_csv("dns_records.csv")
使用Bash脚本 (cURL + Cloudflare API)
#!/bin/bash
# 配置
CLOUDFLARE_EMAIL="your_email@example.com"
CLOUDFLARE_API_KEY="your_api_key"
ZONE_ID="your_zone_id"
DOMAIN="yourdomain.com"
# 批量添加函数
add_dns_record() {
local TYPE=$1
local NAME=$2
local CONTENT=$3
local TTL=${4:-120}
local PROXIED=${5:-false}
curl -s -X POST "https://api.cloudflare.com/client/v4/zones/$ZONE_ID/dns_records" \
-H "X-Auth-Email: $CLOUDFLARE_EMAIL" \
-H "X-Auth-Key: $CLOUDFLARE_API_KEY" \
-H "Content-Type: application/json" \
--data "{
\"type\": \"$TYPE\",
\"name\": \"$NAME\",
\"content\": \"$CONTENT\",
\"ttl\": $TTL,
\"proxied\": $PROXIED
}"
echo "添加记录: $NAME.$DOMAIN -> $CONTENT"
}
# 从文件读取记录并批量添加
while IFS=',' read -r TYPE NAME CONTENT TTL PROXIED; do
# 跳过标题行
if [ "$TYPE" != "type" ]; then
add_dns_record "$TYPE" "$NAME" "$CONTENT" "$TTL" "$PROXIED"
fi
done < "dns_records.csv"
使用阿里云DNS API (Python)
#!/usr/bin/env python3
from aliyunsdkcore.client import AcsClient
from aliyunsdkalidns.request.v20150109 import AddDomainRecordRequest
import json
# 配置阿里云
ACCESS_KEY_ID = "your_access_key_id"
ACCESS_KEY_SECRET = "your_access_key_secret"
DOMAIN = "yourdomain.com"
client = AcsClient(ACCESS_KEY_ID, ACCESS_KEY_SECRET, 'cn-hangzhou')
def add_aliyun_dns_record(record_type: str, rr: str, value: str, ttl: int = 600):
"""添加阿里云DNS记录"""
request = AddDomainRecordRequest.AddDomainRecordRequest()
request.set_DomainName(DOMAIN)
request.set_Type(record_type)
request.set_RR(rr)
request.set_Value(value)
request.set_TTL(ttl)
try:
response = client.do_action_with_exception(request)
result = json.loads(response)
print(f"✓ 添加成功: {rr}.{DOMAIN} -> {value}")
return True
except Exception as e:
print(f"✗ 添加失败: {rr}.{DOMAIN} - {e}")
return False
# 批量添加
records = [
("A", "www", "1.2.3.4"),
("A", "api", "1.2.3.5"),
("CNAME", "blog", "blog.example.com")
]
for record_type, rr, value in records:
add_aliyun_dns_record(record_type, rr, value)
使用dnspython库 (通用)
#!/usr/bin/env python3
import dns.resolver
import dns.update
import dns.query
import dns.tsigkeyring
# 配置DNS服务器
DNS_SERVER = "ns1.yourdomain.com"
ZONE = "yourdomain.com"
KEY_NAME = "your-key-name"
KEY_SECRET = "your-key-secret"
# 创建TSIG密钥
keyring = dns.tsigkeyring.from_text({
KEY_NAME: KEY_SECRET
})
def add_record_via_nsupdate(record_type: str, name: str, content: str, ttl: int = 300):
"""使用nsupdate方式添加记录"""
update = dns.update.Update(ZONE, keyring=keyring)
if record_type == "A":
update.add(name, ttl, 'A', content)
elif record_type == "CNAME":
update.add(name, ttl, 'CNAME', content)
elif record_type == "MX":
update.add(name, ttl, 'MX', content)
elif record_type == "TXT":
update.add(name, ttl, 'TXT', content)
response = dns.query.tcp(update, DNS_SERVER)
if response.rcode() == 0:
print(f"✓ 添加成功: {name}.{ZONE} -> {content}")
return True
else:
print(f"✗ 添加失败: {name}.{ZONE}")
return False
# 批量添加
records = [
("A", "www", "1.2.3.4"),
("A", "api", "1.2.3.5"),
("CNAME", "blog", "blog.example.com")
]
for record_type, name, content in records:
add_record_via_nsupdate(record_type, name, content)
安装依赖
# Cloudflare API pip install requests # 阿里云SDK pip install aliyun-python-sdk-core pip install aliyun-python-sdk-alidns # dnspython pip install dnspython
使用建议
- 记录格式建议:使用CSV文件管理记录,便于维护
- 错误处理:添加重试机制和日志记录
- 验证结果:添加后执行DNS查询验证
- 速率限制:注意API调用限制,添加延时
- 备份:批量操作前备份原有DNS记录
选择哪种方式取决于你的域名注册商和DNS提供商,Cloudflare和阿里云提供了最完善的API支持。