阿里云 动态ddns

环境
nodejs版本不低于10.16
系统window,centos 均可

package.json

{"name": "aliyun-ddns","version": "2.1.0","main": "ddns.js","scripts": {"start": "node ddns.js"},"author": "luoyefe","license": "MIT","dependencies": {"@alicloud/pop-core": "^1.7.13","axios": "^0.20.0"},"description": "借助阿里云解析API实现DDNS"
}

nodejs代码


const config={accessKeyId: "666666", // 你的阿里云AccessKey IDaccessKeySecret: "888888",// 你的阿里云AccessKey SecretDomainName:  'google.com', //你的域名RRKeyWord: 'ddns',  // 子域名
}const Core = require('@alicloud/pop-core');
const axios = require('axios');const client = new Core({accessKeyId: config.accessKeyId,accessKeySecret: config.accessKeySecret,endpoint: 'https://alidns.aliyuncs.com',apiVersion: '2015-01-09'
});// 获取当前公网IP地址,用多个API ,防止一个失效后,有另外的进行替代
async function getPublicIP() {const ipApis = ['https://api.ipify.org?format=json','https://ipinfo.io/json','https://icanhazip.com','http://ip-api.com/json'];for (const api of ipApis) {try {const response = await axios.get(api);const ip = response.data.ip || response.data; // 处理不同API的返回结构console.log(`成功从 ${api} 获取公网IP: ${ip}`);return ip;} catch (error) {console.error(`从 ${api} 获取公网IP失败:`, error);}}throw new Error('所有IP查询API均不可用');
}// 获取指定域名和子域名的DNS记录ID及其值
async function getRecordIdAndValue(domainName, rr) {return new Promise((resolve, reject) => {client.request('DescribeDomainRecords', {DomainName: domainName,RRKeyWord: rr}, { method: 'POST' }).then((result) => {const record = result.DomainRecords.Record.find(r => r.RR === rr);if (record) {resolve({ recordId: record.RecordId, value: record.Value });} else {reject(new Error('没有找到对应的记录'));}}, (ex) => {reject(ex);});});
}// 更新DNS记录
async function updateDNSRecord(recordId, ip,rr) {return new Promise((resolve, reject) => {client.request('UpdateDomainRecord', {RecordId: recordId,RR: rr,Type: 'A',Value: ip}, { method: 'POST' }).then((result) => {resolve(result);}, (ex) => {console.log("client.request失败",ex)reject(ex);});});
}// 主程序
(async () => {try {let domainName=config.DomainName;let rr=config.RRKeyWord;const ip = await getPublicIP();console.log('当前公网IP地址:', ip);const { recordId, value } = await getRecordIdAndValue(domainName, rr);console.log('DNS记录ID:', recordId);console.log('当前DNS记录值:', value);if (value !== ip) {const result = await updateDNSRecord(recordId, ip,rr);console.log('DNS记录更新成功:', result);} else {console.log('DNS记录值未变化,无需更新');}} catch (error) {console.error('操作失败:', error);}
})();

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/22546.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ant-design vue3 中上传图片组件的回传图片显示问题

最近在做web端的上传图片 有一个数据列表中的编辑功能 是之前上传的图片 点击编辑进入编辑页面 会显示之前写的数据 现在需要把原来上传的图片 显示出来 因为之前给后端上传的 图片格式 是一个数组 ["图片链接",“图片链接”。。。] 后端给我返回的数据也…

ESP32 ESP8266 Arduino开发环境离线安装

在下面链接中详细介绍了ESP32 ESP8266在线安装方法, 智能红外遥控器(二): Arduino环境搭建及库安装_arduino ide 1.8.13-CSDN博客 但是由于在线安装受国外服务器的影响很多时间会不成功,下面介绍使用离线安装包的方法…

AI视频教程下载:给初学者的ChatGPT提示词技巧

你是否厌倦了花费数小时在可以通过强大的语言模型自动化的琐碎任务上?你是否准备好利用 ChatGPT——世界上最先进的语言模型——并将你的生产力提升到下一个水平? ChatGPT 是语言处理领域的游戏规则改变者,它能够理解并响应自然语言&#xf…

机器学习ML.NET

适用于 .NET 的机器学习 ML.NET 是用于 .NET 的跨平台开源机器学习 (ML) 框架。 ML.NET 允许开发人员在其 .NET 应用程序中轻松构建、训练、部署和使用自定义模型,而无需开发机器学习模型的专业知识或使用 Python 或 R 等其他编程语言的经验。该框架提供从文件和数据库加载…

学习笔记 SD卡(1)

SD:Secure Digital Card 安全数据卡 本质:nand flash 控制芯片 SD卡三种系列:SD卡(FULL SIZE)MINISD卡 MicroSD卡 特点:容量大 高安全性 体积小 传输速度快 接口简单 SD卡储存容量等级 SD卡类型协议规范文件系统…

百度之星题目记录

目录 1 介绍2 训练3 参考 1 介绍 本博客记录百度之星比赛的题目及解法。 2 训练 题目1:BD202301公园 C代码如下, 解题思路:计算起始结点a到所有结点的最小距离(因为是等长边,所以可以用bfs)&#xff0…

JVM运行时数据区 - 本地方法栈

在JDK自带的方法库中常常看到被native修饰的方法,这些方法没有方法体实现,它们方法体通常是由C/C语言实现,这种方法称为本地方法。 在JVM规范中,本地方法也有和Java方法一样的方法调用栈,称为本地方法栈。由于规范对本…

JavaWeb基础(JQuery,XML及解析)

这个阶段有点拖沓了,因为事情比较多,耽搁了一段时间,学习的主要内容为JQuery和XML,因为vue的出现,JQuery技术现在已经不流行了,但是不流行不代表我不会,JQuery最最最最核心的就是他的$()核心函数…

十大排序 —— 希尔排序

十大排序 —— 希尔排序 什么是希尔排序插入排序希尔排序递归版本 我们今天来看另一个很有名的排序——希尔排序 什么是希尔排序 希尔排序(Shell Sort)是插入排序的一种更高效的改进版本,由Donald Shell于1959年提出。它通过比较相距一定间…

路由策略案例

一、路由策略案例 如图所示,某公司内终端通过Switch接入公司内部网络。如果该公司内存在非如图1所示,运行OSPF协议的网络中,RouterA从Internet网络接收路由,并头RouterB提供了部分Internet路由。其中: RouterA仅提供172.1…

工厂模式——工厂方法模式+注册表

工厂方法模式的瑕疵 在前一篇笔记中我们介绍了工厂方法模式,示例的类图如下: 考虑一种情况:现在要在程序运行时,根据外部资源,动态的实例化对象。也就是说在编译期我们无法知道要实例化的对象的类型。因此在实例化的过…

Java 新手入门:基础知识点一览

Java 新手入门:基础知识点一览 想要踏入 Java 的编程世界?别担心,这篇文章将用简单易懂的表格形式,带你快速了解 Java 的基础知识点。 一、Java 是什么? 概念解释Java一种面向对象的编程语言,拥有跨平台、…

男人只需布局三年,就没人敢瞧不起你

一、每天布局:1、每天坚持早睡早起。晚上23:00前睡,早上6:00前起,坚持用心中的梦想唤醒自己。2、每天坚持阅读。尤其要读名人传记,用名人的经历启迪自己,站在巨人的肩上看世界。3、每天坚持按日程计划行事。…

JDBC操作数据库

JDBC操作数据库 JdbcTemplate是Spring框架提供的一个对JDBC进行封装的工具类,它用于简化JDBC的使用。 以下是使用JdbcTemplate操作数据库的一些常见方法: 1、使用JdbcTemplate插入数据: Autowired private JdbcTemplate jdbcTemplate;pub…

JDBC-MySQL

JDBC-MySQL 1.JDBC 操作步骤1.1 DriverManager1.2.Connection对象1.3 Statement1.4 PreparedStatement 1.JDBC 操作步骤 public void quickStart() throws ClassNotFoundException, SQLException {//1、注册驱动 (确认要使用哪个数据库)Class.forName(&…

嵌入式中,日志调试法的一些规则!

日志调试法是嵌入式系统开发中常用的一种调试手段,它通过在代码中添加日志信息来记录程序的运行状态,帮助开发者了解程序在运行过程中的行为,从而定位问题所在。以下是一些嵌入式日志调试的基本规则和示例代码。 日志调试的基本规则 确定日志…

C++使用QtHttpServer开发服务端Server的Http POST接口和客户端Client示例

Client HTTP POST 假设http://127.0.0.1:8888/post/是一个能够接受POST请求的路径,我们想要向它提交一段json数据,用Qt可以这样实现: Suppose we want to make an HTTP POST with json body to http://127.0.0.1:8888/post/. QCoreApplica…

短视频直播教学课程小程序的作用是什么

只要短视频/直播做的好,营收通常都不在话下,近些年,线上自媒体行业热度非常高,每条细分赛道都有着博主/账号,其各种优势条件下也吸引着其他普通人冲入。 然无论老玩家还是新玩家,面对平台不断变化的规则和…

《2024年DDoS趋势报告》:DDoS攻击规模飙升233.33%

2023年,数字领域面临着分布式拒绝服务(DDoS)攻击的变革浪潮,攻击速度创纪录地达到了每秒700 Gbps和8000万数据包。这些事件跨越了从游戏到金融服务的各个行业,突显了DDoS是一种普遍存在的风险。 值得注意的是&#xf…

Ubuntu server 24 (Linux) sudo 免输密码

1 sudo 使用要输入密码,费时费力。 2 sudo命令免输密码,需要修改/etc/sudoers文件 #本文以test用户为例,#允许不需要输入密码执行 sudo vi /etc/sudoers test ALL(ALL) NOPASSWD: ALL %sudo ALL(ALL:ALL) ALL --> #%sudo ALL(ALL:ALL) ALL#所有…