家用宽带申请到公网ip后,ip地址是动态的,为了使用方便,需申请一个域名并设置ddns,这样就可以使用固定的域名来访问自己的服务器,不需要使用难记且经常变化的ip地址。

一、域名申请

有一些免费三级域名申请的地方,但是方便起见,我在腾讯云购买了一个 数字.xyz的域名,一年8块,也便宜。

使用免费的域名解析功能可以设置

  • 子域名级数5 级

  • 负载均衡2 条

  • url转发2条

  • 子域名数量不限

个人对域名没太大需求,目前只设置3级A类域名,免费解析足够用,ddns功能就需要自己编写脚本来实现了。

二、脚本编写

使用python编写,通过dnspod api获取个人域名内的dns解析记录,与外网地址比较,如果不同就更新dns记录,每隔5-10分钟运行一次脚本。

2.1 获取外网地址

访问https://myip.ipip.net就能得到自己的ip地址。

2.2 获得域名解析信息

使用dnspod api, 说明见腾讯云文档:https://docs.dnspod.cn/api/call-requency/

2.2.1 获取token

访问https://console.dnspod.cn/account/token/token,创建一个秘钥,

完成后程序中可以使用ID,TOKEN来访问api。

2.2.2 函数功能

实现了获取域名,添加域名,删除域名,获取记录,添加记录,删除记录,修改记录功能,都通过requests 的post方法访问对应网址即可。

  1. 获取记录函数需要参数为 域名

  1. 删除记录需要参数为 记录id和域名, 记录id通过获取记录函数获得。

  1. 修改记录需要参数为 域名,子域名,记录id,要修改的值, 记录类型, 线路类型。

  1. 添加记录如果仅能添加2个相同的子域名,原因是负载均衡的限制。

具体代码如下:

