【工具类】阿里域名关联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 利用行列式的性质将行列式转化为上三角行列式: ①行列式的性质 : 性质一: 性质二: 性质三: 性质四:行列式之间的加法...

Nuxt.js 中的路由配置详解
Nuxt.js 通过其内置的路由系统简化了应用的路由配置,使得开发者可以轻松地管理页面导航和 URL 结构。路由配置主要涉及页面组件的组织、动态路由的设置以及路由元信息的配置。 自动路由生成 Nuxt.js 会根据 pages 目录下的文件结构自动生成路由配置。每个文件都会对…...
【Go】3、Go语言进阶与依赖管理
前言 本系列文章参考自稀土掘金上的 【字节内部课】公开课,做自我学习总结整理。 Go语言并发编程 Go语言原生支持并发编程,它的核心机制是 Goroutine 协程、Channel 通道,并基于CSP(Communicating Sequential Processes࿰…...

【JavaWeb】Docker项目部署
引言 之前学习了Linux操作系统的常见命令,在Linux上安装软件,以及如何在Linux上部署一个单体项目,大多数同学都会有相同的感受,那就是麻烦。 核心体现在三点: 命令太多了,记不住 软件安装包名字复杂&…...
【HarmonyOS 5 开发速记】如何获取用户信息(头像/昵称/手机号)
1.获取 authorizationCode: 2.利用 authorizationCode 获取 accessToken:文档中心 3.获取手机:文档中心 4.获取昵称头像:文档中心 首先创建 request 若要获取手机号,scope必填 phone,permissions 必填 …...
在QWebEngineView上实现鼠标、触摸等事件捕获的解决方案
这个问题我看其他博主也写了,要么要会员、要么写的乱七八糟。这里我整理一下,把问题说清楚并且给出代码,拿去用就行,照着葫芦画瓢。 问题 在继承QWebEngineView后,重写mousePressEvent或event函数无法捕获鼠标按下事…...
腾讯云V3签名
想要接入腾讯云的Api,必然先按其文档计算出所要求的签名。 之前也调用过腾讯云的接口,但总是卡在签名这一步,最后放弃选择SDK,这次终于自己代码实现。 可能腾讯云翻新了接口文档,现在阅读起来,清晰了很多&…...
Vue 模板语句的数据来源
🧩 Vue 模板语句的数据来源:全方位解析 Vue 模板(<template> 部分)中的表达式、指令绑定(如 v-bind, v-on)和插值({{ }})都在一个特定的作用域内求值。这个作用域由当前 组件…...

协议转换利器,profinet转ethercat网关的两大派系,各有千秋
随着工业以太网的发展,其高效、便捷、协议开放、易于冗余等诸多优点,被越来越多的工业现场所采用。西门子SIMATIC S7-1200/1500系列PLC集成有Profinet接口,具有实时性、开放性,使用TCP/IP和IT标准,符合基于工业以太网的…...
华为OD最新机试真题-数组组成的最小数字-OD统一考试(B卷)
题目描述 给定一个整型数组,请从该数组中选择3个元素 组成最小数字并输出 (如果数组长度小于3,则选择数组中所有元素来组成最小数字)。 输入描述 行用半角逗号分割的字符串记录的整型数组,0<数组长度<= 100,0<整数的取值范围<= 10000。 输出描述 由3个元素组成…...
在鸿蒙HarmonyOS 5中使用DevEco Studio实现指南针功能
指南针功能是许多位置服务应用的基础功能之一。下面我将详细介绍如何在HarmonyOS 5中使用DevEco Studio实现指南针功能。 1. 开发环境准备 确保已安装DevEco Studio 3.1或更高版本确保项目使用的是HarmonyOS 5.0 SDK在项目的module.json5中配置必要的权限 2. 权限配置 在mo…...