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在命令行下使用google翻译(带语音)
Jan 16 Python
python实现决策树分类(2)
Aug 30 Python
学习python的前途 python挣钱
Feb 27 Python
Python 使用folium绘制leaflet地图的实现方法
Jul 05 Python
OpenCV 模板匹配
Jul 10 Python
python实现猜单词游戏
May 22 Python
Python如何给函数库增加日志功能
Aug 04 Python
Pytest如何使用skip跳过执行测试
Aug 13 Python
Python使用pickle进行序列化和反序列化的示例代码
Sep 22 Python
python中的插入排序的简单用法
Jan 19 Python
Python网络编程之ZeroMQ知识总结
Apr 25 Python
Python中的套接字编程是什么?
Jun 21 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 生成唯一id的几种解决方法
2013/03/08 PHP
php对数组排序代码分享
2014/02/24 PHP
CL vs ForZe BO5 第五场 2.13
2021/03/10 DOTA
JS 文字符串转换unicode编码函数
2009/05/30 Javascript
JS 判断undefined的实现代码
2009/11/26 Javascript
JavaScript在网页中画圆的函数arc使用方法
2015/11/13 Javascript
如何解决ligerUI布局时Center中的Tab高度大小
2015/11/24 Javascript
使用postMesssage()实现跨域iframe页面间的信息传递方法
2016/03/29 Javascript
jQuery基于json与cookie实现购物车的方法
2016/04/15 Javascript
基于jQuery实现表格的查看修改删除
2016/08/01 Javascript
纯js实现html转pdf的简单实例(推荐)
2017/02/16 Javascript
原生node.js案例--前后台交互
2017/02/20 Javascript
详解vue组件化开发-vuex状态管理库
2017/04/10 Javascript
nodejs中解决异步嵌套循环和循环嵌套异步的问题
2017/07/12 NodeJs
nodejs实现OAuth2.0授权服务认证
2017/12/27 NodeJs
详解webpack模块加载器兼打包工具
2018/09/11 Javascript
JavaScript工具库之Lodash详解
2019/06/15 Javascript
在layui tab控件中载入外部html页面的方法
2019/09/04 Javascript
微信小程序自定义纯净模态框(弹出框)的实例代码
2020/03/09 Javascript
eslint+prettier统一代码风格的实现方法
2020/07/22 Javascript
Python 获取当前所在目录的方法详解
2017/08/02 Python
详解基于python-django框架的支付宝支付案例
2019/09/23 Python
使用canvas压缩图片上传的方法示例
2020/02/07 HTML / CSS
Html5 new XMLHttpRequest()监听附件上传进度
2021/01/14 HTML / CSS
NUK奶瓶美国官网:NUK美国
2016/09/26 全球购物
Gerry Weber德国官网:优质女性时装,德国最大的时装公司之一
2019/11/02 全球购物
建筑自我鉴定
2013/10/19 职场文书
会计专业毕业自荐书范文
2014/02/08 职场文书
大学生秋游活动方案
2014/02/17 职场文书
白莲教口号
2014/06/18 职场文书
学籍证明模板
2014/11/21 职场文书
歼十出击观后感
2015/06/11 职场文书
Python time库的时间时钟处理
2021/05/02 Python
python使用pymysql模块操作MySQL
2021/06/16 Python
新手入门Mysql--sql执行过程
2021/06/20 MySQL
React如何使用axios请求数据并把数据渲染到组件
2022/08/05 Javascript