0. 简单概述
在家里放一个 NAS 服务器,但是宽带的 IP 地址经常改变,一般路由器自带的花生壳域名解析可以解决,如果路由器没有类似功能或者想使用自己的域名,可以尝试使用 DNSPOD API 来实现域名动态解析。

1. 添加记录 在 dnspod 添加域名后并添加一个记录用来解析宽带的 IP 地址,如添加一个记录h 

2. 获取信息 1) 域名信息 domain_id 接口文档:https://www.dnspod.cn/docs/domains.html#domain-info

def domain_info(domain):
url = "https://dnsapi.cn/Domain.Info"
data = {
"login_email": LOGIN_EMAIL,
"login_password": LOGIN_PASSWORD,
"format": FORMAT,
"domain": domain
}
r = requests.post(url, data=data, timeout=5)
return r.json()["domain"] def domain_id(domain):
info = domain_info(domain)
return info["id"] # 获取 domain_id
print domain_id("greak.net")

2) 记录信息 record_idrecord_linevalue 接口文档:https://www.dnspod.cn/docs/records.html#record-list

def record_info(domain, sub_domain):
url = "https://dnsapi.cn/Record.List"
data = {
"login_email": LOGIN_EMAIL,
"login_password": LOGIN_PASSWORD,
"format": FORMAT,
"domain": domain,
"sub_domain": sub_domain
}
r = requests.post(url, data=data, timeout=5)
return r.json()["records"][0] def record_data(domain, sub_domain):
info = record_info(domain, sub_domain)
return info["id"], info["line"], info["value"] # 获取 record_id, record_line, value
rid, line, oldip = record_data("greak.net", "h")

3) 获取最新 IP 地址 接口:http://greak.net/ip

def get_newip():
url = "http://greak.net/ip"
r = requests.get(url, timeout=5)
return r.content.strip() # 获取 IP 地址
print get_newip()

3. 修改记录 接口文档:https://www.dnspod.cn/docs/records.html#dns

def record_update(domain, sub_domain):
newip = get_newip()
rid, line, oldip = record_data(domain, sub_domain)
if newip == oldip: # 比较新 IP 和现有记录是否一致,如果一致则不需要更新
return "not change"
url = "https://dnsapi.cn/Record.Ddns"
data = {
"login_email": LOGIN_EMAIL,
"login_password": LOGIN_PASSWORD,
"format": FORMAT,
"domain_id": domain_id(domain),
"record_id": rid,
"sub_domain": sub_domain,
"record_line": line,
"value": newip
}
r = requests.post(url, data=data, timeout=5)
return r.json() # 修改记录
print record_update("greak.net", "h")

4. 定期执行 完整 python 脚本dns.py

#!/usr/bin/env python2

import sys
import os
import json
import time
import requests LOGIN_EMAIL = "xxxxxx@example.com"
LOGIN_PASSWORD = "xxxxxx"
FORMAT = "json" def domain_info(domain):
url = "https://dnsapi.cn/Domain.Info"
data = {
"login_email": LOGIN_EMAIL,
"login_password": LOGIN_PASSWORD,
"format": FORMAT,
"domain": domain
}
r = requests.post(url, data=data, timeout=5)
return r.json()["domain"] def domain_id(domain):
info = domain_info(domain)
return info["id"] def record_info(domain, sub_domain):
url = "https://dnsapi.cn/Record.List"
data = {
"login_email": LOGIN_EMAIL,
"login_password": LOGIN_PASSWORD,
"format": FORMAT,
"domain": domain,
"sub_domain": sub_domain
}
r = requests.post(url, data=data, timeout=5)
return r.json()["records"][0] def record_id(domain, sub_domain):
info = record_info(domain, sub_domain)
return info["id"] def record_line(domain, sub_domain):
info = record_info(domain, sub_domain)
return info["line"] def record_value(domain, sub_domain):
info = record_info(domain, sub_domain)
return info["value"] def record_data(domain, sub_domain):
info = record_info(domain, sub_domain)
return info["id"], info["line"], info["value"] def get_newip():
url = "http://greak.net/ip"
r = requests.get(url, timeout=5)
return r.content.strip() def record_update(domain, sub_domain):
newip = get_newip()
rid, line, oldip = record_data(domain, sub_domain)
if newip == oldip:
return "not change"
url = "https://dnsapi.cn/Record.Ddns"
data = {
"login_email": LOGIN_EMAIL,
"login_password": LOGIN_PASSWORD,
"format": FORMAT,
"domain_id": domain_id(domain),
"record_id": rid,
"sub_domain": sub_domain,
"record_line": line,
"value": newip
}
r = requests.post(url, data=data, timeout=5)
return r.json() if __name__ == "__main__":
print time.strftime("%Y/%m/%d %H:%M:%S")
print record_update("greak.net", "h")

添加 cron 计划任务执行

#dns record update
*/1 * * * * root /usr/bin/python /home/debian/dns.py >>/home/debian/dns.log 2>&1

日志输出

2016/05/01 18:17:02
{u'status': {u'message': u'Action completed successful', u'code': u'1', u'created_at': u'2016-05-01 18:17:03'}, u'record': {u'id': 178422498, u'value': u'180.172.158.222', u'name': u'h'}}
# 更新成功 2016/05/01 18:18:02
not change
# 没有变化,无需改变

检查是否生效

$ curl greak.net/ip
180.172.158.222 $ dig h.greak.net | grep "^h.greak.net" | awk '{print $NF}'
180.172.158.222

