Python第三方模块dnspython介绍

Python第三方模块dnspython介绍

安装

pip install dnspython

模块域名解析方法介绍

dnspython提供了一个DNS解析器类–resolver,使用它的query方法来实现域名的查询功能。query方法定义如下:

query(self, qname, rdtype=1, rdclass=1, tcp=False, source=None, raise_on_no_answer=True, source_port=0)

其中,qname参数为查询的域名。rdtype参数用来指定RR资源的类型,常用的有以下几种:

  • A记录,将主机名转换成IP地址;
  • MX记录,邮件交换记录,定义邮件服务器的域名;
  • CNAME记录,指别名记录,实现域名间的映射;
  • NS记录,标记区域的域名服务器及授权子域;
  • PTR记录,反向解析,与A记录相反,将IP转换成主机名;
  • SOA记录,SOA标记,一个起始授权区的定义。

rdclass参数用于指定网络类型,可选的值有IN、CH与HS,其中IN为默认,使用最广泛。
tcp参数用于指定查询是否启用TCP协议,默认为False(不启用)。
source与source_port参数作为指定查询源地址与端口,默认值为查询设备IP地址和0。
raise_on_no_answer参数用于指定当查询无应答时是否触发异常,默认为True。

举例

A记录

#!/usr/bin/env python
import dns.resolver

domain = input("please input an domain:")
A = dns.resolver.query(domain,'A')
for i in A.response.answer:
    for j in i.items:
        print(j.address)

测试结果:

(venv) ➜ dnspython python simple1.py
please input an domain:go2live.cn
59.110.85.65

MX记录

#!/usr/bin/env python
import dns.resolver

domain = input("please input an domain:")
MX = dns.resolver.query(domain, 'MX')
for i in MX:
    print('MX preference=%s, mail exchanger=%s' % (i.preference, i.exchange))

测试结果:

(venv) ➜ dnspython python simple2.py
please input an domain:163.com
MX preference=10, mail exchanger=163mx02.mxmail.netease.com.
MX preference=10, mail exchanger=163mx03.mxmail.netease.com.
MX preference=10, mail exchanger=163mx01.mxmail.netease.com.
MX preference=50, mail exchanger=163mx00.mxmail.netease.com.

NS记录

#!/usr/bin/env python
import dns.resolver

domain = input("please input an domain:")
ns = dns.resolver.query(domain, 'NS')
for i in ns.response.answer:
    for j in i.items:
        print(j.to_text())

测试结果:

(venv) ➜ dnspython python simple3.py
please input an domain:baidu.com
ns4.baidu.com.
ns3.baidu.com.
ns7.baidu.com.
dns.baidu.com.
ns2.baidu.com.

需要注意,域名需要是一级域名。

CNAME记录

#!/usr/bin/env python
import dns.resolver

domain = input("please input an domain:")
cname = dns.resolver.query(domain, 'CNAME')
for i in cname.response.answer:
    for j in i.items:
        print(j.to_text())

测试结果:

(venv) ➜ dnspython python simple4.py
please input an domain:img.go2live.cn
iduxqy8.qiniudns.com.

我的网站把图片资源放到了七牛的dns上。。后面改到了阿里云。

监控代码

步骤:
1. 通过dns解析获得ip地址列表
2. 通过http请求获取网站服务是否正常。

#!/usr/bin/env python
import dns.resolver
import os
import requests


iplist = []
appdomain = "www.a.shifen.com"


def get_iplist(domain=""):
    try:
        A = dns.resolver.query(domain, 'A')
    except Exception as e:
        print("dns resolver error:", str(e))
        return

    for i in A.response.answer:
        for j in i.items:
            iplist.append(j.address)
    return True


def checkip(ip):
    checkurl = ip+":80"
    try:
        r = requests.get('http://'+checkurl)
        if r.status_code == 200  and '<!doctype html>' in r.text.lower():
            print(ip + " [ok]")
        else:
            print(ip + " [Error] ")
    except Exception as e:
        print(e)


if __name__ == '__main__':
    if get_iplist(appdomain) and len(iplist) > 0:
        for ip in iplist:
            checkip(ip)
    else:
        print("dns resolver error.")

输出结果:

(venv) ➜ dnspython python simple5.py
58.217.200.112 [ok]
58.217.200.113 [ok]

域名不能用baidu.com, 因为baidu.com是www.a.shifen.com的别名。
也说明这个程序并不健壮。

Tags: