# HG changeset patch # User Richard Penman # Date 1464901134 25200 # Node ID 4382433c1fe0a5aac4363373cd0ec3b0612155cb # Parent 0b2e70f3f53746e477c88978c54221ab6cabd85c# Parent f1bcf8940a976051041896a849507843d9cbca37 Merged in leotop/pywhois/leotop/whoispy-fix-python3-error-if-bwith-xxx-i-1463323526280 (pull request #9) whois.py fix python3 error: if b'with "=xxx"' in response: diff -r f1bcf8940a97 -r 4382433c1fe0 whois/__init__.py --- a/whois/__init__.py Sun May 15 14:45:28 2016 +0000 +++ b/whois/__init__.py Thu Jun 02 13:58:54 2016 -0700 @@ -19,6 +19,12 @@ ip_match = re.match(r"^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$", url) if ip_match: domain = url + try: + result = socket.gethostbyaddr(url) + except socket.herror as e: + pass + else: + domain = result[0] else: domain = extract_domain(url) if command: diff -r f1bcf8940a97 -r 4382433c1fe0 whois/parser.py --- a/whois/parser.py Sun May 15 14:45:28 2016 +0000 +++ b/whois/parser.py Thu Jun 02 13:58:54 2016 -0700 @@ -135,6 +135,8 @@ if value and value not in values: # avoid duplicates values.append(value) + if values and attr in ('registrar', 'whois_server', 'referral_url'): + values = values[-1] # ignore junk if len(values) == 1: values = values[0] elif not values: @@ -204,6 +206,8 @@ return WhoisBg(domain, text) elif domain.endswith('.de'): return WhoisDe(domain, text) + elif domain.endswith('.at'): + return WhoisAt(domain, text) elif domain.endswith('.ca'): return WhoisCa(domain, text) elif domain.endswith('.be'): @@ -561,7 +565,7 @@ 'domain_name': 'domain: *(.+)', 'registrar': 'registrar: *(.+)', 'creation_date': 'created: *(.+)', - 'expiration_date': 'anniversary: *(.+)', + 'expiration_date': 'Expir\w+ Date:\s?(.+)', 'name_servers': 'nserver: *(.+)', # list of name servers 'status': 'status: *(.+)', # list of statuses 'emails': EMAIL_REGEX, # list of email addresses @@ -588,7 +592,7 @@ 'updated_date': 'modified: *([\S]+)', 'expiration_date': 'expires: *([\S]+)', 'name_servers': 'nserver: *([\S]+) \[\S+\]', # list of name servers - 'name_server_statuses': 'nserver: *([\S]+) \[(\S+)\]', # list of name servers and statuses + 'name_server_statuses': 'nserver: *([\S]+) \[\S+\]', # list of name servers and statuses 'dnssec': 'dnssec: *([\S]+)', } @@ -771,6 +775,26 @@ else: WhoisEntry.__init__(self, domain, text, self.regex) +class WhoisAt(WhoisEntry): + """Whois parser for .at domains + """ + regex = { + 'name': 'personname: *(.+)', + 'org': 'organization: *(.+)', + 'address': 'street address: *(.+)', + 'zipcode': 'postal code: *(.+)', + 'city': 'city: *(.+)', + 'country': 'country: *(.+)', + 'phone': 'phone: *(.+)', + 'fax': 'fax-no: *(.+)', + 'changed': 'changed: *(.+)', + } + + def __init__(self, domain, text): + if 'Status: free' in text: + raise PywhoisError(text) + else: + WhoisEntry.__init__(self, domain, text, self.regex) class WhoisBe(WhoisEntry): """Whois parser for .be domains