如果输出的 IP 地址一样就表示生效了,由于存在 dns 缓存, dns 生效需要大概几分钟
注: dnspod 的 api 调用有次数限制,不要频繁调用

原文地址:http://greak.net/2016/05/01/shi-yong-dnspod-apishi-xian-yu-ming-dong-tai-jie-xi/

使用 DNSPOD API 实现域名动态解析的更多相关文章

  1. 通过阿里云域名动态解析 IP 地址

    这两天在家里用树莓派折腾了一个家用服务器,主要用来做 mac 的 Time Machine ,还有就是当做下载机和 nas ,想着平时上班时间家里没人用网络,空着也是空着,就可以利用空闲带宽下个美剧啥 ...

  2. 域名动态解析到动态IP

    一般宽带用户的IP都是动态IP,重连之后IP可能会发生变化. 如果想在其他地方连接家里的设备,或者在家中搭建服务器,就会受到影响. 现在提供一种动态解析域名的方式,只要检测到IP的变化,那么就调用阿里 ...

  3. openresty域名动态解析

    工作中使用openresty,使用第三方服务API通过域名访问.但是,域名通过DNS解析出来之后,在openresty是有 配置解析阶段 很多时候我们会在 Nginx 配置文件里配置上一些域名,比如配 ...

  4. 利用Dnspod api批量更新添加DNS解析【python脚本】 - 推酷

    利用Dnspod api批量更新添加DNS解析[python脚本] - 推酷 undefined

  5. Java动态解析域名

    Java动态解析域名 Java提供InetAddress类,可以对域名-IP进行正向.逆向解析. InetAddress解析的时候一般是调用系统自带的DNS程序. linux 默认的DNS方式是读取/ ...

  6. 理解AngularJS生命周期:利用ng-repeat动态解析自定义directive

    ng-repeat是AngularJS中一个非常重要和有意思的directive,常见的用法之一是将某种自定义directive和ng-repeat一起使用,循环地来渲染开发者所需要的组件.比如现在有 ...

  7. Protobuf动态解析在Java中的应用 包含例子程序

    最近在做ProtoBuf相关的项目,其中用到了动态解析,网上看了下相关资料和博文都比较少,自己来写一个记录一下学习过程.   Protocol Buffers是结构化数据格式标准,提供序列化和反序列方 ...

  8. WordPress搭建教程---购买域名+购买VPS主机+域名DNS解析+网站环境+上传网站程序

    WordPress搭建教程 购买域名---NameSilo 购买VPS主机---Vultr 域名DNS解析 网站环境 上传网站程序 参考文章: 1. WordPress搭建教程 https://zhu ...

  9. 加速你的网络!软路由构建 去AD+国内域名加速解析+抗污染+速度优选 与PSW无缝集成 综合方案

    本方案利用OpenWrt搭建4级DNS,实现 去AD + 国内域名加速解析 + 抗污染(域名解析按地区分流)+ 访问速度优选. 方案涉及部分软件配置细节可以参照之前博文:https://www.cnb ...

随机推荐

  1. Hibernate学习四----------Blob

    © 版权声明:本文为博主原创文章,转载请注明出处 实例 1.项目结构 2.pom.xml <project xmlns="http://maven.apache.org/POM/4.0 ...

  2. H5缓存机制学习记录

    参考文章:http://mp.weixin.qq.com/s?__biz=MTEwNTM0ODI0MQ==&mid=404724239&idx=1&sn=e0a2887f9ff ...

  3. XSS前置课程--同源策略

    什么是同源策略: 在用户浏览互联网中的网页的过程中,身份和权限的思想是贯穿始终的 同源策略(Same-Origin Policy),就是为了保证互联网之中,各类资源的安全性而诞生的产物,它实际上是一个 ...

  4. 使用jquery改动表单的提交地址

    基本思路: 通过使用jquery选择器得到相应表单的jquery对象,然后使用attr方法改动相应的action 演示样例程序一: 默认情况下,该表单会提交到page_one.html 点击butto ...

  5. _DataStructure_C_Impl:Floyd算法求有向网N的各顶点v和w之间的最短路径

    #include<stdio.h> #include<stdlib.h> #include<string.h> typedef char VertexType[4] ...

  6. Gradle 介绍

    介绍:Gradle是一种构建工具,它抛弃了基于XML的构建脚本,取而代之的是采用一种基于Groovy的内部领域特定语言.Gradle的设计理念是,所有有用的特性都由Gradle插件提供,一个Gradl ...

  7. 如何学习CCIE

    想想自己拖了这么久,也没考试,也没积极去做实验,心里也有怨念,其实一直是方法不对,今天心里产生共鸣,后悔当初太年轻. 转载地址:http://bbs.hh010.com/thread-467553-1 ...

  8. 【BZOJ4408】[Fjoi 2016]神秘数 主席树神题

    [BZOJ4408][Fjoi 2016]神秘数 Description 一个可重复数字集合S的神秘数定义为最小的不能被S的子集的和表示的正整数.例如S={1,1,1,4,13},1 = 12 = 1 ...

  9. 随机生成指定长度的密码之---Random

    随机生成指定长度的密码思路: 1.密码中可能包含字母,数字,特殊符号,为了区别分别定义常量 2.随机生成密码,自然想到要用到java.util.Random 类 3.定义一个带两个参数的方法,1跟2, ...

  10. 详解Vue 实例中的生命周期钩子

    Vue 框架的入口就是 Vue 实例,其实就是框架中的 view model ,它包含页面中的业务处理逻辑.数据模型等,它的生命周期中有多个事件钩子,让我们在控制整个Vue实例的过程时更容易形成好的逻 ...