当前位置: 首页 > news >正文

【工具类】阿里域名关联ip(python版)

获取代码如下

# coding=utf-8import argparse
import json
import urllib
import logging# 加载 ali 核心 SDK
from aliyunsdkcore.client import AcsClient
from aliyunsdkalidns.request.v20150109 import (DescribeSubDomainRecordsRequest,AddDomainRecordRequest,UpdateDomainRecordRequest,DeleteDomainRecordRequest,
)logger = logging.getLogger(__name__)
handler = logging.StreamHandler()
handler.setFormatter(logging.Formatter("%(asctime)s %(levelname)s[%(filename)s:%(lineno)d] %(message)s"))
logger.addHandler(handler)
logger.setLevel(logging.INFO)# get_public_ip 获取外网IP
# 备选url: http://www.3322.org/dyndns/getip 是最纯净的格式
# 备选url1: http://pv.sohu.com/cityjson?ie=utf-8   json格式, 对获取值作进一步处理才能使用
# 备选url2: curl -L tool.lu/ip curl方式获取, 对获取值作进一步处理才能使用
def get_public_ip():url = "http://www.3322.org/dyndns/getip"  # 可考虑将此URL作为配置项,以便于未来更改try:with urllib.request.urlopen(url) as response:html = response.read()# 使用strip()代替replace("\n", ""),以删除所有前导和尾随空白ip = str(html, encoding="utf-8").strip()return ipexcept urllib.error.URLError as e:logger.info(f"Error fetching IP: {e.reason}")return None# 查询记录
# {
#   "TotalCount":  1,
#   "PageSize":  20,
#   "RequestId":  "DAD4AEC3-3F09-569E-88FF-0732E93CBDDE",
#   "DomainRecords":  {
#      "Record":  [
#        {
#           "Status":  "ENABLE",
#           "Line":  "default",
#           "RR":  "c",
#           "Locked":  false,
#           "Type":  "A",
#           "DomainName":  "baidu.cn",
#           "Value":  "127.0.0.1",
#           "RecordId":  "880481632183704576",
#           "TTL":  600,
#           "Weight":  1
#        }
#      ]
#   },
#   "PageNumber":  1
# }
def get_domain_info(client, sub_domain, domain_name):request = DescribeSubDomainRecordsRequest.DescribeSubDomainRecordsRequest()request.set_accept_format("json")# 记录类型,A表示IP 地址记录,具体参考 https://ephen.me/2016/dns-rr/request.set_Type("A")request.set_SubDomain(sub_domain+"."+domain_name)try:response = client.do_action_with_exception(request)response_str = response.decode("utf-8")records = json.loads(response_str)return recordsexcept Exception as e:logger.error(f"An error occurred: {e}")return Nonedef _send_req(request, client, value, rr, domainname):"""发送DNS记录请求Args:request (DNSRequest): DNS请求对象client (DnsClient): DNS客户端对象value (str): 新的IP地址rr (str): 子域名名称domainname (str): 主域名Returns:dict: 包含TotalCount字段的字典,表示获取到的记录条数,0表示没有记录,其他数字表示有多少条相同记录,正常有记录的值应该为1,如果值大于1则应该检查是不是重复添加了相同的记录。"""request.set_accept_format("json")# request.set_Priority('1')  # MX 记录时的必选参数request.set_TTL("600")  # 可选值的范围取决于你的阿里云账户等级,免费版为 600 - 86400 单位为秒request.set_Value(value)  # 新增的 ip 地址# 记录类型,IP 地址记录,具体参考 https://ephen.me/2016/dns-rr/request.set_Type("A")request.set_RR(rr)  # 子域名名称request.set_DomainName(domainname)  # 主域名# 获取记录信息,返回信息中包含 TotalCount 字段,表示获取到的记录条数 0 表示没有记录# 其他数字为多少表示有多少条相同记录,正常有记录的值应该为1,如果值大于1则应该检查是不是重复添加了相同的记录response = client.do_action_with_exception(request)response = str(response, encoding="utf-8")relsult = json.loads(response)return relsultdef add_domain_record(client, value, rr, domain_name):request = AddDomainRecordRequest.AddDomainRecordRequest()return _send_req(request, client, value, rr, domain_name)def update_domain_record(client, value, rr, record_id):request = UpdateDomainRecordRequest.UpdateDomainRecordRequest()return _send_req(request, client, value, rr, record_id)def del_domain_record(client, sub_domain, domain_name):try:info = get_domain_info(client, sub_domain, domain_name)if info["TotalCount"] == 0:logger.info(f"{sub_domain}.{domain_name} not exist")return 0elif info["TotalCount"] == 1:record_id = info["DomainRecords"]["Record"][0]["RecordId"]request = DeleteDomainRecordRequest.DeleteDomainRecordRequest()request.set_accept_format("json")request.set_RecordId(record_id)result = client.do_action_with_exception(request)logger.info(f"del {sub_domain}.{domain_name} result {result}")return 0else:logger.warning("multiple resource records, please check at https://dns.console.aliyun.com")return -1except Exception as e:logger.error(f"error occurred {sub_domain}.{domain_name} result {e}")return -2def set_domain_record(client, value, sub_domain, domain_name):info = get_domain_info(client, sub_domain, domain_name)# 检查info是否为空以及其是否包含必要的键if not info or "TotalCount" not in info:logger.error("Failed to get domain info or invalid response format.")returnif info["TotalCount"] == 0:result = add_domain_record(client, value, sub_domain, domain_name)logger.info(f"adding {value} for {sub_domain}.{domain_name} result {result}")elif info["TotalCount"] == 1:record_info = info.get("DomainRecords", {}).get("Record", [{}])[0]record_id = record_info.get("RecordId")old_ip = record_info.get("Value")if value == old_ip:logger.info(f"same val {value}, no need to update")else:result = update_domain_record(client, value, sub_domain, record_id)logger.info(f"update {value} for {sub_domain}.{domain_name} result {result}")else:logger.warning("multiple resource records, please check at https://dns.console.aliyun.com")# python alidns.py --key=xxx --secret=xxx --domain=baidu.cn
if __name__ == "__main__":parser = argparse.ArgumentParser()parser.description='please enter correct para'# AccessKey 和 Secret  建议使用 RAM 子账户的 KEY 和 SECRET 增加安全性parser.add_argument("-k", "--key", help="accessKey", type=str, default="private accessKey")parser.add_argument("-s", "--secret", help="secret", type=str, default="private secret")parser.add_argument("-d", "--domain", help="domain name",  type=str, default="baidu.cn")args = parser.parse_args()public_ip = get_public_ip()logger.info(f"public_ip {public_ip}")# 地区节点 可选地区取决于你的阿里云帐号等级,普通用户只有四个,分别是杭州、上海、深圳、河北,具体参考官网APIregionId = "cn-hangzhou"client = AcsClient(args.key, args.secret, regionId)  # 配置认证信息domain_name = args.domain       # 设置主域名sub_domains = ["a", "b", "c"]   # 子域名列表  列表参数可根据实际需求增加或减少值# 删除记录测试for sub_domain in sub_domains:del_domain_record(client, sub_domain, domain_name)# 获取记录测试for sub_domain in sub_domains:info = get_domain_info(client, sub_domain, domain_name)print(f"get-info: {json.dumps(info)}")for sub_domain in sub_domains:  # 循环子域名列表进行批量操作set_domain_record(client, public_ip, sub_domain, domain_name)# 获取记录测试for sub_domain in sub_domains:info = get_domain_info(client, sub_domain, domain_name)print(f"get-info: {json.dumps(info)}")

