Python脚本实现DNSPod DNS动态解析域名

时间:2022-01-13 10:49:57

闲暇之余,在家里自建了个服务器,因为用的小区宽带,IP位动态分配。域名解析就是个问题,我的域名一般停放在DNSPod下。DNSPod有提供修改的API,就用Python简单的实现了一下动态解析。这样,就不用安装花生壳了。 废话不说,看代码:

  1. #!/usr/bin/env python 
  2. #-*- coding:utf-8 -*- 
  3.   
  4. import httplib, urllib, urllib2 
  5. import time 
  6. import sys,os 
  7. import re 
  8. import json 
  9.   
  10. username = 'xxxx' #账号 
  11. password = 'xxx' #密码 
  12. format = 'json' 
  13.   
  14. domain = [u'www.youdomain.com'] #要解析的域名 
  15.   
  16. def get_domain_info(domain): 
  17.   domain_split = domain.split('.'
  18.   domain_split_len = len(domain_split) 
  19.   maindomain = domain_split[domain_split_len - 2] + '.' + domain_split[domain_split_len - 1] 
  20.   return maindomain,domain 
  21.   
  22. params = {'login_email':username,'login_password':password,'format':format} 
  23.   
  24. def request(action, params, method = 'POST'): 
  25.   headers = {"Content-type""application/x-www-form-urlencoded""Accept""text/json"
  26.   conn = httplib.HTTPSConnection("dnsapi.cn"
  27.   conn.request(method, '/' + action, urllib.urlencode(params), headers) 
  28.   response = conn.getresponse() 
  29.   data = response.read() 
  30.   conn.close() 
  31.   if response.status == 200: 
  32.     return data 
  33.   else
  34.     return None 
  35.   
  36. def get_my_domain_id(): 
  37.   data = request('Domain.List',params) 
  38.   data = json.loads(data) 
  39.   domainlist = data.get('domains'
  40.   domaninfo = {} 
  41.   for d in domainlist: 
  42.     domaninfo[d.get('name')] = d.get('id'
  43.   return domaninfo 
  44.   
  45. def get_my_domain_record_id(domain_id): 
  46.   params['domain_id'] = domain_id 
  47.   data = request('Record.List',params) 
  48.   data = json.loads(data) 
  49.   if data.get('code') == '10'
  50.     return None 
  51.   domainname = data.get('domain').get('name'
  52.   record_list = data.get('records'
  53.   record = {} 
  54.   for r in record_list: 
  55.     if r.get('type') == 'A'
  56.       key = r.get('name') != '@' and r.get('name') + '.' + domainname or domainname 
  57.       record[key] = {'id':r.get('id'),'value':r.get('value')} 
  58.   return record 
  59.   
  60. def changerecord(domain,domain_id,record_id,ip): 
  61.   params['domain_id'] = domain_id 
  62.   params['record_id'] = record_id 
  63.   params['record_type'] = 'A' 
  64.   params['record_line'] = '默认' 
  65.   params['sub_domain'] = domain 
  66.   params['ttl'] = 600 
  67.   params['value'] = ip 
  68.   data = request('Record.Modify',params) 
  69.   
  70. def getip(): 
  71.   url = 'http://iframe.ip138.com/ic.asp' 
  72.   response = urllib2.urlopen(url) 
  73.   text = response.read() 
  74.   ip = re.findall(r'\d+.\d+.\d+.\d+', text) 
  75.   return ip[0] or None 
  76.   
  77. def updatedomaininfo(domain): 
  78.   m,sub_m = get_domain_info(domain) 
  79.   domain_id = my_domain_id_list.get(m) 
  80.   record_list = get_my_domain_record_id(domain_id) 
  81.   if record_list == None: 
  82.     return None 
  83.   rocord_info = record_list.get(sub_m) 
  84.   record_ip = rocord_info.get('value'
  85.   record_id = rocord_info.get('id'
  86.   return sub_m,record_ip,record_id,domain_id 
  87.   
  88. if __name__ == '__main__'
  89.   my_domain_id_list = get_my_domain_id() 
  90.   try
  91.     for dm in domain: 
  92.       domaindata = updatedomaininfo(dm) 
  93.       if domaindata == None: 
  94.         continue 
  95.       dnsdomain,dnsdmainip,record_id,domain_id = domaindata 
  96.       domain_name = dnsdomain.split('.')[0] 
  97.       ip = getip() 
  98.       if ip == dnsdmainip: 
  99.         continue 
  100.       else
  101.         changerecord(domain_name,domain_id,record_id,ip) 
  102.   except: 
  103.     pass