【工具类】阿里域名关联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:用于指定父窗口句柄。当函数调用过程出现错误时,它将…...
蓝桥杯:递增三元组
题目 递增三元组(2018年蓝桥杯真题) 题目描述: 给定三个整数数组 A [A1, A2, … AN], B [B1, B2, … BN], C [C1, C2, … CN], 请你统计有多少个三元组(i, j, k) 满足: 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. 示例要求 为防止网络出现环路…...

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

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

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

【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的分布式优势,一次性批量将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 提供的核心类,用于处理网络套接字编程。Socket 类是用于网络编程的基础类,它位于 System.Net.Sockets 命名空间中。 使用 Socket 类,可以创建客户端和服务器应用程序来进行基于TCP、…...

Spring Cloud + Vue前后端分离-第17章 生产打包与发布
源代码在GitHub - 629y/course: Spring Cloud Vue前后端分离-在线课程 Spring Cloud Vue前后端分离-第17章 生产打包与发布 17-1 注册中心配置中心Nacos 注册中心 Nacos 快速开始 | Nacos 本节内容:使用nacos作注册中心配置中心,不用eureka Nacos…...
力扣热题100_普通数组_56_合并区间
文章目录 题目链接解题思路解题代码 题目链接 56. 合并区间 以数组 intervals 表示若干个区间的集合,其中单个区间为 intervals[i] [starti, endi] 。请你合并所有重叠的区间,并返回 一个不重叠的区间数组,该数组需恰好覆盖输入中的所有区…...
Springcloud OpenFeign 的实现(二)
Springcloud OpenFeign 的实现(一) 一、Feign request/response 压缩 您可以考虑为您的外部请求启用请求或响应GZIP压缩。您可以通过启用以下属性之一来完成此操作: feign.compression.request.enabledtrue feign.compression.response.en…...

[C++]智能指针用法
一、智能指针存在的意义 智能指针主要解决以下问题: (1)内存泄漏:内存手动释放,使用智能指针可以自动释放。 (2)共享所有权指针的传播和释放,比如多线程使用同一个对象时析构问题…...
六、行列式基本知识
目录 1、行列式的特性 2、行列式的计算方法: 2.1 通过行列式的定义去计算:对角法则。 2. 2 利用行列式的性质将行列式转化为上三角行列式: ①行列式的性质 : 性质一: 性质二: 性质三: 性质四:行列式之间的加法...

IDEA运行Tomcat出现乱码问题解决汇总
最近正值期末周,有很多同学在写期末Java web作业时,运行tomcat出现乱码问题,经过多次解决与研究,我做了如下整理: 原因: IDEA本身编码与tomcat的编码与Windows编码不同导致,Windows 系统控制台…...

eNSP-Cloud(实现本地电脑与eNSP内设备之间通信)
说明: 想象一下,你正在用eNSP搭建一个虚拟的网络世界,里面有虚拟的路由器、交换机、电脑(PC)等等。这些设备都在你的电脑里面“运行”,它们之间可以互相通信,就像一个封闭的小王国。 但是&#…...

Chapter03-Authentication vulnerabilities
文章目录 1. 身份验证简介1.1 What is authentication1.2 difference between authentication and authorization1.3 身份验证机制失效的原因1.4 身份验证机制失效的影响 2. 基于登录功能的漏洞2.1 密码爆破2.2 用户名枚举2.3 有缺陷的暴力破解防护2.3.1 如果用户登录尝试失败次…...

地震勘探——干扰波识别、井中地震时距曲线特点
目录 干扰波识别反射波地震勘探的干扰波 井中地震时距曲线特点 干扰波识别 有效波:可以用来解决所提出的地质任务的波;干扰波:所有妨碍辨认、追踪有效波的其他波。 地震勘探中,有效波和干扰波是相对的。例如,在反射波…...

以下是对华为 HarmonyOS NETX 5属性动画(ArkTS)文档的结构化整理,通过层级标题、表格和代码块提升可读性:
一、属性动画概述NETX 作用:实现组件通用属性的渐变过渡效果,提升用户体验。支持属性:width、height、backgroundColor、opacity、scale、rotate、translate等。注意事项: 布局类属性(如宽高)变化时&#…...

iPhone密码忘记了办?iPhoneUnlocker,iPhone解锁工具Aiseesoft iPhone Unlocker 高级注册版分享
平时用 iPhone 的时候,难免会碰到解锁的麻烦事。比如密码忘了、人脸识别 / 指纹识别突然不灵,或者买了二手 iPhone 却被原来的 iCloud 账号锁住,这时候就需要靠谱的解锁工具来帮忙了。Aiseesoft iPhone Unlocker 就是专门解决这些问题的软件&…...

SpringBoot+uniapp 的 Champion 俱乐部微信小程序设计与实现,论文初版实现
摘要 本论文旨在设计并实现基于 SpringBoot 和 uniapp 的 Champion 俱乐部微信小程序,以满足俱乐部线上活动推广、会员管理、社交互动等需求。通过 SpringBoot 搭建后端服务,提供稳定高效的数据处理与业务逻辑支持;利用 uniapp 实现跨平台前…...

【单片机期末】单片机系统设计
主要内容:系统状态机,系统时基,系统需求分析,系统构建,系统状态流图 一、题目要求 二、绘制系统状态流图 题目:根据上述描述绘制系统状态流图,注明状态转移条件及方向。 三、利用定时器产生时…...
【HTML-16】深入理解HTML中的块元素与行内元素
HTML元素根据其显示特性可以分为两大类:块元素(Block-level Elements)和行内元素(Inline Elements)。理解这两者的区别对于构建良好的网页布局至关重要。本文将全面解析这两种元素的特性、区别以及实际应用场景。 1. 块元素(Block-level Elements) 1.1 基本特性 …...

【OSG学习笔记】Day 16: 骨骼动画与蒙皮(osgAnimation)
骨骼动画基础 骨骼动画是 3D 计算机图形中常用的技术,它通过以下两个主要组件实现角色动画。 骨骼系统 (Skeleton):由层级结构的骨头组成,类似于人体骨骼蒙皮 (Mesh Skinning):将模型网格顶点绑定到骨骼上,使骨骼移动…...