需求:每天有大量的域名需要解析,变更,负责解析域名的妹子实属伤不起,批量更新添加的需求诞生了。
参考文档:https://github.com/DNSPod/dnspod-python
https://www.dnspod.cn/docs/index.html
注1:依据个人笨拙的编程思想,码了这么一堆代码,总算实现的添加更新功能,潜在bug尚不清楚。欢迎有兴趣的朋友一起讨论。
注2:以下代码适用于python2.6以下,如果python2.6以上的需要将代码中的:except Exception,e修改为:except Exception as e
注3:在dnsapi.apicn源代码中Ddns类中,需要把#record_type=record_type,这一行注释掉进行安装,已安装的需要把pyc文件删除,重新import即可
域名列表格式要求如下:
域名 电信IP,联通IP
www.baidu.com 1.1.1.1,2.2.2.2
www.sohu.com ,3.3.3.3
music.baidu.com 4.4.4.4,
代码如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
|
#!/usr/bin/env python #-*- coding:utf-8 -*- #who:czlinux@163.com #when:2013-08-14 import os,sys
from dnspod.apicn import *
domain_list = []
domain_dic = {}
illegal_list = []
login_email = "XXXXX"
password = "XXXXX"
domain_file = "/root/dns"
def domain_index(domain_file):
all_domain_list = []
for line in file (domain_file).readlines():
if line = = '\n' :
continue
if line[ - 1 ] = = '\n' :
line = line[: - 1 ]
all_domain_list.append( '.' .join(line.split()[ 0 ].split( '.' )[ - 2 :]))
domain_list = list ( set (all_domain_list))
api = DomainList(email = login_email,password = password)
all_msg = api().get( "domains" )
exists_list = []
for i in range ( 0 , len (all_msg)):
exists_list.append(all_msg[i].get( "name" ))
for dom in domain_list:
if dom not in exists_list:
api_create = DomainCreate(dom,email = login_email,password = password)
try :
domain_create = api_create()
all_msg = api().get( "domains" )
for n in range ( 0 , len (all_msg)):
if dom = = all_msg[n].get( "name" ):
dom_id = all_msg[n].get( "id" )
domain_dic[dom] = dom_id
except Exception,e:
illegal_list.append(dom)
#print "[Error:] %s" % e
print """\033[31m[Error]: Create domain [ %s ] Fail
.....You may not have permission to create it ! \033[0m""" % dom
else :
all_msg = api().get( "domains" )
for n in range ( 0 , len (all_msg)):
if dom = = all_msg[n].get( "name" ):
dom_id = all_msg[n].get( "id" )
domain_dic[dom] = dom_id
def add_record(domain,ip):
if len (ip.split( ',' )) = = 2 :
tel_ip = ip.split( ',' )[ 0 ]
unic_ip = ip.split( ',' )[ 1 ]
else :
print "\033[31m[Error]: IP format error...\033[0m"
#sys.exit()
sub_dom = '.' .join(domain.split( '.' )[: - 2 ])
dom_name = [ '.' .join(domain.split( '.' )[ - 2 :])]
for k,v in domain_dic.iteritems():
if k in dom_name:
domain_id = domain_dic[k]
#print sub_dom #debug
api_subdom = RecordList(domain_id,email = login_email,password = password)
try :
rec_list = api_subdom().get( "records" )
tmp_sub = []
try :
rec_list = api_subdom().get( "records" )
tmp_sub = []
for i in range ( 0 , len (rec_list)):
tmp_sub.append(rec_list[i].get( "name" ))
if sub_dom in tmp_sub:
#print "[Error]: Sub_domain [ %s.%s ] exists..." % (sub_dom,'.'.join(domain.split('.')[-2:]))
update_record(rec_list,sub_dom,domain_id, '.' .join(domain.split( '.' )[ - 2 :]),tel_ip,unic_ip)
else :
tel_record = RecordCreate(sub_dom, "A" ,u '默认' .encode( "utf8" ),tel_ip, 600 ,domain_id = domain_id,email = login_email,password = password)
unic_record = RecordCreate(sub_dom, "A" ,u '联通' .encode( "utf8" ),unic_ip, 600 ,domain_id = domain_id,email = login_email,password = password)
tel_record()
print "\033[32m[Notice]: Add record [ %s.%s ] -- [ %s ] successful!\033[0m" % (sub_dom, '.' .join(domain.split( '.' )[ - 2 :]),tel_ip)
unic_record()
print "\033[32m[Notice]: Add record [ %s.%s ] -- [ %s ] successful!\033[0m" % (sub_dom, '.' .join(domain.split( '.' )[ - 2 :]),unic_ip)
except :
print "\033[31m[Error]: Add sub_domain record some error...\033[0m"
#sys.exit()
def update_record(rec_list,sub_dom,domain_id,dom,tel_ip = " ",unic_ip=" "):
for nu in range ( 0 , len (rec_list)):
if sub_dom = = rec_list[nu].get( "name" ):
record_id = rec_list[nu].get( "id" )
if rec_list[nu].get( "line" ) = = u "默认" and tel_ip:
try :
tel_update_record = RecordDdns(record_id,sub_dom, "默认" ,domain_id = domain_id,ttl = 600 ,value = tel_ip,email = login_email,password = password)
tel_update_record()
print "\033[32m[Notice]: Update [ %s.%s ] --- [ %s ] Successful!\033[0m" % (sub_dom,dom,tel_ip)
except Exception,e:
print "[Error]: %s" % e
print "\033[31m.......... Update [ %s.%s ] --- [ %s ] Fail!\033[0m" % (sub_dom,dom,tel_ip)
elif rec_list[nu].get( "line" ) = = u "联通" and unic_ip:
try :
unic_update_record = RecordDdns(record_id,sub_dom, "联通" ,domain_id = domain_id,ttl = 600 ,value = unic_ip,email = login_email,password = password)
unic_update_record()
print "\033[32m[Notice]: Update [ %s.%s ] --- [ %s ] Successful!\033[0m" % (sub_dom,dom,unic_ip)
except Exception,e:
print "[Error]: %s" % e
print "\033[31m.......... Update [ %s.%s ] --- [ %s ] Fail!\033[0m" % (sub_dom,dom,unic_ip)
if __name__ = = '__main__' :
if os.path.isfile(domain_file):
domain_index(domain_file)
for line in file (domain_file).readlines():
if line = = '\n' :
continue
if line[ - 1 ] = = '\n' :
line = line[: - 1 ]
if illegal_list:
for g in illegal_list:
try :
line.split()[ 0 ].index(g)
except :
add_record(line.split()[ 0 ],line.split()[ 1 ])
else :
add_record(line.split()[ 0 ],line.split()[ 1 ])
else :
print "\033[31m[Error]: Domain file [ %s ]not found...\033[0m" % domain_file
sys.exit()
|