输入输出

python alidns.py --key=xxx --secret=xxx --domain=baidu.cn2024-02-23 17:46:13,408 INFO[alidns.py:187] public_ip xxx.xxx.xxx.xxx
2024-02-23 17:46:13,890 INFO[alidns.py:142] del a.baidu.cn result b'{"RequestId":"3FC56A68-678C-5039-A905-55151473925A","RecordId":"880481630604579840"}'
2024-02-23 17:46:14,313 INFO[alidns.py:142] del b.baidu.cn result b'{"RequestId":"E2F92A34-130F-5108-A6B6-05139A3666C3","RecordId":"880481631418256384"}'
2024-02-23 17:46:14,714 INFO[alidns.py:142] del c.baidu.cn result b'{"RequestId":"B6ACC80B-0F85-5603-8475-9B0583ED5B95","RecordId":"880481632183704576"}'
get-info: {"TotalCount": 0, "PageSize": 20, "RequestId": "4A21718E-8DD1-5878-AD8E-3EA708C53716", "DomainRecords": {"Record": []}, "PageNumber": 1}
get-info: {"TotalCount": 0, "PageSize": 20, "RequestId": "95405D16-2E81-54C5-B794-D73BEF51F35B", "DomainRecords": {"Record": []}, "PageNumber": 1}
get-info: {"TotalCount": 0, "PageSize": 20, "RequestId": "09C39264-2CA7-5BFF-9250-9AE83242890C", "DomainRecords": {"Record": []}, "PageNumber": 1}
2024-02-23 17:46:15,474 INFO[alidns.py:163] adding xxx.xxx.xxx.xxx for a.baidu.cn result {'RequestId': '11D855D8-1A9A-52C9-B0D4-0F0E5C161453', 'RecordId': '880482138503304192'}
2024-02-23 17:46:15,831 INFO[alidns.py:163] adding xxx.xxx.xxx.xxx for b.baidu.cn result {'RequestId': '93A11426-5992-58A6-9D52-83ACC2310769', 'RecordId': '880482139254086656'}
2024-02-23 17:46:16,188 INFO[alidns.py:163] adding xxx.xxx.xxx.xxx for c.baidu.cn result {'RequestId': 'DC94B74E-074E-5554-BCAC-BEEFD0AC8C30', 'RecordId': '880482140006968320'}
get-info: {"TotalCount": 1, "PageSize": 20, "RequestId": "0D90F3A3-6CD9-5295-80E7-8AAE7D9D2C34", "DomainRecords": {"Record": [{"Status": "ENABLE", "Line": "default", "RR": "a", "Locked": false, "Type": "A", "DomainName": "baidu.cn", "Value": "xxx.xxx.xxx.xxx", "RecordId": "880482138503304192", "TTL": 600, "Weight": 1}]}, "PageNumber": 1}
get-info: {"TotalCount": 1, "PageSize": 20, "RequestId": "0205D91F-123F-57B1-91F9-1C5D82B70911", "DomainRecords": {"Record": [{"Status": "ENABLE", "Line": "default", "RR": "b", "Locked": false, "Type": "A", "DomainName": "baidu.cn", "Value": "xxx.xxx.xxx.xxx", "RecordId": "880482139254086656", "TTL": 600, "Weight": 1}]}, "PageNumber": 1}
get-info: {"TotalCount": 1, "PageSize": 20, "RequestId": "7653F278-088F-5CDE-9ACC-78958FCDF662", "DomainRecords": {"Record": [{"Status": "ENABLE", "Line": "default", "RR": "c", "Locked": false, "Type": "A", "DomainName": "baidu.cn", "Value": "xxx.xxx.xxx.xxx", "RecordId": "880482140006968320", "TTL": 600, "Weight": 1}]}, "PageNumber": 1}

