之前,为了远程访问群晖应用,且为了不使用弱智的ip
访问模式,在阿里云上买了域名,将自己的公网ip
绑定到该域名上。但是呢,由于我使用了路由器拨号,且设置了每周一凌晨重启路由器,保证路由器的性能。因此,每次当路由器重启拨号时,电信都会重新为路由器分配一个新的公网ip
,这就导致不得不在阿里云上更新域名绑定的ip
。之前因为缺乏基本的网络知识,在网上看了一些博客,使用了博客上提供的脚本来自动更新阿里云上的ip
。但是,在使用过程中可能由于脚本的编写问题(没有仔细看脚本,脚本使用php
编写),只能更新www
前缀的记录值,无法更新@
前缀记录值,导致体验十分不好(意思是不够完美哈哈哈)。
今天早晨!我的群晖又无故断开公网了!我十分生气!现在我更强了,也更快了,更是务实的行动派!我决定自己写个定制的脚本来解决这个问题。
解决方案
当着手去研究该问题时,发现事情比我想象的要简单很多。阿里云在产品使用文档中提供了相应的api
接口,在文档中详细地说明了使用方法,并且提供了多种语言的SDK
,甚至还提供了示例。因此,我简单阅读了一下文档,很快就有了解决思路。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-sZo0ihZS-1666584077179)(https://cdn.jsdelivr.net/gh/ColorlessCube/images@main/16350440598761635044059869.png)]
由于域名是在你的阿里云账户中购买的,为了获取更改你的账号信息的权限,首先需要获取access_key_id
以及access_key
。登录阿里云,点击右上角的头像,如图所示,点击AccessKey管理,跟着指示获取很简单就可以获取。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-uRNMQsXT-1666584077183)(https://cdn.jsdelivr.net/gh/ColorlessCube/images@main/16350443766121635044376605.png)]
ok,假设你已经获取了access_key_id
以及access_key
,下面就可以根据阿里云的api
文档完成脚本的编写工作了。
import json from aliyunsdkcore.client import AcsClient from aliyunsdkalidns.request.v20150109.DescribeDomainRecordsRequest import DescribeDomainRecordsRequest from aliyunsdkalidns.request.v20150109.UpdateDomainRecordRequest import UpdateDomainRecordRequest access_key_id = '*******************' access_secret = '*******************' domains = ['colorlesscube.cn'] def get_ip(): import requests return requests.get('https://ifconfig.me/ip', timeout=1).text.strip() def get_acs_client(): return AcsClient(access_key_id, access_secret, 'cn-hangzhou') def get_domain_records(domain): client = get_acs_client() request = DescribeDomainRecordsRequest() request.set_accept_format('json') request.set_DomainName(domain) response = client.do_action_with_exception(request) return json.loads(response) def update_domain_records(info, domain): client = get_acs_client() request = UpdateDomainRecordRequest() ip = get_ip() records = info['DomainRecords']['Record'] for record in records: if record.get('Type') == 'A' and record.get('DomainName') == domain: request.set_accept_format('json') request.set_RecordId(record.get('RecordId')) request.set_RR(record.get('RR')) request.set_Type(record.get('Type')) request.set_Value(ip) try: response = client.do_action_with_exception(request) print(json.loads(response)) except Exception as e: print(e) if __name__ == '__main__': for domain in domains: records = get_domain_records(domain) update_domain_records(records, domain)
将脚本上传到群晖上,并在任务计划中添加脚本执行命令。
python3 /volume3/homes/alex/Drive/Document/scripts/python/ddns.py
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-RF37BEFY-1666584077184)(https://cdn.jsdelivr.net/gh/ColorlessCube/images@main/16350457100761635045710067.png)]
有两个问题你要注意一下:
pip3 install aliyun-python-sdk-core pip3 install aliyun-python-sdk-alidns
ok,这就是本次分享的全部内容,有什么疑问可以联系邮箱ialex.cube@gmail.com
,我会在空余的时候与你一起讨论,阿里嘎多。
原文链接:https://blog.csdn.net/qq_43619899/article/details/120932150?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522168476299816800182144302%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fblog.%2522%257D&request_id=168476299816800182144302&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~blog~first_rank_ecpm_v1~times_rank-14-120932150-null-null.blog_rank_default&utm_term=NAS%E3%80%81%E7%BE%A4%E6%99%96%E3%80%81%E9%98%BF%E9%87%8C%E4%BA%91%E3%80%81%E5%9F%9F%E5%90%8D%E8%A7%A3%E6%9E%90%E3%80%81%E5%86%85%E7%BD%91%E7%A9%BF%E9%80%8F%E3%80%81ipv6%E3%80%81ddns%E3%80%81%E8%BD%BB%E9%87%8F%E7%BA%A7%E4%BA%91%E6%9C%8D%E5%8A%A1%E5%99%A8%E3%80%81%E9%93%81%E5%A8%81%E9%A9%AC%E3%80%81%E5%A8%81%E8%81%94%E9%80%9A%E3%80%81DSM%E3%80%81DSM6.0%E3%80%81%E7%BE%A4%E6%99%96nas%E3%80%81%E4%BA%91%E6%9C%8D%E5%8A%A1%E5%99%A8%E3%80%81%E8%9C%97%E7%89%9B%E6%98%9F%E9%99%85%E3%80%81%E9%BB%91%E7%BE%A4%E6%99%96%E3%80%81docker%E3%80%81%E5%AE%B9%E5%99%A8%E9%95%9C%E5%83%8F%E3%80%81%E5%9F%9F%E5%90%8D%E6%B3%A8%E5%86%8C%E3%80%81%E5%AE%9D%E5%A1%94%E3%80%81%E5%8F%8D%E5%90%91%E4%BB%A3%E7%90%86%E3%80%81nginx%E3%80%81frp%E3%80%81%E5%8A%A8%E6%80%81%E5%9F%9F%E5%90%8D%E8%A7%A3%E6%9E%90