Python多线程检查域名是否存在

本文介绍如何使用Python通过多线程技术检查一批由字典生成的短域名(如www.key.com和www.key.net)是否已被注册和使用。通过获取域名的劫持IP并判断gethostname()的返回结果来确定域名的状态。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

个人想查看下哪些短的域名还没有被用来提供网络服务, 自己可从中选择一些有趣的使用. 

首先使用字典生成算法, 生成一个关键字列表文件. 如下

#!/usr/bin/env python
#coding=utf-8

"""
filename: make_key.py
author: zz_d
date: 2013-05-25
"""

import sys
import getopt

len_ch_range = 0

def mk_key(plen, cnt, pstr):
    if cnt < plen:
        for i in range(len_ch_range):
            mk_key(plen, cnt+1, pstr+ch_range[i])
    else:
        for i in range(len_ch_range):
            print pstr+ch_range[i]

def help():
    print '%s -n len [-h]' % sys.argv[0]

if __name__ == "__main__":
    
    plen = 0
    try:
        opts, args = getopt.getopt(sys.argv[1:], "n:h")
    except getopt.GetoptError as err:
        print str(err)
        help()
        sys.exit(2)
    for o, a in opts:
        if o == '-n':
            if int(a) > 0:
                plen = int(a)
        elif o == '-h':
            help()
            sys.exit(0)
    if plen <= 0:
        help()
        sys.exit(0)
    
    ch_range = 'abcdefghijklmnopqrstuvwxyz0123456789'
    len_ch_range = len(ch_range)
    mk_key(plen, 1, '')
            

取得关键字 key, 分别检查 www.key.com 和 www.key.net 是否存在, 用 domain_key 表示.

检查域名的步骤是:

1. 获取域名不存在时电信或网通的劫持IP;

2.如果 gethostname(domain_key) 出错或者返回劫持的 IP, 则此 domain_key 未提供服务;

代码如下:

#!/usr/bin/env python
#coding=utf-8

"""
filename: check_domain.py
author: zz_d
date: 2013-05-25
"""

import sys
import time
import threading
import getopt
import socket

bsema = None


# 通过一个不存在的域名, 来获取域名不存在时被 isp 劫持到的 ip
no_exist_domain = 'www.djflskfjiosfhossdfdsfsfsdfdi.com'
fake_ip = None  

def check_domain(key):
    '''
    check if a domain is exist 
    '''
    try:
        domain = 'www.%s.com' % key
        ip = socket.gethostbyname(domain)
        if ip == fake_ip:
            print domain
    except socket.gaierror:
        print domain
    except socket.timeout:
        print domain
    except socket.error:
        print domain
        
    try:
        domain = 'www.%s.net' % key
        ip = socket.gethostbyname(domain)
        if ip == fake_ip:
            print domain
    except socket.gaierror:
        print domain
    except socket.timeout:
        print domain
    except socket.error:
        print domain
        
    bsema.release()

def help():
    print '%s -f keyfile [-t threads_num] [-h]' % sys.argv[0]

if __name__ == "__main__":
    file_keys = None
    thread_num = 5
    try:
        opts, args = getopt.getopt(sys.argv[1:], "f:t:h")
    except getopt.GetoptError as err:
        print str(err)
        help()
        sys.exit(2)
    for o, a in opts:
        if o == '-f':
            file_keys = a
        elif o == '-t' and int(a) > 0:
            thread_num = int(a)
        elif o == '-h':
            help()
            sys.exit(0)
            
    if not file_keys:
        help()
        sys.exit(-2)
    
    try:
        fake_ip = socket.gethostbyname(no_exist_domain)
    except socket.error:
        fake_ip = None
        
    cnt = 0
    socket.setdefaulttimeout(10)
    bsema = threading.BoundedSemaphore(thread_num)
    fs = file(file_keys, 'r')
    key = fs.readline()
    while key:
        key = key.strip()
        if key:
            bsema.acquire()
            th = threading.Thread(target=check_domain, args=(key,))
            th.start()
            #check_domain(key)
            cnt += 1
        key = fs.readline()
        if cnt >= 10:
            cnt = 0
            fake_ip = socket.gethostbyname(no_exist_domain)
    
手动检查了几个输出的结果, 并无异常. 还是有好一些有趣的域名没有被注册的.

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值