闲暇之余,在家里自建了个服务器,因为用的小区宽带,ip位动态分配。域名解析就是个问题,我的域名一般停放在dnspod下。dnspod有提供修改的api,就用python简单的实现了一下动态解析。这样,就不用安装花生壳了。 废话不说,看代码:
#!/usr/bin/env python#-*- coding:utf-8 -*-import httplib, urllib, urllib2import timeimport sys,osimport reimport jsonusername = '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,domainparams = {'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 nonedef 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 domaninfodef 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 recorddef 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 nonedef 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_idif __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