『瀚思彼岸』» 智能家居技术论坛

标题: 使用DNSPOD的动态域名解析服务DDNS [打印本页]

作者: seaprince    时间: 2019-1-8 00:07
标题: 使用DNSPOD的动态域名解析服务DDNS
本帖最后由 seaprince 于 2019-1-8 06:55 编辑

自从大神们告知N1的神奇魅力之后,立马在PDD下单,70收了一个当矿机废弃的N1回家,开始我的N1之旅。

在论坛前辈的指引下,完成下面几步:


那么问题来了,虽然从4G或办公室都可以通过家里的外网IP访问到家里的N1,但家里的IP老变,怎么知道最新的IP地址呢?
这就是本文解决的问题。

论坛里有许多alidns的教程了,但我更喜欢怀旧,我的域名依然是Dnspod解析的(目前腾讯云也是Dnspod)。

1. 首先,登陆Dnspod后台,生成一个API Token. 你会得到一个ID和一长串的Token,两个都要。
https://www.dnspod.cn/console/user/security
然后把ID和Token用逗号连接,得到一个login_token串,存储备用。再创建一个新的A记录,用于以后访问家里路由器

2. 其次,用如下命令获取你的domain_id和record_id:
  1. #这里的login_token由上一步获得,从结果中找你的域名,拿到domain_id
  2. curl -k [url=https://dnsapi.cn/Domain.List]https://dnsapi.cn/Domain.List[/url] -d "login_token=12345,b0c540bb26ef7331874ed123123abcde&format=xml"

  3. # 这里的domain_id从上一步获得,找到刚才新加的A记录的record_id
  4. curl -k [url=https://dnsapi.cn/Record.List]https://dnsapi.cn/Record.List[/url] -d "login_token=12345,b0c540bb26ef7331874ed123123abcde&format=xml&domain_id=333333"
复制代码


3. 下来,就是要找到自己的外网IP地址了,可以百度搜索ip得到,或通过ip138.com,ip111.cn这样的第三方网站拿到,或者自己有服务器的话,在服务器放这样的一个php脚本:
  1. <?php
  2. echo $_SERVER['REMOTE_ADDR'];
复制代码


4. 最后,调用Dnspod的API把ip刷上去:
  1. #这里的login_token由上一步获得
  2. curl -k [url=https://dnsapi.cn/Domain.List]https://dnsapi.cn/Domain.List[/url] -d "login_token=12345,b0c540bb26ef7331874ed123123abcde&format=xml"

  3. # 这里的login_token、domain_id、result_id、ip均从上述步骤获得
  4. # sub_domain是你想用来做动态解析的子域名
  5. # record_line_id是解析线路,0是默认
  6. # value就是ip
  7. curl -k [url=https://dnsapi.cn/Record.Ddns]https://dnsapi.cn/Record.Ddns[/url] -d "login_token=12345,b0c540bb26ef7331874ed123123abcde&format=xml&domain_id=333333&record_id=4444444&sub_domain=home&record_line_id=0&value=2.2.2.2"
复制代码


重复以上3、4两步即可更新IP地址到域名上,以后就可以随便玩了。比如搭个网站、远程访问hassio、SSH远程连接看下。

什么,还是不知道怎么弄?那直接拷下面代码,保存为 /root/ddns.py
  1. import urllib
  2. import re

  3. login_token = '12345,b0c540bb26ef7331874ed123123abcde'
  4. domain_id = '333333'
  5. record_id = '4444444'
  6. sub_domain = 'home'

  7. f = open('/var/run/ddns.ip', 'r+')
  8. cip = f.readline()

  9. u = urllib.urlopen('http://ip111.cn/')
  10. html = u.read()
  11. rip = re.findall(r"\b(?:[0-9]{1,3}\.){3}[0-9]{1,3}\b", html)[0]

  12. def setip(ip):
  13.         global f, login_token, domain_id, record_id, sub_domain
  14.         
  15.         uri = 'https://dnsapi.cn/Record.Ddns'
  16.         data = {
  17.                 'login_token': login_token,
  18.                 'format': 'json',
  19.                 'domain_id': domain_id,
  20.                 'record_id': record_id,
  21.                 'sub_domain': sub_domain,
  22.                 'record_line_id': '0',
  23.                 'value': ip,
  24.         }
  25.         params = urllib.urlencode(data)
  26.         ret = urllib.urlopen(uri, params)
  27.         code = ret.getcode()
  28.         resp = ret.read()

  29.         f.write(ip)
  30.         print(resp)

  31. print 'Local cache ip is ' + cip
  32. print 'Remote detected ip is ' + rip
  33. if (cip != rip):
  34.         print 'IP changed'
  35.         setip(rip)
  36. else:
  37.         print 'IP is not changed'
复制代码


添加到crontab,定时执行:
  1. #命令行输入
  2. crontab -e

  3. # 弹出的编辑器中写入,含意是每5分钟看一次IP变了没
  4. */5 * * * * python /root/ddns.py >/dev/null 2>&1
复制代码


大功告成!!

作者: xieahui    时间: 2019-1-8 07:35
支持下! 如果路由器支持动态解析建议直接上路由器的
作者: 新生活    时间: 2019-1-8 09:49
谢谢分享
作者: seaprince    时间: 2019-1-8 21:39
xieahui 发表于 2019-1-8 07:35
支持下! 如果路由器支持动态解析建议直接上路由器的

刚好我家的路由不支持。。不过,可以用自己的域名好处也不少。




欢迎光临 『瀚思彼岸』» 智能家居技术论坛 (https://bbs.hassbian.com/) Powered by Discuz! X3.5