"""
访问和修改dnspod域名的类
get_domain无需参数,输出login_token对应的用户拥有的域名。
域名下包含记录,使用getrecord(domain_list)获取,每条记录对应一个子域名,也是最常用的。
对仅拥有一个域名一个公网ip的用户来说,日常使用仅需要在ip地址发生变化时,更新每条记录就可以了。
"""
import requests
import logging
import re
from dnspod_setting import Settings
from time import sleepclass Dnspod:"""操作dnspod域名的类"""def __init__(self, login_token):self._login_token = login_tokenself._format = 'json'# 设置 loggerlogging.basicConfig(level=logging.INFO, format='%(asctime)s - %(name)s - %(levelname)s - %(message)s')self._logger = logging.getLogger(__name__)handler = logging.FileHandler(Settings.log_file, encoding='utf-8')handler.setLevel(logging.INFO)formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')handler.setFormatter(formatter)self._logger.addHandler(handler)self._add_domain_URL = 'https://dnsapi.cn/Domain.Create'  # 添加域名self._del_domain_URL = 'https://dnsapi.cn/Domain.Remove'  # 删除域名self._add_record_URL = 'https://dnsapi.cn/Record.Create'  # 添加记录self._alter_record_URL = 'https://dnsapi.cn/Record.Modify'  # 修改记录self._get_record_URL = 'https://dnsapi.cn/Record.List'  # 获取记录列表self._del_record_URL = 'https://dnsapi.cn/Record.Remove'  # 删除记录self._get_domain_list_URL = 'https://dnsapi.cn/Domain.List'  # 获取域名列表@staticmethoddef get_outer_ip():"""获取外网ip:return:"""ip = ''for count in range(10):     # 重试10次try:res = requests.get('https://myip.ipip.net', timeout=5).textip = re.findall(r'(\d+\.\d+\.\d+\.\d+)', res)ip = ip[0] if ip else ''except:passif ip:          # 一旦ip不为空,直接返回return ipsleep(1)return ipdef get_domain_list(self):"""获取域名列表:return: 域名列表: ['xxx.xx', 'xxx.xx'] or []"""try:r = requests.post(self._get_domain_list_URL, data={'login_token': self._login_token,'format': self._format})response_record_json = r.json()if response_record_json['status']['code'] == '1':domains_list = [doms['name'] for doms in response_record_json['domains'] if doms['status'] == 'enable']for domain in domains_list:self._logger.info(f"域名:{domain}")return domains_listelse:return []except Exception as e:self._logger.error(e)def add_domain(self, domains_list):"""添加域名:param domains_list:['xxx.xxx.xxx', 'xx2.xxx.xxx']:return: True or False"""try:for domain in domains_list:r = requests.post(self._add_domain_URL, data={'login_token': self._login_token,'format': self._format,'domain': domain,})response_record_json = r.json()if response_record_json["status"]["code"] == "1":self._logger.info(f'域名:{response_record_json["domain"]["domain"]},添加成功;域名ID:{response_record_json["domain"]["id"]}')else:self._logger.error(f'域名:{domain},添加失败,错误信息:{response_record_json["status"]["message"]}')except Exception as e:self._logger.error(e)def del_domain(self, domains_list):"""删除域名:param domains_list:['xxx.xxx.xxx', 'xx2.xxx.xxx']:return: True or False"""try:for domain in domains_list:r = requests.post(self._del_domain_URL, data={'login_token': self._login_token,'format': self._format,'domain': domain,})response_record_json = r.json()if response_record_json["status"]["code"] == "1":self._logger.info(f'删除域名:{domain}成功.')else:self._logger.error(f'删除域名:{domain},添加失败,错误信息:{response_record_json["status"]["message"]}')except Exception as e:self._logger.error(e)def add_record(self, domain, sub_domain_list, value, record_type='A', record_line_value='默认'):"""添加域名和解析记录:param domain: 要添加记录的域名:param sub_domain_list: 要添加的子域名列表:param record_type: 添加记录类型:默认 A:param record_line_value: 线路类型, 使用 ‘默认’即可:param value: 要添加的值, A类型是ip地址。:return:"""try:for sub_domain in sub_domain_list:r = requests.post(self._add_record_URL, data={'login_token': self._login_token,'format': self._format,'domain': domain,'sub_domain': sub_domain,'record_type': record_type,'record_line': record_line_value,'value': value,})response_record_json = r.json()if response_record_json["status"]["code"] == "1":self._logger.info(f'域名:{domain},成功添加记录:{response_record_json["record"]["name"]} ')else:self._logger.error(f'域名:{domain},添加:{sub_domain},记录失败,错误信息:{response_record_json["status"]["message"]}')except Exception as e:self._logger.error(e)def get_record(self, domain):"""获取域名下的记录:param domain: "xxx.xxx.xx":return:"""records_list = []try:r = requests.post(self._get_record_URL, data={'login_token': self._login_token,'format': self._format,'domain': domain,})response_record_json = r.json()if response_record_json['status']['code'] == '1':self._logger.info(f"域名:{response_record_json['domain']['name']},"f"共有:{response_record_json['info']['sub_domains']}个子域名"f"和:{response_record_json['info']['record_total']}条解析记录.")for record in response_record_json['records']:if record['type'] == 'A':  # 只修改A类型的记录,避免修改dnspod默认记录。records_list.append({'domain': domain,'id': record['id'],'name': record['name'],'line': record['line'],'type': record['type'],'value': record['value']})except Exception as e:self._logger.error(e)return []return records_listdef alter_record(self, domain, sub_domain, record_id, value, record_type='A', record_line='默认'):"""修改解析记录:param domain: 域名,不可缺:param sub_domain: 子域名,可选,默认值为@:param record_id: 记录id:param value: 值:param record_type: 记录类型,默认 A:param record_line: 线路类型,使用‘默认’即可:return:"""try:r = requests.post(self._alter_record_URL, data={'login_token': self._login_token,'format': self._format,'domain': domain,'sub_domain': sub_domain,'record_id': record_id,'record_type': record_type,'record_line': record_line,'value': value,})response_record_json = r.json()if response_record_json['status']['code'] == '1':self._logger.info(f"修改记录{record_id}成功。")else:self._logger.error(f"记录ID:{record_id}修改失败,错误信息: {response_record_json['status']['message']}。")except Exception as e:self._logger.error(e)def del_record(self, domain, record_id):"""删除解析记录:param domain: 域名,:param record_id: 记录id,通过get_record获取:return:"""try:r = requests.post(self._del_record_URL, data={'login_token': self._login_token,'format': self._format,'domain': domain,'record_id': record_id,})response_record_json = r.json()if response_record_json['status']['code'] == '1':self._logger.info(f"您正在解析记录,ID为:{record_id},"f"删除状态值为:{response_record_json['status']['code']}, "f"信息为:{response_record_json['status']['message']}")else:self._logger.error(f"您正在解析记录,ID为:{record_id},"f"删除状态值为:{response_record_json['status']['code']}, "f"信息为:{response_record_json['status']['message']}")except Exception as e:self._logger.error(e)def update_ip():"""更新公网ip地址,定期运行保证域名正确,因为只有一个域名,只有一个ip,所以每次运行,获取域名的A类型解析记录,将所有记录ip修改为外网ip:return:"""pod = Dnspod(Settings.login_token)ip_public = pod.get_outer_ip()if ip_public:records = pod.get_record(Settings.domain)for record in records:if ip_public == record['value']:print('地址未改变,无需更改')else:pod.alter_record(record['domain'], record['name'], record['id'], ip_public)if __name__ == '__main__':update_ip()

