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实现通过pil模块对图片格式进行转换的方法
Mar 24 Python
Python函数式编程
Jul 20 Python
Python基于回溯法子集树模板解决旅行商问题(TSP)实例
Sep 05 Python
Python爬取成语接龙类网站
Oct 19 Python
浅谈python3.x pool.map()方法的实质
Jan 16 Python
python 实现提取某个索引中某个时间段的数据方法
Feb 01 Python
Python3+PyInstall+Sciter解决报错缺少dll、html等文件问题
Jul 15 Python
python实现京东订单推送到测试环境,提供便利操作示例
Aug 09 Python
python+selenium 点击单选框-radio的实现方法
Sep 03 Python
python可迭代对象去重实例
May 15 Python
Python Pivot table透视表使用方法解析
Sep 11 Python
Python 如何实现数据库表结构同步
Sep 29 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 discuz 主题表和回帖表的设计
2009/03/13 PHP
利用Memcached在php下实现session机制 替换PHP的原生session支持
2010/08/21 PHP
PHP的explode和implode的使用说明
2011/07/17 PHP
深入php self与$this的详解
2013/06/08 PHP
php实现的农历算法实例
2015/08/11 PHP
PHP递归删除多维数组中的某个值
2017/04/17 PHP
PHP数据库操作四:mongodb用法分析
2017/08/16 PHP
PHP实现模拟http请求的方法分析
2017/12/20 PHP
WordPress 插件——CoolCode使用方法与下载
2007/07/02 Javascript
JavaScript 常见对象类创建代码与优缺点分析
2009/12/07 Javascript
jQuery实现鼠标划过展示大图的方法
2015/03/09 Javascript
JS简单随机数生成方法
2016/09/05 Javascript
Jquery鼠标放上去显示全名的实现方法
2017/02/06 Javascript
js/jq仿window文件夹移动/剪切/复制等操作代码
2017/03/08 Javascript
JS倒计时实例_天时分秒
2017/08/22 Javascript
vue 微信授权登录解决方案
2018/04/10 Javascript
如何解决.vue文件url引用文件的问题
2019/01/18 Javascript
ES6入门教程之let、const的使用方法
2019/04/13 Javascript
vue2.0 实现富文本编辑器功能
2019/05/26 Javascript
使用Phantomjs和Node完成网页的截屏快照的方法
2019/07/16 Javascript
vue实现验证用户名是否可用
2021/01/20 Vue.js
[01:10:30]DOTA2-DPC中国联赛正赛 Dragon vs Dynasty BO3 第一场 3月4日
2021/03/11 DOTA
Python实现希尔排序算法的原理与用法实例分析
2017/11/23 Python
用 Python 连接 MySQL 的几种方式详解
2018/04/04 Python
Python图像处理PIL各模块详细介绍(推荐)
2019/07/17 Python
python+jinja2实现接口数据批量生成工具
2019/08/28 Python
Python列表去重复项的N种方法(实例代码)
2020/05/12 Python
css3实现文字扫光渐变动画效果的示例
2017/11/07 HTML / CSS
.net开发工程师面试题
2014/02/25 面试题
Linux如何压缩可执行文件
2014/03/27 面试题
应聘医药代表职位求职信
2013/10/21 职场文书
数学与统计学院学生个人职业生涯规划书
2014/02/10 职场文书
村道德模范事迹材料
2014/08/28 职场文书
优秀党员先进事迹材料
2014/12/18 职场文书
运动会三级跳加油稿
2015/07/21 职场文书
Android Flutter实现3D动画效果示例详解
2022/04/07 Java/Android