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. vue 监听 watch 使用

    1.api https://cn.vuejs.org/v2/api/#watch 有2个配置: (1)深度 watcher deep: true(2)该回调将会在侦听开始之后被立即调用 immedia ...

  2. Struts2中Action自己主动接收參数

    Struts2中Action接收參数的方法主要有下面三种: 1.使用Action的属性接收參数:(通过属性驱动式)     a.定义:在Action类中定义属性,创建get和set方法.     b. ...

  3. java代码实现输出指定以.java结尾的文件的绝对路径

    package 输出指定文件绝对路径; import java.io.File; /* * 需求:请大家把"E:\\JAVA语言"文件夹下全部的java结尾的文件的绝对路径给输出在 ...

  4. WinForm搭载ScintillaNET时文本由于发生偏移被隐藏解决方案

    项目用ScintillaNet搭载到WinForm以满足文本编辑的需求,在用FindReplace.Scintilla.Text=“显示内容”输出文本内容的时候会碰到文本被WinForm边框隐藏的情况 ...

  5. 程序猿的量化交易之路(32)--Cointrade之Portfolio组合(19)

    转载须注明出处:http://blog.csdn.net/minimicall?viewmode=contents,http://cloudtrade.top/ Portfolio:组合,代表的是多个 ...

  6. Node.js下载及安装

    Node.js是一个基于Chrome JavaScript运行时建立的平台, 用于方便地搭建响应速度快.易于扩展的网络应用. Node.js 使用事件驱动, 非阻塞I/O 模型而得以轻量和高效,非常适 ...

  7. mysql数据库常用语句系列

    mysql查询某个字段长度   一般查询语句:SELECT `lcontent` FROM `caiji_ym_liuyan` 查询数据: 有些时候需要查询某个字段的长度为多少时候才显示数据: SQL ...

  8. 15 redis 之 aof恢复与rdb服务器间迁移

    三:常见的问题 BGREWRITEAOF 后台进程重写AOF BGSAVE 后台保存rdb快照 SAVE 保存rdb快照 LASTSAVE 上次保存时间 Slaveof master-Host por ...

  9. android假设给TextView或EditText的email链接加下划线,并在点击在email连接上能够弹框显示

    怎样把textview的一些文字加上背景色: Spannable str = new SpannableString("#fdsfdfsdfdsfd#"); Matcher mat ...

  10. git查看某一次commit里面的内容,即本次commit相对于原来的版本进行了哪些修改

    1 知道commit id的话 git show commit-id 2 想要查看某次commit的某个文件进行了哪些修改 git show commit-id filename