通过python动态更新阿里云DNS解析,作为DDNS使用

家用宽带架设服务器的技术交流,编程技术交流。
回复
admin
网站管理员
帖子: 26
注册时间: 周日 6月 23, 2019 11:03 am

通过python动态更新阿里云DNS解析,作为DDNS使用

帖子 admin »

花9元钱在阿里云上云注册一个“.top”的顶级域名,再利用下面的代码定时更新你家路由器的IP,这样就实现了DDNS的效果了。
下面Python代码中的AcsClient()、request.set_RecordId("17741030***760")这两个函数的参数请在https://help.aliyun.com/document_detail/53090.html 上查看。
  1. #!/usr/bin/env python
  2. #coding=utf-8
  3. import json
  4. import urllib
  5. import datetime
  6. from aliyunsdkcore.client import AcsClient
  7. from aliyunsdkcore.acs_exception.exceptions import ClientException
  8. from aliyunsdkcore.acs_exception.exceptions import ServerException
  9. from aliyunsdkalidns.request.v20150109.DescribeDomainRecordInfoRequest import DescribeDomainRecordInfoRequest
  10. from aliyunsdkalidns.request.v20150109.UpdateDomainRecordRequest import UpdateDomainRecordRequest
  11.  
  12. client = AcsClient('LTAIjOE53h******fI', 'JlvkmaCPek3SqqY*******GQbd8Zp', 'cn-hangzhou')
  13.  
  14. request = DescribeDomainRecordInfoRequest()
  15. request.set_accept_format('json')
  16.  
  17. request.set_RecordId("17741030***760")
  18.  
  19. response = client.do_action_with_exception(request)
  20. response = json.loads(response.decode())
  21. old_ip = response['Value']
  22.  
  23. new_ip = urllib.urlopen("http://ip.42.pl/raw").read()
  24.  
  25. if old_ip != new_ip:
  26.     request = UpdateDomainRecordRequest()
  27.     request.set_accept_format('json')
  28.     request.set_Value(new_ip)
  29.     request.set_Type("A")
  30.     request.set_RR("nas")
  31.     request.set_RecordId("17741030***760")
  32.     response = client.do_action_with_exception(request)
  33.     print datetime.datetime.now(),' ', old_ip, ' => ', new_ip
  34. else :
  35.     print datetime.datetime.now(),' IP has not changed.', new_ip
admin
网站管理员
帖子: 26
注册时间: 周日 6月 23, 2019 11:03 am

Re: 通过python动态更新阿里云DNS解析,作为DDNS使用

帖子 admin »

在群晖的计划任务中,定时执行下面的命令,就可定时查询更新aliyun的DNS解析:
  1. #!/bin/ash
  2. sudo python /volume1/run/aliyundns.py >> /volume1/run/ddns.log
admin
网站管理员
帖子: 26
注册时间: 周日 6月 23, 2019 11:03 am

Re: 通过python动态更新阿里云DNS解析,作为DDNS使用

帖子 admin »

今天又抽了点时间将IP更新程序优化了一下,调用方法: python aliyundns.py www.atoo.top,代码如下:
  1. # 阿里支DNS自动更新IP地址程序(Python3)
  2. # 文件名  : aliyundns.py
  3. # 调用方法: python3 aliyundns.py www.atoo.top
  4.  
  5. #!/usr/bin/env python3
  6. #coding=utf-8
  7.  
  8. import sys
  9. import json
  10. import urllib.request
  11. import datetime
  12. from aliyunsdkcore.client import AcsClient
  13. from aliyunsdkcore.acs_exception.exceptions import ClientException
  14. from aliyunsdkcore.acs_exception.exceptions import ServerException
  15. from aliyunsdkalidns.request.v20150109.UpdateDomainRecordRequest import UpdateDomainRecordRequest
  16. from aliyunsdkalidns.request.v20150109.DescribeSubDomainRecordsRequest import DescribeSubDomainRecordsRequest
  17.  
  18. if len(sys.argv)<=1:
  19.     print( 'Usage: python3 aliyundna.py www.atoo.top')
  20.     sys.exit(0)
  21.    
  22. accessKeyId = 'LTAIjO23**PWBfI'
  23. accessSecret = 'JlvkmaC***514aFM9Z14JGQbd8Zp'
  24.  
  25. DomainName = sys.argv[1]  
  26.  
  27. # print sys.argv[0], sys.argv[1], sys.argv[2]
  28.  
  29. client = AcsClient(accessKeyId, accessSecret, 'cn-hangzhou')
  30.  
  31. request = DescribeSubDomainRecordsRequest()
  32. request.set_accept_format('json')
  33. request.set_SubDomain(DomainName)
  34. response = client.do_action_with_exception(request)
  35. # print response
  36. response = json.loads(response.decode())
  37. RecordId = response['DomainRecords']['Record'][0]['RecordId']
  38. RR       = response['DomainRecords']['Record'][0]['RR']
  39. old_ip   = response['DomainRecords']['Record'][0]['Value']
  40.  
  41. new_ip = urllib.request.urlopen("http://ip.42.pl/raw").read()
  42.  
  43.  
  44. if old_ip !=  str(new_ip, 'utf-8'):
  45.     request = UpdateDomainRecordRequest()
  46.     request.set_accept_format('json')
  47.  
  48.     request.set_Value(new_ip)
  49.     request.set_Type("A")
  50.     request.set_RR(RR)
  51.     request.set_RecordId(RecordId)
  52.  
  53.     response = client.do_action_with_exception(request)
  54.     print( datetime.datetime.now(), ' ', DomainName,': ', old_ip, ' => ', new_ip )
  55. # else :
  56. #    print datetime.datetime.now(), ' ', DomainName, ': IP has not changed.', new_ip
  57.  
BG6RSH
帖子: 134
注册时间: 周日 6月 23, 2019 12:00 pm

Re: 通过python动态更新阿里云DNS解析,作为DDNS使用

帖子 BG6RSH »

还需要安装支持库:

代码: 全选

pip install aliyun-python-sdk-core # 安装阿里云SDK核心库
pip install aliyun-python-sdk-ecs # 安装管理ECS的库
pip install aliyun-python-sdk-alidns
BG6RSH
帖子: 134
注册时间: 周日 6月 23, 2019 12:00 pm

Re: 通过python动态更新阿里云DNS解析,作为DDNS使用

帖子 BG6RSH »

群晖中安装python3、pip3和阿里云Python SDK

安装步骤:
1、从群晖“套件中心”中安装python3应用;
2、通过SSH登录群晖后台,并通过“sudo -i”命令进入root用户角色;
3、进入python3应用目录”root@DiskStation:/var/packages/py3k/target/usr/local/bin#
4、运行下列命令安装pip3

代码: 全选

wget https://bootstrap.pypa.io/get-pip.py
python3 get-pip.py   # 安装pip3
pip3 -V          # 查看pip3版本
pip3 install aliyun-python-sdk-core   # 安装阿里云SDK核心库
pip3 install aliyun-python-sdk-alidns   #安装阿里云DNS库
回复