使用 DNSPOD API 实现域名动态解析
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_id、record_line和value 接口文档: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 实现域名动态解析的更多相关文章
- 通过阿里云域名动态解析 IP 地址
		
这两天在家里用树莓派折腾了一个家用服务器,主要用来做 mac 的 Time Machine ,还有就是当做下载机和 nas ,想着平时上班时间家里没人用网络,空着也是空着,就可以利用空闲带宽下个美剧啥 ...
 - 域名动态解析到动态IP
		
一般宽带用户的IP都是动态IP,重连之后IP可能会发生变化. 如果想在其他地方连接家里的设备,或者在家中搭建服务器,就会受到影响. 现在提供一种动态解析域名的方式,只要检测到IP的变化,那么就调用阿里 ...
 - openresty域名动态解析
		
工作中使用openresty,使用第三方服务API通过域名访问.但是,域名通过DNS解析出来之后,在openresty是有 配置解析阶段 很多时候我们会在 Nginx 配置文件里配置上一些域名,比如配 ...
 - 利用Dnspod api批量更新添加DNS解析【python脚本】 - 推酷
		
利用Dnspod api批量更新添加DNS解析[python脚本] - 推酷 undefined
 - Java动态解析域名
		
Java动态解析域名 Java提供InetAddress类,可以对域名-IP进行正向.逆向解析. InetAddress解析的时候一般是调用系统自带的DNS程序. linux 默认的DNS方式是读取/ ...
 - 理解AngularJS生命周期:利用ng-repeat动态解析自定义directive
		
ng-repeat是AngularJS中一个非常重要和有意思的directive,常见的用法之一是将某种自定义directive和ng-repeat一起使用,循环地来渲染开发者所需要的组件.比如现在有 ...
 - Protobuf动态解析在Java中的应用 包含例子程序
		
最近在做ProtoBuf相关的项目,其中用到了动态解析,网上看了下相关资料和博文都比较少,自己来写一个记录一下学习过程. Protocol Buffers是结构化数据格式标准,提供序列化和反序列方 ...
 - WordPress搭建教程---购买域名+购买VPS主机+域名DNS解析+网站环境+上传网站程序
		
WordPress搭建教程 购买域名---NameSilo 购买VPS主机---Vultr 域名DNS解析 网站环境 上传网站程序 参考文章: 1. WordPress搭建教程 https://zhu ...
 - 加速你的网络!软路由构建 去AD+国内域名加速解析+抗污染+速度优选 与PSW无缝集成 综合方案
		
本方案利用OpenWrt搭建4级DNS,实现 去AD + 国内域名加速解析 + 抗污染(域名解析按地区分流)+ 访问速度优选. 方案涉及部分软件配置细节可以参照之前博文:https://www.cnb ...
 
随机推荐
- vs code编辑器
			
1.vs code配置 { "editor.tabSize": 2, "workbench.startupEditor": "newUntitledF ...
 - google 搜索结果在新标签页打开
			
google->setting->search setting->Where results open->勾选
 - 【Excle数据透视表】如何重命名数据透视表
			
如下图,是新生成的一个数据透视简表,现在需要将其数据透视表的名称修改为:汇总数据 解决办法 修改后的效果如下:
 - 分区容量大于16TB的格式化
			
File systems do have limits. Thats no surprise. ext3 had a limit at 16 TB file system size. If you n ...
 - Python,Pycharm,Anaconda等的关系与安装过程~为初学者跳过各种坑
			
1.致欢迎词 我将详讲讲述在学Python初期的各种手忙脚乱的问题的解决,通过这些步骤的操作,让你的注意力集中在Python的语法上以及后面利用Python所解决的项目问题上.而我自己作为小白,很不幸 ...
 - HDFS源码分析DataXceiver之整体流程
			
在<HDFS源码分析之DataXceiverServer>一文中,我们了解到在DataNode中,有一个后台工作的线程DataXceiverServer.它被用于接收来自客户端或其他数据节 ...
 - linux启动参数了解
			
文章来源:http://blog.csdn.net/uyiwfn/article/details/7172339在Linux中,给kernel传递参数以控制其行为总共有三种方法:1.build ker ...
 - 华为P20无敌拍摄能力开放 如何即刻获得?
			
在全球专业相机测评机构DXOmark发布的相机评测排行中,华为P20.P20 Pro成功登顶“全球拍照最好智能手机”.P20 Pro综合得分高达109分,P20综合得分102分.“华为并非简单地将第三 ...
 - Java正确获取客户端真实IP方法整理
			
在JSP里,获取客户端的IP地址的方法是:request.getRemoteAddr(),这种方法在大部分情况下都是有效的.但是在通过了Apache,Squid等反向代理软件就不能获取到客户端的真实I ...
 - android 在githup中的资源整理(转)
			
1.Github开源Android组件资源整理(一) 个性化控件(View) 2.Github开源Android组件资源整理(二)ActionBar和Menu 3. Github开源Android组件 ...