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


Posted in Python onFebruary 14, 2015

闲暇之余,在家里自建了个服务器,因为用的小区宽带,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
Python 相关文章推荐
python实现将英文单词表示的数字转换成阿拉伯数字的方法
Jul 02 Python
Python打印“菱形”星号代码方法
Feb 05 Python
python数据分析数据标准化及离散化详解
Feb 26 Python
python样条插值的实现代码
Dec 17 Python
Django框架实现分页显示内容的方法详解
May 10 Python
Django模型序列化返回自然主键值示例代码
Jun 12 Python
python基于递归解决背包问题详解
Jul 03 Python
python绘制动态曲线教程
Feb 24 Python
使用Python第三方库pygame写个贪吃蛇小游戏
Mar 06 Python
django实现模型字段动态choice的操作
Apr 01 Python
python中@property的作用和getter setter的解释
Dec 22 Python
Python基础教程,Python入门教程(超详细)
Jun 24 Python
Python压缩和解压缩zip文件
Feb 14 #Python
Python简单日志处理类分享
Feb 14 #Python
Python魔术方法详解
Feb 14 #Python
Python中非常实用的一些功能和函数分享
Feb 14 #Python
深入理解Python中的元类(metaclass)
Feb 14 #Python
Python开发常用的一些开源Package分享
Feb 14 #Python
Python中的MongoDB基本操作:连接、查询实例
Feb 13 #Python
You might like
php adodb连接带密码access数据库实例,测试成功
2008/05/14 PHP
PHP获取当前文件所在目录 getcwd()函数
2009/05/13 PHP
PHP微信支付开发实例
2016/06/22 PHP
Yii框架中sphinx索引配置方法解析
2016/10/18 PHP
jquery.mobile 共同布局遇到的问题小结
2015/02/10 Javascript
jquery图片切换插件
2015/03/16 Javascript
JQuery实现可直接编辑的表格
2015/04/16 Javascript
浅析C/C++,Java,PHP,JavaScript,Json数组、对象赋值时最后一个元素后面是否可以带逗号
2016/03/22 Javascript
vue多级多选菜单组件开发
2020/09/08 Javascript
Angular2学习教程之TemplateRef和ViewContainerRef详解
2017/05/25 Javascript
AngularJS中使用three.js的实例详解
2017/07/21 Javascript
Angular2实现组件交互的方法分析
2017/12/19 Javascript
JS实现的缓冲运动效果示例
2018/04/30 Javascript
jQuery实现每隔一段时间自动更换样式的方法分析
2018/05/03 jQuery
JS实现字符串中去除指定子字符串方法分析
2018/05/17 Javascript
详解vue 项目白屏解决方案
2018/10/31 Javascript
js中Generator函数的深入讲解
2019/04/07 Javascript
python网络编程之TCP通信实例和socketserver框架使用例子
2014/04/25 Python
python3中int(整型)的使用教程
2017/03/23 Python
Python中实例化class的执行顺序示例详解
2018/10/14 Python
Python中xml和json格式相互转换操作示例
2018/12/05 Python
Python3中lambda表达式与函数式编程讲解
2019/01/14 Python
python实现文件的备份流程详解
2019/06/18 Python
改变生活的男士内衣:SAXX Underwear
2019/08/28 全球购物
上班早退检讨书
2014/01/09 职场文书
见习期自我鉴定
2014/01/31 职场文书
舞蹈比赛获奖感言
2014/02/04 职场文书
新年寄语大全
2014/04/12 职场文书
空乘英文求职信
2014/04/13 职场文书
大学生村官座谈会发言材料
2014/05/25 职场文书
银行授权委托书样本
2014/10/13 职场文书
开展批评与自我批评发言材料
2014/10/17 职场文书
项目建议书
2015/02/04 职场文书
项目安全员岗位职责
2015/02/15 职场文书
深入浅析Redis 集群伸缩原理
2021/05/15 Redis
Python 数据可视化之Bokeh详解
2021/11/02 Python