ZFX520 发表于 2022-2-27 20:42

腾讯域名 ddns 实现动态域名解析支持ipv6和ipv4

本帖最后由 ZFX520 于 2022-2-27 21:12 编辑

简介
DDNS是动态域名服务(Dynamic Domain Name Server)的缩写,可以实现固定域名到动态IP地址之间的解析。 通常情况下,用户每次连接因特网时都会从ISP得到一个动态IP地址,即用户每次连接因特网得到的IP地址都不同。
前期准备
首先你要有一个腾讯云的域名,进入腾讯云的DNSPOD然后点击右上角头像选择api秘钥进入后点击腾讯云api秘钥在点击新建秘钥

新建完成后会有2个参数,一个是SecretId另一个是SecretKey,我们吧这两个参数记下来。

然后去域名解析那里解析一个域名,如果用ipv6的地址就设置解析记录类型为AAAA,先随便填写一个记录值(简单点的记录值,fe80::ac34),ipv4同理
最后来安装腾讯云的Python包
pip install -i https://mirrors.tencent.com/pypi/simple/ --upgrade tencentcloud-sdk-python
至此准备工作完成。
源码展示
ddns.py
import json,os,requests,sys,netifaces,time
#from gmail import email
from tencentcloud.common import credential
from tencentcloud.common.profile.client_profile import ClientProfile
from tencentcloud.common.profile.http_profile import HttpProfile
from tencentcloud.common.exception.tencent_cloud_sdk_exception import TencentCloudSDKException
from tencentcloud.dnspod.v20210323 import dnspod_client, models
def start(ym,jlz):
    try:
      cred = credential.Credential("这里填写上面获取得SecretId", "这里填写SecretKey")
      httpProfile = HttpProfile()
      httpProfile.endpoint = "dnspod.tencentcloudapi.com"
      clientProfile = ClientProfile()
      clientProfile.httpProfile = httpProfile
      client = dnspod_client.DnspodClient(cred, "", clientProfile)
      req = models.DescribeRecordListRequest()
      params = {
            "Domain": ym,
            "Subdomain": jlz
      }
      req.from_json_string(json.dumps(params))
      resp = client.DescribeRecordList(req).to_json_string()
      resp = json.loads(resp)
      recordlist = resp["RecordList"]
      for record in recordlist:
            recordid = record['RecordId']
      return recordid
    except TencentCloudSDKException as err:
      print(err)
      #email("DDNS", str(err))
      sys.exit()

def fast(ym,jlz,type1):
    try:
      recordid = int(start(ym,jlz))
      if type1 == "AAAA":
            ip = netifaces.ifaddresses('eth0')['addr'].replace("%eth0","")
      elif type1 == "A":
            ip = requests.get("http://members.3322.org/dyndns/getip").text
      else:
            print("程序不支持其他记录类型,只支持AAAA和A")
            sys.exit()
      cred = credential.Credential("这里填写上面获取得SecretId", "这里填写SecretKey")
      httpProfile = HttpProfile()
      httpProfile.endpoint = "dnspod.tencentcloudapi.com"
      clientProfile = ClientProfile()
      clientProfile.httpProfile = httpProfile
      client = dnspod_client.DnspodClient(cred, "", clientProfile)
      req = models.ModifyRecordRequest()
      params = {
            "Domain": ym,
            "SubDomain": jlz,
            "RecordType": type1,
            "RecordLine": "默认",
            "Value": ip,
            "RecordId": recordid
      }
      req.from_json_string(json.dumps(params))
      resp = client.ModifyRecord(req).to_json_string()
      localtime = time.asctime(time.localtime(time.time()))
      print(localtime,resp)
    except TencentCloudSDKException as err:
      print(localtime,err)
      #email("DDNS", str(err))

fil = sys.argv
with open(fil,"r") as f:
    data = f.read()
data = json.loads(data)
for over in data:
    ym = over["域名"]
    jlz = over["主机记录"]
    type1 = over["记录类型"]
    fast(ym,jlz,type1)
print("结束")
ddns.conf
下面还可以填写很多,填写方式就按下面的方式进行添加。
[
    {"域名":"zfx.top","主机记录":"wxllha","记录类型":"AAAA"},
    {"域名":"zfx.top","主机记录":"gfiker","记录类型":"A"}
]
完美结束
然后就可以使用了,运行方式Python3 ddns.py ddns.conf
由于腾讯云限制,访问速度不能超过20次/秒
再设置一下自动执行,可以用cron,cron不懂去百度,现在就可以愉快地玩耍了。
声明
本程序仅在Ubuntu 21上面进行了使用,其他系统请自行测试或修改。

xingyuanbao 发表于 2022-2-27 22:51

小白更推荐ddns-go管理,支持腾讯云,阿里云,CF,华为云等,支持更新结果推送到server酱和钉钉!

云的彼岸918 发表于 2022-2-28 03:54

看着好高大上,这个是干什么用的?

yoyoma211 发表于 2022-2-27 22:03

感谢楼主分享,这个学习一下先

gztf 发表于 2022-2-28 05:23

做网站收藏备用

zm55555 发表于 2022-2-28 08:17

谢谢分享!

你是我的人 发表于 2022-2-28 09:03

感谢分享

daisypojie 发表于 2022-2-28 09:03

latvro 发表于 2022-2-28 09:09

感谢你的分享

t1r0 发表于 2022-2-28 10:22

20次/秒,对于访问量小的网站来说够用了
页: [1] 2
查看完整版本: 腾讯域名 ddns 实现动态域名解析支持ipv6和ipv4