Dnspod域名设置相关推荐

  1. 轻松搞定DnsPod域名解析设置

        1 abelyao   319 天前   ♥ 1 话说- 楼主- 如果只是为了 DDNS 可以用 Dnspod 有 API 可以直接操作-  并且通过 cron 定时任务,一行脚本的事- */ ...

  2. 云服务器怎么设置域名,云服务器域名设置在哪里

    可能不同的云服务厂商域名设置的方式略有不同,不过,大体来讲,方法应该都差不多的.下面我们以 1.打开浏览器,搜索西部数码官网并登陆账号密码,到会员中心. 2.进入管理中心后,在左侧的业务管理中找到 3 ...

  3. nginx多域名设置和多子目录实现共用一端口

    nginx多域名设置,多子目录,共用一端口 nginx多域名设置,多子目录,公用一端口 前段时间自己买了一个80G的服务器,所以想把原来的网站都整合到这台服务器上面,现在在服务器上绑定了五个域名. 下 ...

  4. 二级域名三级域名设置方法

    因为网站需要,要设定二级和三域名,写个东西出来,大家看看. 比如您的域名是haoday.com,需要增加一个二级域名bbs.haoday.com,当然www.haoday.com也是二级域名,只不过是 ...

  5. 微信公众平台-服务号:网页授权域名 设置

    微信公众平台-服务号的网页授权域名 设置 设置与开发->公众号设置->功能设置->网页授权域名 一:下载认证文件,放置服务器中 二:设置服务器中的 Https中的nginx服务 ng ...

  6. CSDN VIP特权(添加自定义模块与域名设置)

    文章目录 一.自定义模块 二.域名设置 一.自定义模块 点击管理博客 选择自定义模块 添加标题和内容(自定,也可以参照下面的例子) 标题 good good study,day day up! 内容( ...

  7. 2008服务器域名无限解析吗,给域名设置多少个DNS解析服务器(nameserver)

    前面文章提到域名的主从 nameservers,里面用到的例子是使用了三家服务商,一共设置了 7 个 nameservers. 那么这里有一个问题就提出来了,最好给域名设置多少个DNS解析服务器(na ...

  8. Nginx-部署2个vue项目(多个项目)-二级域名设置代理

    前言 最近在实际开发过程中,需要在服务器部署2个项目.需要nginx二级域名. 开始时候在网上查了一圈,各有说法,不是很全,很头大.这里把自己成功的二级域名代理记录一下. 网上有很多文章说要该rout ...

  9. 未备案域名设置域名URL转发

    未备案域名设置域名URL转发 1.首先,打开Cloudflare网站: https://www.cloudflare.com/zh-cn/ 注册账号 2.登录账号添加站点: 配置好域名即可 ps:可惜 ...

最新文章

  1. 在pcDuino上运行Python
  2. 推荐系统笔记:矩阵分解+基于邻居的模型
  3. Java实现消息消费
  4. 【软件设计师】2020-08-08
  5. P7137-[THUPC2021 初赛]切切糕【dp】
  6. 避免在ConcurrentHashMap.computeIfAbsent()中进行递归
  7. c语言单链表_突破C语言难点之单链表?一绘图即可
  8. tomcat启动问题
  9. 2021-2025年中国制药废物处理与管理行业市场供需与战略研究报告
  10. 前端证券项目_非科班二本前端大厂面试的心路历程和总结(腾讯、头条、阿里、京东)...
  11. Codejock Xtreme Calendar 最新版下载试用2021版本
  12. 网易云音乐多账号全自动升级,彻底解放双手
  13. 嵌入式——Linux 学习之路(二):Docker
  14. Linux-命令:ll命令报错-bash: ll: command not found
  15. 成就系统实现(三)-架构设计
  16. leetcode--计算质数(素数)
  17. 7-2 查找书籍 (20 分)
  18. 第六章 C语言数组_C语言数组的越界和溢出
  19. linux用gzip文件怎么打开,linux下怎么解后缀名是gzip的文件?
  20. 动态再平衡投资策略历史数据回测

热门文章

  1. 苹果的破局几招:修漏洞、降价、官方认证翻新机……...
  2. 4.3 期货每日早盘操作建议
  3. 到处excel表格的数据和页面的数据不一致
  4. 关于大学在校生对共享单车的用后体验的调查报告
  5. 从零学前端第一讲:前端开发是什么?给初学者有什么建议?
  6. 20189218 2018-2019-2 《密码与安全新技术专题》第7周作业
  7. centos7上面安装geany编辑器
  8. iMazing2021mac win最先进的苹果iPhone和iPad管理软件
  9. java接口自动化测试-导入xslx模板进行批量检索
  10. 电脑操作手机scrcpy软件