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实现telnet客户端的方法
Apr 15 Python
Python导出DBF文件到Excel的方法
Jul 25 Python
Win7下搭建python开发环境图文教程(安装Python、pip、解释器)
May 17 Python
Python 如何访问外围作用域中的变量
Sep 11 Python
python数据清洗系列之字符串处理详解
Feb 12 Python
git使用.gitignore设置不生效或不起作用问题的解决方法
Jun 01 Python
python+PyQT实现系统桌面时钟
Jun 16 Python
Python编程中flask的简介与简单使用
Dec 28 Python
python实现维吉尼亚算法
Mar 20 Python
Python 爬虫实现增加播客访问量的方法实现
Oct 31 Python
详解Python+OpenCV绘制灰度直方图
Mar 22 Python
基于Python实现将列表数据生成折线图
Mar 23 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
无线电的诞生过程
2021/03/01 无线电
PHP中“简单工厂模式”实例代码讲解
2012/09/04 PHP
php中判断文件存在是用file_exists还是is_file的整理
2012/09/12 PHP
探讨GDFONTPATH能否被winxp下的php支持
2013/06/21 PHP
使用dump函数,给php加断点测试
2013/06/25 PHP
php中return的用法实例分析
2015/02/28 PHP
php+ajax实现异步上传文件或图片功能
2017/07/18 PHP
javascript之函数直接量(function(){})()
2007/06/29 Javascript
学习从实践开始之jQuery插件开发 菜单插件开发
2012/05/03 Javascript
表单验证的完整应用案例探讨
2013/03/29 Javascript
jqGrid日期格式的判断示例代码(开始日期与结束日期)
2013/11/08 Javascript
jQuery中detach()方法用法实例
2014/12/25 Javascript
jQuery中:last-child选择器用法实例
2014/12/31 Javascript
浅谈js 闭包引起的内存泄露问题
2015/06/22 Javascript
JavaScript实现级联菜单的方法
2015/06/29 Javascript
jQuery CSS3自定义美化Checkbox实现代码
2016/05/12 Javascript
jQuery实现页面顶部下拉广告
2016/12/30 Javascript
JavaScript中数组Array.sort()排序方法详解
2017/03/01 Javascript
AngularJS表单验证功能分析
2017/05/26 Javascript
JavaScript实现焦点进入文本框内关闭输入法的核心代码
2017/09/20 Javascript
webpack 样式加载的实现原理
2018/06/12 Javascript
vue项目开发中setTimeout等定时器的管理问题
2018/09/13 Javascript
extract-text-webpack-plugin用法详解
2019/02/14 Javascript
Python实现Linux下守护进程的编写方法
2014/08/22 Python
Python判断值是否在list或set中的性能对比分析
2016/04/16 Python
Python脚本实时处理log文件的方法
2016/11/21 Python
python 编程之twisted详解及简单实例
2017/01/28 Python
python使用knn实现特征向量分类
2018/12/26 Python
TensorFlow获取加载模型中的全部张量名称代码
2020/02/11 Python
全球最大的网上自行车商店:Chain Reaction Cycles
2016/12/02 全球购物
致百米运动员广播稿
2014/01/29 职场文书
给公司的建议书范文
2014/05/13 职场文书
统计专业自荐书
2014/07/06 职场文书
单位未婚证明范本
2014/11/25 职场文书
二年级上册数学教学计划
2015/01/20 职场文书
详解Golang如何优雅的终止一个服务
2022/03/21 Golang