python获取阿里云云解析dns的域名解析记录

最近由于工作原因接触到阿里云的服务,我需要实时获取所有的域名信息,用于对其进行扫描,因此写了一个自动化爬取脚本 给需要的人分享。
(阿里云有官方的demo,有兴趣的可以自己看一下,后面也会放链接,我只能说阿里味有点冲)

1.基础准备

代码环境:python3
第三方库:阿里云sdk (pip install alibabacloud_alidns20150109==3.0.10)(无力吐槽的库名)
官方在线调试接口|文档:https://next.api.aliyun.com/api/Alidns/2015-01-09/DescribeDomainRecords

2.获取client

首先你需要获取一个有效的key,指路
控制台 -> RAM 访问控制 ->创建密钥(右上角点击头像->accesskey管理也可以快捷进入),得到key后就可以正式开始编程了

import openpyxl,requests
from alibabacloud_alidns20150109.client import Client as Alidns20150109Client
from alibabacloud_tea_openapi import models as open_api_models
from alibabacloud_alidns20150109 import models as alidns_20150109_models
from alibabacloud_tea_util import models as util_models#创建客户端 返回可用client
def create_client(access_key_id: str,access_key_secret: str,) -> Alidns20150109Client:config = open_api_models.Config(# 必填,您的 AccessKey ID,access_key_id=access_key_id,# 必填,您的 AccessKey Secret,access_key_secret=access_key_secret)config.endpoint = f'alidns.cn-hangzhou.aliyuncs.com'return Alidns20150109Client(config)    

创建客户端,这里写的是最简单的方式,如果为了安全可以使用临时key+token的方式或写入配置文件的方式,详见官方文档。

  • 函数前的import内容只包含本文后续的所有内容,在此只写一次。

3.获取域名列表

阿里云可以通过接口直接获取域名的列表。

#获取域名列表
#由于查询dns记录的数目可能会超过单次查询的上限 所以最好返回记录数量方便循环
def get_domain_list(client):describe_domains_request = alidns_20150109_models.DescribeDomainsRequest()runtime = util_models.RuntimeOptions()resp = client.describe_domains_with_options(describe_domains_request, runtime)domain_list = []for domain in resp.body.domains.domain:domain_list.append([domain.domain_name,domain.record_count])return domain_list
  • 阿里的接口返回的数据都是完全封装好的,所以我们不能直接通过常规的解析json的方式获取数据。
  • 这里我们额外返回了一个域名的解析记录数目是因为阿里云的sdk没有next指针之类的机制,需要手动计算数量来实现循环获取全部的解析记录
  • 返回的参数单条为[域名,解析记录长度]
  • 前三句都是阿里的官方调用模式,不清楚有啥改动方案,照写就行

4.获取指定域名的全部解析记录

#获取指定域名下的dns解析记录
def get_domain_records(client,domain_list):lenth = 0page_size = 500  #500是单条最大查询次数,可以自行调整 不影响输出结果record_list = []while lenth * page_size < domain_list[1] : describe_domain_records_request = alidns_20150109_models.DescribeDomainRecordsRequest(domain_name=domain_list[0],page_number=lenth+1,page_size=page_size )runtime = util_models.RuntimeOptions()resp = client.describe_domain_records_with_options(describe_domain_records_request, runtime)for record in resp.body.domain_records.record:record_list.append([record.rr+'.'+domain_list[0],record.type])lenth += 1#print(len(record_list))return record_list 
  • 单次查询的最大记录是500条,可以通过调整page_size这个参数来自行设置
  • 返回的rr为解析值,type为解析类型

5.获取账号下的全部域名解析记录

#获取所有域名下的全部dns解析记录
def get_all_domain_records(client):domain_list = get_domain_list(client)record_list = [] for domain_name in domain_list:record_list.extend(get_domain_records(client,domain_name))return record_list 

6.获取指定的DNS解析记录

record_type = ['A','AAAA',"CNAME"]
#根据想要的dns记录筛选最终数据
def get_dns_records_by_type(dns_records, record_type):final_dns_records =[]for record in dns_records:if record[1] in record_type:final_dns_records.append(record)return final_dns_records

7.测试网站能否正常访问

由于部分cname本身并不是有效域名 只是一个单纯转发,且dns解析上无法判断解析记录是否公网开放,所以需要进行测试。这里提供一个简单的方案 就是直接发起request请求,如果有响应则证明解析有效。

#测试网站是否能访问
def test_web_alive(dns_records):web_list = []dns_list = set()for dns in dns_records:dns_list.add(dns[0])print(len(dns_list))for dns in dns_list:try:response = requests.get("https://"+dns)web_list.append([dns,response.status_code,'aliyun'])except:web_list.append([dns,'cant reach','aliyun'])return web_list #将测试结果存到excel中
def save_dns_to_xlsx(web_list, path):workbook = openpyxl.load_workbook(path)sheet =workbook["Sheet1"]  # 默认存到第一页for index,dns in enumerate(web_list):sheet.cell(row=index+2,column=1).value = dns[0]sheet.cell(row=index+2,column=2).value = dns[1]sheet.cell(row=index+2,column=3).value = dns[2]workbook.save(path)

如果有问题,欢迎留言咨询~ 完整的代码也会上传 有兴趣可以自行下载~

在这里插入图片描述

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

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

相关文章

高级/进阶”算法和数据结构书籍推荐

“高级/进阶”算法和数据结构书籍推荐《高级算法和数据结构》 高级算法和数据结构 为什么要选择本书 谈及为什么需要花时间学算法&#xff0c;我至少可以列举出三个很好的理由。 (1)性能&#xff1a;选择正确的算法可以显著提升应用程序的速度。仅就搜索来说&#xff0c;用二…

人工智能发展史

人工智能&#xff08;AI&#xff09;的发展史是一段跨越数十年的旅程&#xff0c;涵盖了从早期理论探索到现代技术革新的广泛内容。人工智能的发展历程展示了从最初的概念探索到现代技术突破的演变。尽管经历了多次起伏&#xff0c;但AI领域持续进步&#xff0c;不断拓展其应用…

2243:Knight Moves

文章目录 题目描述思路1. DFS2. BFS3. 动态规划 解题方法1. DFS2. BFS3. 动态规划 题目描述 题目链接 翻译如下&#xff1a; 注&#xff1a;骑士移动是和象棋里的马一样走的是日字型 你的一个朋友正在研究旅行骑士问题 &#xff08;TKP&#xff09;&#xff0c;你要找到最短的…

Android 断点调试

Android 调试 https://developer.android.google.cn/studio/debug?hlzh-cn 调试自己写的代码&#xff08;不在Android源码&#xff09; 点击 Attach debugger to Android process 图标 需要在添加断点界面手动输入函数名 但也可以不手动&#xff0c;有个技巧可以new 空proje…

个人博客搭建保姆级教程-HTML页面编写篇

选择模板 首先我们要选一个好的模板&#xff0c;然后对模板进行剪裁。我的模板是在站长之家进行下载的 素材下载-分享综合设计素材免费下载的平台-站长素材 我选的模板的具体地址是 个人博客资讯网页模板 这里需要我们学习一下在前边一篇文章里提到的HTML、JavaScript、CSS…

C++ :运算符重载

运算符重载&#xff1a; 运算符重载概念&#xff1a;对已有的运算符重新进行定义&#xff0c;赋予其另一种功能&#xff0c;以适应不同的数据类型 运算符的重载实际是一种特殊的函数重载&#xff0c;必须定义一个函数&#xff0c;并告诉C编译器&#xff0c;当遇到该重载的运算符…

华为拆分零部件业务,长安入股,赛力斯接洽中

作者 |德新 编辑 |王博 11月26日&#xff0c;长安汽车官宣与华为在智能汽车零部件业务上的投资与合作&#xff1a; 华为拟成立一家新的公司&#xff0c;并将其在智能汽车解决方案业务上的核心技术和资源注入新公司&#xff0c;长安汽车及关联方有意投资该新公司。 参照目前长…

浮点数二分例题:数的三次方根-Java版

//浮点数二分,正常写就行,不用考虑死循环问题import java.util.Scanner;public class Main{public static void main(String[] args) {Scanner sc new Scanner(System.in);Double n sc.nextDouble();double l -100,r 100;//数据范围是100000,开了三次方后不会超过100//小知…

【Altium designer 20】

Altium designer 20 1. Altium designer 201.1 原理图库1.1.1 上划岗 在字母前面加\在加字母1.1.2 自定义快捷键1.1.3 对齐1.1.4 在原有的电路图中使用封装1.1.5 利用excel创建IC类元件库1.1.6 现有原理图库分类以及调用1.1.7 现有原理图库中自动生成原理图库 1.2 绘制原理图1.…

质量小议35 -- SQL注入

已经记不得上次用到SQL注入是什么时候了&#xff0c;一些概念和操作已经模糊。 最近与人聊起SQL注入&#xff0c;重新翻阅&#xff0c;暂记于此。 重点&#xff1a;敏感信息、权限过大、未脱敏的输入/输出、协议、框架、数据包、明文、安全意识 SQL - Structured Query La…

打破卫浴行业冰山!九牧重构高端服务品牌“点线面”新秩序

文 | 螳螂观察 作者 | 余一 说到服务&#xff0c;你首先会想到哪个品牌&#xff1f;海底捞大概率会是其中之一。 一个餐饮品牌&#xff0c;不靠价格、口味出圈&#xff0c;而是凭借服务走向全球市场&#xff0c;古往今来或许也是头一家了&#xff0c;而无微不至的的服务&…

设计模式-结构型模式之桥接设计模式

文章目录 三、桥接模式 三、桥接模式 桥接模式&#xff08;Bridge&#xff09;是用于把抽象化与实现化解耦&#xff0c;使得二者可以独立变化。它通过提供抽象化和实现化之间的桥接结构&#xff0c;来实现二者的解耦。 这种模式涉及到一个作为桥接的接口&#xff0c;使得实体类…

MySQL安装

目录 MySQL简介 MySQL安装 连接MySQL数据库 MySQL简介 MySQL是最流行的关系型数据库管理系统之一&#xff0c;属于Oracle旗下产品。由于其体积小、速度快、总体拥有成本低&#xff0c;尤其是开放源码这一特点&#xff0c;一般中小型和大型网站的开发都选择 MySQL作为网站数据…

JVM:双亲委派(未完结)

类加载 定义 一个java文件从编写代码到最终运行&#xff0c;必须要经历编译和类加载的过程&#xff0c;如下图&#xff08;图源自b站视频up主“跟着Mic学架构”&#xff09;。 编译就是把.java文件变成.class文件。类加载就是把.class文件加载到JVM内存中&#xff0c;得到一…

使用Docker安装部署Swagger Editor并远程访问编辑API文档

文章目录 Swagger Editor本地接口文档公网远程访问1. 部署Swagger Editor2. Linux安装Cpolar3. 配置Swagger Editor公网地址4. 远程访问Swagger Editor5. 固定Swagger Editor公网地址 Swagger Editor本地接口文档公网远程访问 Swagger Editor是一个用于编写OpenAPI规范的开源编…

UE5 - 虚幻引擎各模块流程图

来自虚幻官方的一些资料&#xff0c;分享一下&#xff1b; 一些模块的流程图&#xff0c;比如动画模块&#xff1a; 或角色相关流程&#xff1a; 由于图片比较大&#xff0c;上传到了网络&#xff0c;可自取&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1BQ2KiuP08c…

GitHub项目推荐-Deoldify

有小伙伴推荐了一个老照片上色的GitHub项目&#xff0c;看了简介&#xff0c;还不错&#xff0c;推荐给大家。 项目地址 GitHub - SpenserCai/sd-webui-deoldify: DeOldify for Stable Diffusion WebUI&#xff1a;This is an extension for StableDiffusions AUTOMATIC1111 w…

Allegro无法模块复用的解决办法

Allegro无法模块复用的解决办法 在用Allegro做PCB设计的时候,模块复用是使用的比较频繁的功能,对于有相同模块的单板,可以节省大量的时间。 模块复用的功能不细说,具体参考以前的文章。 有时会遇到模块复用的时候出现如下报错 无法匹配,有时如果因为Device而无法复用,就…

SWD和JTAG

1、调试接口概念 1&#xff09;SWD&#xff1a;Serial Wire Debug&#xff0c;代表串行线调试&#xff0c;是ARM设计的协议&#xff0c;用于对其微控制器进行编程和调试。 SWD 引脚&#xff1a; SWDIO–串行数据线&#xff0c;用于数据的读出和写入SWDCLK–串行时钟线&#…

实现用户登陆

输入用户名和密码&#xff0c;如果输入用户名和密码正确&#xff0c;允许登录 编程过程中采用字符串拉接。 SQL注入&#xff0c;当使用拼接的sql语句. 输入密码时把语句拼接成or&#xff0c;or后面跟上一个条件正确的式子。 Java 防止sql注入&#xff0c;预编译手段&#xff…