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模块restful使用方法实例
Dec 10 Python
Python中线程编程之threading模块的使用详解
Jun 23 Python
python 打印对象的所有属性值的方法
Sep 11 Python
Python环境搭建之OpenCV的步骤方法
Oct 20 Python
Python标准模块--ContextManager上下文管理器的具体用法
Nov 27 Python
Python中pip更新和三方插件安装说明
Jul 08 Python
Python 访问限制 private public的详细介绍
Oct 16 Python
pygame游戏之旅 添加碰撞效果的方法
Nov 20 Python
python linecache 处理固定格式文本数据的方法
Jan 08 Python
Python3.4解释器用法简单示例
Mar 22 Python
pytorch 更改预训练模型网络结构的方法
Aug 19 Python
浅谈Python数学建模之数据导入
Jun 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
PHP数组排序函数合集 以及它们之间的联系分析
2013/06/27 PHP
ThinkPHP实现ajax仿官网搜索功能实例
2014/12/02 PHP
如何通过Linux命令行使用和运行PHP脚本
2015/07/29 PHP
Symfony2安装的方法(2种方法)
2016/02/04 PHP
php函数mkdir实现递归创建层级目录
2016/10/27 PHP
thinkphp5 URL和路由的功能详解与实例
2017/12/26 PHP
PHP实现对数字分隔加千分号的方法
2019/03/18 PHP
JavaScript的Cookies
2008/01/16 Javascript
JavaScript控制按钮可用或不可用的方法
2015/04/03 Javascript
jquery实现的仿天猫侧导航tab切换效果
2015/08/24 Javascript
JS hashMap实例详解
2016/05/26 Javascript
用JavaScript获取页面文档内容的实现代码
2016/06/10 Javascript
jQuery+CSS3实现四种应用广泛的导航条制作实例详解
2016/09/17 Javascript
vue动态绑定class选中当前列表变色的方法示例
2018/12/19 Javascript
javascript设计模式 ? 代理模式原理与用法实例分析
2020/04/16 Javascript
python进程管理工具supervisor使用实例
2014/09/17 Python
python连接oracle数据库实例
2014/10/17 Python
Python读写文件方法总结
2015/06/09 Python
Python正则表达式教程之一:基础篇
2017/03/02 Python
Python之re操作方法(详解)
2017/06/14 Python
python使用标准库根据进程名如何获取进程的pid详解
2017/10/31 Python
详解python使用Nginx和uWSGI来运行Python应用
2018/01/09 Python
python如何为创建大量实例节省内存
2018/03/20 Python
python实现数据导出到excel的示例--普通格式
2018/05/03 Python
python 并发编程 非阻塞IO模型原理解析
2019/08/20 Python
学python最电脑配置有要求么
2020/07/05 Python
详解Python 中的容器 collections
2020/08/17 Python
CSS3的常见transformation图形变化用法小结
2016/05/13 HTML / CSS
潘多拉意大利官方网上商城:网上选购PANDORA珠宝
2018/10/07 全球购物
俄罗斯有趣和原创礼物网上商店:MagicMag
2019/08/01 全球购物
就业自荐书
2013/12/05 职场文书
大学生心理活动总结
2014/07/04 职场文书
民主生活会对照检查材料范文
2014/10/01 职场文书
团员年度个人总结
2015/02/26 职场文书
城管年度个人总结
2015/02/28 职场文书
Python绘制地图神器folium的新人入门指南
2021/05/23 Python