(python)域名查询服务(whois)程序+检查5位以内域名到期时间邮件报警抢注域名

前言:这个程序写了挺长时间,主要的加‘-d’选项+域名(只支持.com域名)查询特定域名,不带任何参数后台运行(可以设定cron)脚本检查域名到期时间,发现域名还有5天以内到期报警提示,方便抢注呵呵!

缺点:1  有些域名是没有域名信息的,比如a.com,p.com  所有就过滤掉了

2  程序执行时间不会对负载有影响,但是可能出现socket超时,我设置了socket连接三次,但是可能会出现一些未知错误break,大家发现BUG留言我再修改


#!/bin/env python
import sys
import string
import socket
import optparse
import smtplib
import re
import time
import itertools
reload(sys)
sys.setdefaultencoding('utf8') 


class Host(object):



    INTERHOST           ="whois.internic.net"
    NICHOST             = "whois.crsnic.net"
    INICHOST            = "whois.networksolutions.com"
    ip_whois = [ INTERHOST, NICHOST ,INICHOST ]



class Whois(object) :



    WHOIS_SERVER_ID     = "Whois Server:"
    WHOIS_ORG_SERVER_ID = "Registrant Street1:Whois Server:"
    WHOIS_RECURSE       = 0x01
    WHOIS_QUICK         = 0x02



    def whois(self, query, hostname, flags):
        s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        fails =0
        while True:
            try:
                if fails <=3:
                    s.connect((hostname, 43))
            except socket.error:
                fails +=1
            else:
                break
                print 'Socket Connection timed out'
        queryBytes = None
        queryBytes = (query  + "\r\n").encode()
        s.send(queryBytes)
        response = ''
        while True:
            d = s.recv(4096)
            response += d
            if not d:
                break
        s.close()
        nhost = None
        nhost = self.findwhois_server(response.decode(), hostname)
        if (nhost != None):
            response += self.whois(query, nhost, 0)
        return response.decode()
    def findwhois_server(self, buf, hostname):
        nhost = None
        parts_index = 1
        start = buf.find(Whois.WHOIS_SERVER_ID)
        if (start == -1):
            start = buf.find(Whois.WHOIS_ORG_SERVER_ID)
            parts_index = 2



        if (start > -1):
            end = buf[start:].find('\n')
            whois_line = buf[start:end+start]
            whois_parts = whois_line.split(':')
            nhost = whois_parts[parts_index].strip()
        else:
            for nichost in Host.ip_whois:
                if (buf.find(nichost) != -1):
                    nhost = nichost
                    break
        return nhost



    def whois_lookup(self, options, query_arg, flags):
        nichost = None
        if (options == None):
            options = {}



        options['whoishost'] = Host.NICHOST
        if ( not (flags & Whois.WHOIS_QUICK)):
            flags |= Whois.WHOIS_RECURSE
        return self.whois(query_arg, options['whoishost'], flags)   



class WhoisEntry(object):
    _regex = {
        'domain_name':      'Domain Name:\s?(.+)',
        'registrar':        'Registrar:\s?(.+)',
        'whois_server':     'Whois Server:\s?(.+)',
        'referral_url':     'Referral URL:\s?(.+)',
        'updated_date':     'Updated Date:\s?(.+)',
        'creation_date':    'Creation Date:\s?(.+)',
        'expiration_date':  'Expiration Date:\s?(.+)',
        'name_servers':     'Name Server:\s?(.+)',
        'status':           'Status:\s?(.+)',
        'emails':           '[\w.-]+@[\w.-]+\.[\w]{2,4}',
    }
    def __init__(self, domain, text, regex=None):
        self.domain = domain
        self.text = text
        if regex is not None:
            self._regex = regex



    def __getattr__(self, attr):
        whois_regex = self._regex.get(attr)
        if whois_regex:
            setattr(self, attr, re.findall(whois_regex, self.text))
            return getattr(self, attr)



        else:
            raise KeyError('Unknown attribute: %s' % attr)



    def __str__(self):
        return '\n'.join('%s: %s' % (attr, str(getattr(self, attr))) for attr in self.attrs())



    def attrs(self):
        return sorted(self._regex.keys())



    @staticmethod
    def load(domain, text):
        if text.strip() == 'No whois server is known for this kind of object.':
            pass
        return WhoisCom(domain, text)
class WhoisCom(WhoisEntry):
    def __init__(self, domain, text):
        if 'No match for "' in text:
            pass
        else:
            WhoisEntry.__init__(self, domain, text)
class Email(object):
    def __init__(self,body):
        mail_server = 'mail.dongwm.com'
        mail_server_port = 25
        from_addr='whois_check@dongwm.com'
        to_addr ='dongwm@dongwm.com'
        from_header = 'From: %s\r\n' % from_addr#    to_header = 'To: %s\r\n\r\n' % to_addr
        to_header = 'To: %s\r\n\r\n' % to_addr
        subject_header = 'Subject: Yuming check'
        email_message = '%s\n%s\n%s\n\n%s' % (from_header, to_header, subject_header, body)
        s = smtplib.SMTP(mail_server, mail_server_port)
        s.sendmail(from_addr, to_addr, email_message)
        s.quit()



def parse_command_line(argv):
    usage = "usage: %prog [options] name"
    parser = optparse.OptionParser(add_help_option=False, usage=usage)
    parser.add_option("-d", "--domain", action="store_const",
                      const=Host.NICHOST, dest="whoishost",
                      help="Query for a specific domain name, please use: XXX.com format")
    parser.add_option("-h", "--help", action="help")
    return parser.parse_args(argv)



if __name__ == "__main__":
     whoisclient = Whois()
     (options, args) = parse_command_line(sys.argv)
     if len(sys.argv)==3 and re.sub('^.*://', '', args[1]).split('/')[0].lower().split('.')[1]  in 'com':
             text = whoisclient.whois_lookup(options.__dict__,args[1], 0)
             print  WhoisEntry.load(args[1], text)



     elif len(sys.argv)==1:
         #for i in range(97,123):
         #   print chr(i)
         len = 1
         while (len<6):
             for i in list(itertools.permutations(string.lowercase,len)):
                 if whoisclient.whois_lookup(options.__dict__,''.join(i)+'.com', 0).encode('utf8').find('Expiration Date: ') != -1:
                     sa = whoisclient.whois_lookup(options.__dict__,''.join(i)+'.com', 0).encode('utf8').split('Expiration Date: ')[1].split(r'>>> Last')[0][:-2]
                     wtime = time.strftime('%d-%b-%Y',time.localtime(time.time()))
                     if wtime.lower()[3:6] == sa[3:6] and wtime[7:11] == sa[7:11] and int(sa[0:2]) - int(wtime[0:2]) <=5 and int(sa[0:2]) - int(wtime[0:2]) >=0:
                         tt = '%s is %s' % (''.join(i)+'.com',sa)
                         Email(tt)
                         time.sleep(1)
             len +=1
     else:
             print "Please use the '-h' or '--help' parameter"


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值