前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【Python】实现DDNS 动态解析到阿里

【Python】实现DDNS 动态解析到阿里

作者头像
杨丝儿
发布2022-02-25 20:23:18
1.5K0
发布2022-02-25 20:23:18
举报
文章被收录于专栏:杨丝儿的小站杨丝儿的小站

什么是 DDNS?

DDNS(Dynamic Domain Name Server,动态域名服务)是将用户的动态IP地址映射到一个固定的域名解析服务上,用户每次连接网络的时候客户端程序就会通过信息传递把该主机的动态IP地址传送给位于服务商主机上的服务器程序,服务器程序负责提供DNS服务并实现动态域名解析

DDNS的使用场景分析

在中国,面向社会的服务器是需要备案的,而备案的时候是需要使用一个固定的公网ip备案的。因此很多人想要使用DDNS实现网站搭建的小伙伴就要失望了(说的就是我)。

用python实现DDNS

代码语言:javascript
复制
from aliyunsdkcore.client import AcsClient
from aliyunsdkalidns.request.v20150109.DescribeDomainRecordsRequest import DescribeDomainRecordsRequest
from aliyunsdkalidns.request.v20150109.UpdateDomainRecordRequest import UpdateDomainRecordRequest
import json
import subprocess
import re

# 获取当前域名对应的ip地址
def get_internet_ip():
    child = subprocess.Popen("nslookup nideyuming", shell=True, stdout=subprocess.PIPE)
    out = child.communicate()  # 保存nslookup获取的所有信息
    ipv6_pattern = '(([a-f0-9]{1,4}:){7}[a-f0-9]{1,4})'
    m = re.findall(ipv6_pattern, str(out))
    address = m[0][0]  # 拿到ipv6地址
    return address


# 获取本机临时IPv6地址
def get_local_ip():
    child = subprocess.Popen("ipconfig", shell=True, stdout=subprocess.PIPE)
    out = child.communicate()  # 保存ipconfig中的所有信息
    ipv6_pattern = '(([a-f0-9]{1,4}:){7}[a-f0-9]{1,4})'
    m = re.findall(ipv6_pattern, str(out))
    address = m[1][0]
    return address


# 获取recordid
def get_recordid(client):
    request = DescribeDomainRecordsRequest()
    request.set_accept_format('json')
    request.set_DomainName("discover304.top") #\TODO 传你的域名
    response = client.do_action_with_exception(request)
    response = str(response, encoding='utf-8')
    result = json.loads(response)
    recordid = result["DomainRecords"]["Record"][0]["RecordId"]
    return recordid


# 更新域名解析
def update_record(client, priority, ttl, record_type, value, rr, record_id):
    request = UpdateDomainRecordRequest()
    request.set_accept_format('json')
    request.set_Priority(priority)
    request.set_TTL(ttl)
    request.set_Value(value)
    request.set_Type(record_type)
    request.set_RR(rr)
    request.set_RecordId(record_id)
    response = client.do_action_with_exception(request)
    response = str(response, encoding='utf-8')
    return response


# 函数调用
def run_result(client, priority, ttl, record_type, value, rr, record_id):
    if get_local_ip() == get_internet_ip():
        print("解析地址未发生变化,不修改!")
        pass
    else:
        result = update_record(client, priority, ttl, record_type, value, rr, record_id)
        result = json.loads(result)
        print("已更新解析地址,新的RecordId是:%s" % result["RecordId"])


if __name__ == '__main__':
    # \TODO 这儿传你的accessKeyId、accessSecret和区域ID(region_id)
    client = AcsClient('xxxx', 'xxxx', 'cn-beijing')
    record_id = get_recordid(client)
    ip = get_local_ip()
    run_result(client, "5", "600", "AAAA", ip, "@", record_id)

参考

本文参与?腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2021-10-15,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客?前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与?腾讯云自媒体分享计划? ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 什么是 DDNS?
  • DDNS的使用场景分析
  • 用python实现DDNS
  • 参考
相关产品与服务
ICP备案
在中华人民共和国境内从事互联网信息服务的网站或APP主办者,应当依法履行备案手续。腾讯云为您提供高效便捷的 ICP 备案服务。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
http://www.vxiaotou.com