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 Django使用forms来实现评论功能
Aug 17 Python
Python实现统计给定字符串中重复模式最高子串功能示例
May 16 Python
Python操作word常见方法示例【win32com与docx模块】
Jul 17 Python
python中break、continue 、exit() 、pass终止循环的区别详解
Jul 08 Python
python图形绘制奥运五环实例讲解
Sep 14 Python
Python csv文件的读写操作实例详解
Nov 19 Python
python 利用已有Ner模型进行数据清洗合并代码
Dec 24 Python
Ranorex通过Python将报告发送到邮箱的方法
Jan 12 Python
安装python3.7编译器后如何正确安装opnecv的方法详解
Jun 16 Python
Python selenium爬取微信公众号文章代码详解
Aug 12 Python
python实现磁盘日志清理的示例
Nov 05 Python
使用Python+OpenCV进行卡类型及16位卡号数字的OCR功能
Aug 30 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
教你如何把一篇文章按要求分段
2006/10/09 PHP
destoon实现公司新闻详细页添加评论功能的方法
2014/07/15 PHP
php浏览历史记录的方法
2015/03/10 PHP
php 数组处理函数extract详解及实例代码
2016/11/23 PHP
PHP+redis实现微博的拉模型案例详解
2019/07/10 PHP
基于php伪静态的实现方法解析
2020/07/31 PHP
Gird组件 Part-3:范例RSSFeed Viewer
2007/03/10 Javascript
js(jQuery)获取时间的方法及常用时间类搜集
2013/10/23 Javascript
IE浏览器中图片onload事件无效的解决方法
2014/04/29 Javascript
javascript实现动态改变层大小的方法
2015/05/14 Javascript
jQuery+HTML5实现图片上传前预览效果
2015/08/20 Javascript
聊一聊JS中的prototype
2016/09/29 Javascript
jQuery实现用户输入自动完成功能
2017/02/13 Javascript
PHP 实现一种多文件上传的方法
2017/09/20 Javascript
Vue使用高德地图搭建实时公交应用功能(地图 + 附近站点+线路详情 + 输入提示+换乘详情)
2018/05/16 Javascript
vue使用过滤器格式化日期
2021/01/20 Vue.js
[07:55]2014DOTA2 TI正赛第三日 VG上演推进荣耀DKEG告别
2014/07/21 DOTA
python增加矩阵维度的实例讲解
2018/04/04 Python
对python append 与浅拷贝的实例讲解
2018/05/04 Python
详解pyqt5 动画在QThread线程中无法运行问题
2018/05/05 Python
Python中分支语句与循环语句实例详解
2018/09/13 Python
详解Python匿名函数(lambda函数)
2019/04/19 Python
Django保护敏感信息的方法示例
2019/05/09 Python
pandas分区间,算频率的实例
2019/07/04 Python
pytorch sampler对数据进行采样的实现
2019/12/31 Python
pytorch自定义二值化网络层方式
2020/01/07 Python
python3爬取torrent种子链接实例
2020/01/16 Python
html+js 实现markdown编辑器效果
2019/10/23 HTML / CSS
阿联酋网上花店:Ferns N Petals
2018/02/14 全球购物
全球最受追捧的运动服品牌领先数字目的地:Stylerunner
2020/11/25 全球购物
介绍一下Linux文件的记录形式
2012/04/18 面试题
说一下Linux下有关用户和组管理的命令
2014/08/18 面试题
和解协议书
2014/04/16 职场文书
师恩难忘教学反思
2014/04/27 职场文书
小学综治宣传月活动总结
2014/07/02 职场文书
会计试用期自我评价
2015/03/10 职场文书