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自定义函数的创建、调用和函数的参数详解
Mar 11 Python
对于Python装饰器使用的一些建议
Jun 03 Python
Python字典创建 遍历 添加等实用基础操作技巧
Sep 13 Python
Python使用requests提交HTTP表单的方法
Dec 26 Python
Python基于opencv实现的简单画板功能示例
Mar 04 Python
Python使用正则表达式分割字符串的实现方法
Jul 16 Python
Django实现发送邮件功能
Jul 18 Python
对python中list的五种查找方法说明
Jul 13 Python
python的flask框架难学吗
Jul 31 Python
Python+OpenCV图像处理—— 色彩空间转换
Oct 22 Python
Django用户认证系统如何实现自定义
Nov 12 Python
python神经网络学习 使用Keras进行回归运算
May 04 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中在foreach中使用foreach ($arr as &$value) 这种类型的解释
2013/06/24 PHP
php验证码实现代码(3种)
2015/09/07 PHP
LAMP环境使用Composer安装Laravel的方法
2017/03/25 PHP
PHP正则删除HTML代码中宽高样式的方法
2017/06/12 PHP
很可爱的输入框
2008/08/03 Javascript
js中格式化日期时间型数据函数代码
2010/11/08 Javascript
javascript简易缓动插件(源码打包)
2012/02/16 Javascript
Javascript面向对象编程
2012/03/18 Javascript
javascript创建函数的20种方式汇总
2015/06/23 Javascript
更高效的使用JQuery 这里总结了8个小技巧
2016/04/13 Javascript
AngularJS+Bootstrap实现多文件上传与管理
2016/11/08 Javascript
JS敏感词过滤代码
2016/12/23 Javascript
javascript图片预览和上传(兼容IE)
2017/03/15 Javascript
Vue表单及表单绑定方法
2018/09/04 Javascript
vue使用代理解决请求跨域问题详解
2019/07/24 Javascript
websocket4.0+typescript 实现热更新的方法
2019/08/14 Javascript
nuxt 每个页面head标签内容设置方式
2020/11/05 Javascript
工作中常用js功能汇总
2020/11/07 Javascript
[01:32:10]NAVI vs VG Supermajor 败者组 BO3 第一场 6.5
2018/06/06 DOTA
python动态加载变量示例分享
2014/02/17 Python
在python中使用正则表达式查找可嵌套字符串组
2017/10/24 Python
教你用Python创建微信聊天机器人
2020/03/31 Python
从请求到响应过程中django都做了哪些处理
2018/08/01 Python
python 随机打乱 图片和对应的标签方法
2018/12/14 Python
详解django中url路由配置及渲染方式
2019/02/25 Python
HTML5标签小集
2011/08/02 HTML / CSS
德国香水、化妆品和护理产品网上商店:Parfumdreams
2018/09/26 全球购物
Dodax奥地利:音乐、电影、书籍、玩具、电子产品等
2019/08/31 全球购物
《会走路的树》教后反思
2014/04/19 职场文书
学习教师法的心得体会
2014/09/03 职场文书
北京颐和园导游词
2015/01/30 职场文书
酒店厨房管理制度
2015/08/06 职场文书
三八节祝酒词
2015/08/11 职场文书
Vue鼠标滚轮滚动切换路由效果的实现方法
2021/08/04 Vue.js
mongodb清除连接和日志的正确方法分享
2021/09/15 MongoDB
什么是动态刷新率DRR? Windows11动态刷新率功能介绍
2021/11/21 数码科技