相关文章:

【工具类】阿里域名关联ip(python版)

获取代码如下 # codingutf-8import argparse import json import urllib import logging# 加载 ali 核心 SDK from aliyunsdkcore.client import AcsClient from aliyunsdkalidns.request.v20150109 import (DescribeSubDomainRecordsRequest,AddDomainRecordRequest,UpdateDo…...

STM32自学☞输入捕获测频率和占空比案例

本文是通过PA0口输出PWM波,然后通过PA6口捕获PWM波的频率和占空比,最终在oled屏上显示我们自己设置的频率和占空比。由于和前面的pwm呼吸灯代码有重合部分所以本文中的代码由前者修改而来,对于文件命名不要在意。 pwm_led.c文件 /* 编写步…...

[yolov9]使用python部署yolov9的onnx模型

【框架地址】 https://github.com/WongKinYiu/yolov9 【yolov9简介】 在目标检测领域,YOLOv9 实现了一代更比一代强,利用新架构和方法让传统卷积在参数利用率方面胜过了深度卷积。 继 2023 年 1 月 正式发布一年多以后,YOLOv9 终于来了&a…...

ShellExecute的用法

1、标准用法 ShellExecute函数原型及参数含义如下: function ShellExecute(hWnd: HWND; Operation, FileName, Parameters,Directory: PChar; ShowCmd: Integer): HINST; stdcall; ●hWnd:用于指定父窗口句柄。当函数调用过程出现错误时,它将…...

蓝桥杯:递增三元组

题目 递增三元组&#xff08;2018年蓝桥杯真题&#xff09; 题目描述&#xff1a; 给定三个整数数组 A [A1, A2, … AN], B [B1, B2, … BN], C [C1, C2, … CN]&#xff0c; 请你统计有多少个三元组(i, j, k) 满足&#xff1a; 1 < i, j, k < N Ai < Bj &…...

目标检测卷王YOLO卷出新高度:YOLOv9问世

论文摘要:如今的深度学习方法重点关注如何设计最合适的目标函数,使得模型的预测结果能够最接近真实情况。 同时,必须设计一个适当的架构,可以帮助获取足够的信息进行预测。 现有方法忽略了一个事实,即当输入数据经过逐层特征提取和空间变换时,大量信息将会丢失。 本文将深…...

华为---RSTP(二)---RSTP基本配置示例

目录 1. 示例要求 2. 网络拓扑图 3. 配置命令 4. 测试终端连通性 5. RSTP基本配置 5.1 启用STP 5.2 修改生成树协议模式为RSTP 5.3 配置根交换机和次根交换机 5.4 设置边缘端口 6. 指定端口切换为备份端口 7. 测试验证网络 1. 示例要求 为防止网络出现环路&#xf…...

【Python笔记-设计模式】装饰器模式

一、说明 装饰器模式是一种结构型设计模式&#xff0c;旨在动态的给一个对象添加额外的职责。 (一) 解决问题 不改变原有对象结构的情况下&#xff0c;动态地给对象添加新的功能或职责&#xff0c;实现透明地对对象进行功能的扩展。 (二) 使用场景 如果用继承来扩展对象行…...

二十八、图像的高斯模糊操作

项目功能实现&#xff1a;对一张图片进行高斯模糊操作 按照之前的博文结构来&#xff0c;这里就不在赘述了 更多的图像模糊操作原理可参考博文&#xff1a;七、模糊操作&#xff0c;里面有详细原理讲解&#xff0c;只不过代码是python写的。 一、头文件 gaussian_blur.h #p…...

开源分子对接程序rDock的安装及使用流程

欢迎浏览我的CSND博客&#xff01; Blockbuater_drug …点击进入 前言 本文介绍开源分子对接程序rDock在Linux Ubuntu 22.04系统上的conda安装、编译安装过程及程序使用流程。 一、rDock是什么&#xff1f; rDock来源 rDock是一个快速、多功能的开源对接程序&#xff0c;可用…...

【JavaEE】_tomcat的安装与使用

目录 1. Tomcat简介 2. Tomcat安装 2.1 下载Tomcat并解压缩 2.2 启动Tomcat 2.2.1 Tomcat乱码问题 2.2.2 Tomcat闪退问题 2.3 访问Tomcat欢迎页面 3. 使用Tomcat部署前端代码 3.1 路径匹配 3.2 文件路径访问与网络访问 4. 静态页面与动态页面 5. 基于tomcat的网站后…...

实现一个Windows环境一键启停Oracle的bat脚本

Oracle数据库有许多优点,其中一些最重要的包括: 可靠性和稳定性: Oracle数据库经过长期的发展和测试,被广泛认为是非常可靠和稳定的数据库管理系统。它在大型企业和关键业务环境中被广泛应用,能够处理高负载和大规模的数据。 高性能: Oracle数据库具有优化的查询处理器和…...

大数据-数据可视化-环境部署vue+echarts+显示案例

文章目录 一、安装node.js1 打开火狐浏览器,下载Node.js2 进行解压3 配置环境变量4 配置生效二、安装vue脚手架1 下载vue脚手架,耐心等待。三、创建vue项目并启动1 创建2 启动四、下载echarts.js与axios.js到本地。五、图表显示demo【以下所有操作均在centos上进行】 一、安…...

spark超大数据批量写入redis

利用spark的分布式优势&#xff0c;一次性批量将7000多万的数据写入到redis中。 # 配置spark接口 import os import findspark from pyspark import SparkConf from pyspark.sql import SparkSession os.environ["JAVA_HOME"] "/usr/local/jdk1.8.0_192"…...

C# Socket的使用

C# 中的 System.Net.Sockets.Socket 类是 .NET Framework 提供的核心类&#xff0c;用于处理网络套接字编程。Socket 类是用于网络编程的基础类&#xff0c;它位于 System.Net.Sockets 命名空间中。 使用 Socket 类&#xff0c;可以创建客户端和服务器应用程序来进行基于TCP、…...

Spring Cloud + Vue前后端分离-第17章 生产打包与发布

源代码在GitHub - 629y/course: Spring Cloud Vue前后端分离-在线课程 Spring Cloud Vue前后端分离-第17章 生产打包与发布 17-1 注册中心配置中心Nacos 注册中心 Nacos 快速开始 | Nacos 本节内容&#xff1a;使用nacos作注册中心配置中心&#xff0c;不用eureka Nacos…...

力扣热题100_普通数组_56_合并区间

文章目录 题目链接解题思路解题代码 题目链接 56. 合并区间 以数组 intervals 表示若干个区间的集合&#xff0c;其中单个区间为 intervals[i] [starti, endi] 。请你合并所有重叠的区间&#xff0c;并返回 一个不重叠的区间数组&#xff0c;该数组需恰好覆盖输入中的所有区…...

Springcloud OpenFeign 的实现(二)

Springcloud OpenFeign 的实现&#xff08;一&#xff09; 一、Feign request/response 压缩 您可以考虑为您的外部请求启用请求或响应GZIP压缩。您可以通过启用以下属性之一来完成此操作&#xff1a; feign.compression.request.enabledtrue feign.compression.response.en…...

[C++]智能指针用法

一、智能指针存在的意义 智能指针主要解决以下问题&#xff1a; &#xff08;1&#xff09;内存泄漏&#xff1a;内存手动释放&#xff0c;使用智能指针可以自动释放。 &#xff08;2&#xff09;共享所有权指针的传播和释放&#xff0c;比如多线程使用同一个对象时析构问题…...

六、行列式基本知识

目录 1、行列式的特性 2、行列式的计算方法: 2.1 通过行列式的定义去计算:对角法则。 2. 2 利用行列式的性质将行列式转化为上三角行列式: ①行列式的性质 : 性质一: 性质二: 性质三: 性质四:行列式之间的加法...

idea大量爆红问题解决

问题描述 在学习和工作中&#xff0c;idea是程序员不可缺少的一个工具&#xff0c;但是突然在有些时候就会出现大量爆红的问题&#xff0c;发现无法跳转&#xff0c;无论是关机重启或者是替换root都无法解决 就是如上所展示的问题&#xff0c;但是程序依然可以启动。 问题解决…...

CMake基础:构建流程详解

目录 1.CMake构建过程的基本流程 2.CMake构建的具体步骤 2.1.创建构建目录 2.2.使用 CMake 生成构建文件 2.3.编译和构建 2.4.清理构建文件 2.5.重新配置和构建 3.跨平台构建示例 4.工具链与交叉编译 5.CMake构建后的项目结构解析 5.1.CMake构建后的目录结构 5.2.构…...

linux 错误码总结

1,错误码的概念与作用 在Linux系统中,错误码是系统调用或库函数在执行失败时返回的特定数值,用于指示具体的错误类型。这些错误码通过全局变量errno来存储和传递,errno由操作系统维护,保存最近一次发生的错误信息。值得注意的是,errno的值在每次系统调用或函数调用失败时…...

高等数学(下)题型笔记(八)空间解析几何与向量代数

目录 0 前言 1 向量的点乘 1.1 基本公式 1.2 例题 2 向量的叉乘 2.1 基础知识 2.2 例题 3 空间平面方程 3.1 基础知识 3.2 例题 4 空间直线方程 4.1 基础知识 4.2 例题 5 旋转曲面及其方程 5.1 基础知识 5.2 例题 6 空间曲面的法线与切平面 6.1 基础知识 6.2…...

技术栈RabbitMq的介绍和使用

目录 1. 什么是消息队列&#xff1f;2. 消息队列的优点3. RabbitMQ 消息队列概述4. RabbitMQ 安装5. Exchange 四种类型5.1 direct 精准匹配5.2 fanout 广播5.3 topic 正则匹配 6. RabbitMQ 队列模式6.1 简单队列模式6.2 工作队列模式6.3 发布/订阅模式6.4 路由模式6.5 主题模式…...

20个超级好用的 CSS 动画库

分享 20 个最佳 CSS 动画库。 它们中的大多数将生成纯 CSS 代码&#xff0c;而不需要任何外部库。 1.Animate.css 一个开箱即用型的跨浏览器动画库&#xff0c;可供你在项目中使用。 2.Magic Animations CSS3 一组简单的动画&#xff0c;可以包含在你的网页或应用项目中。 3.An…...

免费PDF转图片工具

免费PDF转图片工具 一款简单易用的PDF转图片工具&#xff0c;可以将PDF文件快速转换为高质量PNG图片。无需安装复杂的软件&#xff0c;也不需要在线上传文件&#xff0c;保护您的隐私。 工具截图 主要特点 &#x1f680; 快速转换&#xff1a;本地转换&#xff0c;无需等待上…...

Ubuntu Cursor升级成v1.0

0. 当前版本低 使用当前 Cursor v0.50时 GitHub Copilot Chat 打不开&#xff0c;快捷键也不好用&#xff0c;当看到 Cursor 升级后&#xff0c;还是蛮高兴的 1. 下载 Cursor 下载地址&#xff1a;https://www.cursor.com/cn/downloads 点击下载 Linux (x64) &#xff0c;…...

论文阅读:LLM4Drive: A Survey of Large Language Models for Autonomous Driving

地址&#xff1a;LLM4Drive: A Survey of Large Language Models for Autonomous Driving 摘要翻译 自动驾驶技术作为推动交通和城市出行变革的催化剂&#xff0c;正从基于规则的系统向数据驱动策略转变。传统的模块化系统受限于级联模块间的累积误差和缺乏灵活性的预设规则。…...

人工智能 - 在Dify、Coze、n8n、FastGPT和RAGFlow之间做出技术选型

在Dify、Coze、n8n、FastGPT和RAGFlow之间做出技术选型。这些平台各有侧重&#xff0c;适用场景差异显著。下面我将从核心功能定位、典型应用场景、真实体验痛点、选型决策关键点进行拆解&#xff0c;并提供具体场景下的推荐方案。 一、核心功能定位速览 平台核心定位技术栈亮…...