闲暇之余,在家里自建了个服务器,因为用的小区宽带,IP位动态分配。域名解析就是个问题,我的域名一般停放在DNSPod下。DNSPod有提供修改的API,就用Python简单的实现了一下动态解析。这样,就不用安装花生壳了。 废话不说,看代码:
#!/usr/bin/env python
#-*- coding:utf-8 -*-
import httplib, urllib, urllib2
import time
import sys,os
import re
import json
username = \'xxxx\' #账号
password = \'xxx\' #密码
format = \'json\'
domain = [u\'www.youdomain.com\'] #要解析的域名
def get_domain_info(domain):
domain_split = domain.split(\'.\')
domain_split_len = len(domain_split)
maindomain = domain_split[domain_split_len - 2] + \'.\' + domain_split[domain_split_len - 1]
return maindomain,domain
params = {\'login_email\':username,\'login_password\':password,\'format\':format}
def request(action, params, method = \'POST\'):
headers = {\"Content-type\": \"application/x-www-form-urlencoded\", \"Accept\": \"text/json\"}
conn = httplib.HTTPSConnection(\"dnsapi.cn\")
conn.request(method, \'/\' + action, urllib.urlencode(params), headers)
response = conn.getresponse()
data = response.read()
conn.close()
if response.status == 200:
return data
else:
return None
def get_my_domain_id():
data = request(\'Domain.List\',params)
data = json.loads(data)
domainlist = data.get(\'domains\')
domaninfo = {}
for d in domainlist:
domaninfo[d.get(\'name\')] = d.get(\'id\')
return domaninfo
def get_my_domain_record_id(domain_id):
params[\'domain_id\'] = domain_id
data = request(\'Record.List\',params)
data = json.loads(data)
if data.get(\'code\') == \'10\':
return None
domainname = data.get(\'domain\').get(\'name\')
record_list = data.get(\'records\')
record = {}
for r in record_list:
if r.get(\'type\') == \'A\':
key = r.get(\'name\') != \'@\' and r.get(\'name\') + \'.\' + domainname or domainname
record[key] = {\'id\':r.get(\'id\'),\'value\':r.get(\'value\')}
return record
def changerecord(domain,domain_id,record_id,ip):
params[\'domain_id\'] = domain_id
params[\'record_id\'] = record_id
params[\'record_type\'] = \'A\'
params[\'record_line\'] = \'默认\'
params[\'sub_domain\'] = domain
params[\'ttl\'] = 600
params[\'value\'] = ip
data = request(\'Record.Modify\',params)
def getip():
url = \'http://iframe.ip138.com/ic.asp\'
response = urllib2.urlopen(url)
text = response.read()
ip = re.findall(r\'\\d+.\\d+.\\d+.\\d+\', text)
return ip[0] or None
def updatedomaininfo(domain):
m,sub_m = get_domain_info(domain)
domain_id = my_domain_id_list.get(m)
record_list = get_my_domain_record_id(domain_id)
if record_list == None:
return None
rocord_info = record_list.get(sub_m)
record_ip = rocord_info.get(\'value\')
record_id = rocord_info.get(\'id\')
return sub_m,record_ip,record_id,domain_id
if __name__ == \'__main__\':
my_domain_id_list = get_my_domain_id()
try:
for dm in domain:
domaindata = updatedomaininfo(dm)
if domaindata == None:
continue
dnsdomain,dnsdmainip,record_id,domain_id = domaindata
domain_name = dnsdomain.split(\'.\')[0]
ip = getip()
if ip == dnsdmainip:
continue
else:
changerecord(domain_name,domain_id,record_id,ip)
except:
pass