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. mycat 分页慢原理解析、mycat跨事务解惑、mycat注解调用存储过程分析

    1结合Mycat日志,分析select * from travelrecord order by id limit100000,100 的运行过程,解释下当limit M,N中的M非常大的情况下.为什 ...

  2. vue相关知识

    1.看https://www.bilibili.com/video/av27969216/?p=54,看他的就够了 https://juejin.im/post/5a5bc8c36fb9a01ca26 ...

  3. Neural Turing Machines-NTM系列(一)简述

    Neural Turing Machines-NTM系列(一)简述 NTM是一种使用Neural Network为基础来实现传统图灵机的理论计算模型.利用该模型.能够通过训练的方式让系统"学 ...

  4. 一种调用dll的巧妙方法

    直接上代码,后面说应用场景 新建一个项目,引入需要调用的dll,如下 class Program { [DllImport( "soft.dll" )] static extern ...

  5. Redis专题(2):Redis数据结构底层探秘

    前言 上篇文章Redis闲谈(1):构建知识图谱介绍了redis的基本概念.优缺点以及它的内存淘汰机制,相信大家对redis有了初步的认识.互联网的很多应用场景都有着Redis的身影,它能做的事情远远 ...

  6. javascript的defer和async(转载)

    http://ued.ctrip.com/blog/?p=3121 我们常用的javascript标签,有两个和性能.js文件下载执行相关的属性:defer和async defer的含义[摘自http ...

  7. js jquery 插件

    $(function(){ (function($, document, undefiend){ $.fn.pagination = function(options){ var $this = $( ...

  8. Tensorlayer

    http://tensorlayer.readthedocs.io/en/latest/

  9. TVirtualStringTree的Minimal例子学习

    预步骤第一步,定义数据结构type PMyRec = ^TMyRec; TMyRec = record Caption: WideString; end;预步骤第二步,规定取得节点数据时候的大小pro ...

  10. 我的Android进阶之旅------>Android中ListView中嵌套(ListView)控件时item的点击事件不起作的问题解决方法

    开发中常常需要自己定义Listview,去继承BaseAdapter,在adapter中按照需求进行编写,问题就出现了,可能会发生点击每一个item的时候没有反应,无法获取的焦点. 如果你的自定义Li ...