Giter VIP home page Giter VIP logo

asyncwhois's Introduction

asyncwhois

PyPI version build-workflow codecov Code style: black

asyncwhois | Python utility for WHOIS and RDAP queries.

Quickstart

import asyncio
from pprint import pprint

import asyncwhois

# pick a domain
domain = 'bitcoin.org'
# domain could also be a URL; asyncwhois uses tldextract to parse the URL
domain = 'https://www.google.com?q=asyncwhois'

# basic example
query_string, parsed_dict = asyncwhois.whois(domain)
# query_string  # The semi-free text output from the whois server
# parsed_dict   # A dictionary of key:values extracted from `query_string`

# asyncio example
loop = asyncio.get_event_loop()
query_string, parsed_dict = loop.run_until_complete(asyncwhois.aio_whois(domain))

pprint(parsed_dict)
"""
{created: datetime.datetime(2008, 8, 18, 13, 19, 55),
 dnssec: 'unsigned',
 domain_name: 'bitcoin.org',
 expires: datetime.datetime(2029, 8, 18, 13, 19, 55),
 name_servers: ['dns1.registrar-servers.com', 'dns2.registrar-servers.com'],
 registrant_address: 'P.O. Box 0823-03411',
 registrant_city: 'Panama',
 registrant_country: 'PA',
 registrant_name: 'WhoisGuard Protected',
 registrant_organization: 'WhoisGuard, Inc.',
 registrant_state: 'Panama',
 registrant_zipcode: '',
 registrar: 'NAMECHEAP INC',
 status: ['clientTransferProhibited '
          'https://icann.org/epp#clientTransferProhibited'],
 updated: datetime.datetime(2019, 11, 24, 13, 58, 35, 940000)}
 ...
 """

# support for IPv4, IPv6, and ASNs too
ipv4 = "8.8.8.8"
query_string, parsed_dict = asyncwhois.whois(ipv4)
pprint(parsed_dict)
"""
{abuse_address: None,
 abuse_email: '[email protected]',
 abuse_handle: 'ABUSE5250-ARIN',
 abuse_name: 'Abuse',
 abuse_phone: '+1-650-253-0000',
 abuse_rdap_ref: 'https://rdap.arin.net/registry/entity/ABUSE5250-ARIN',
 cidr: '8.8.8.0/24',
 net_handle: 'NET-8-8-8-0-2',
 net_name: 'GOGL',
 net_range: '8.8.8.0 - 8.8.8.255',
 net_type: 'Direct Allocation',
 org_address: '1600 Amphitheatre Parkway',
 org_city: 'Mountain View',
 org_country: 'US',
 org_id: 'GOGL',
 ...
"""

RDAP

The whodap project is used behind the scenes to perform RDAP queries.

domain = "https://google.com"
query_string, parsed_dict = asyncwhois.rdap(domain)
# OR with asyncio
query_string, parsed_dict = loop.run_until_complete(asyncwhois.aio_rdap(domain))

# Reusable client (caches the RDAP bootstrap server list, so it is faster for doing multiple calls)
client = asyncwhois.DomainClient()
for domain in ["google.com", "tesla.coffee", "bitcoin.org"]:
    query_string, parsed_dict = client.rdap(domain)
    # query_string, parsed_dict = await client.aio_rdap(domain)

# Using a proxy or need to configure something HTTP related? Try reconfiguring the client:
whodap_client = whodap.DNSClient.new_client(
    httpx_client=httpx.Client(proxies="https://proxy:8080")
)
# whodap_client = await whodap.DNSClient.new_aio_client(httpx_client=httpx.AsyncClient(proxies="https://proxy:8080"))
client = asyncwhois.DomainClient(whodap_client=whodap_client)

Using Proxies

SOCKS4 and SOCKS5 proxies are supported for WHOIS and RDAP queries.

import whodap

tor_host = "localhost"
tor_port = 9050

# WHOIS
query_string, parsed_dict = asyncwhois.whois(
    "8.8.8.8", proxy_url=f"socks5://{tor_host}:{tor_port}"
)

# RDAP
import httpx
from httpx_socks import SyncProxyTransport, AsyncProxyTransport  # EXTERNAL DEPENDENCY for SOCKS Proxies 

transport = SyncProxyTransport.from_url(f"socks5://{tor_host}:{tor_port}")
httpx_client = httpx.Client(transport=transport)
whodap_client = whodap.IPv6Client.new_client(httpx_client=httpx_client)
query_string, parsed_dict = asyncwhois.rdap('2001:4860:4860::8888', whodap_client=whodap_client)

transport = AsyncProxyTransport.from_url(f"socks5://{tor_user}:{tor_pw}@{tor_host}:{tor_port}")
async with httpx.AsyncClient(transport=transport) as httpx_client:
    whodap_client = await whodap.DNSClient.new_aio_client(httpx_client=httpx_client)
    query_string, parsed_dict = await asyncwhois.aio_rdap('bitcoin.org', whodap_client=whodap_client)

Exported Functions

Function/Object Description
DomainClient Reusable client for WHOIS or RDAP domain queries
NumberClient Reusable client for WHOIS or RDAP ipv4/ipv6 queries
ASNClient Reusable client for RDAP asn queries
whois WHOIS entrypoint for domain, ipv4, or ipv6 queries
rdap RDAP entrypoint for domain, ipv4, ipv6, or asn queries
aio_whois async counterpart to whois
aio_rdap async counterpart to rdap
whois_ipv4 [DEPRECATED] WHOIS lookup for ipv4 addresses
whois_ipv6 [DEPRECATED] WHOIS lookup for ipv6 addresses
rdap_domain [DEPRECATED] RDAP lookup for domain names
rdap_ipv4 [DEPRECATED] RDAP lookup for ipv4 addresses
rdap_ipv6 [DEPRECATED] RDAP lookup for ipv6 addresses
rdap_asn [DEPRECATED] RDAP lookup for Autonomous System Numbers
aio_whois_domain [DEPRECATED] async counterpart to whois_domain
aio_whois_ipv4 [DEPRECATED] async counterpart to whois_ipv4
aio_whois_ipv6 [DEPRECATED] async counterpart to whois_ipv6
aio_rdap_domain [DEPRECATED] async counterpart to rdap_domain
aio_rdap_ipv4 [DEPRECATED] async counterpart to rdap_ipv4
aio_rdap_ipv6 [DEPRECATED] async counterpart to rdap_ipv6
aio_rdap_asn [DEPRECATED] async counterpart to rdap_asn

Contributions

Parsed output not what you expected? Unfortunately, "the format of responses [from a WHOIS server] follow a semi-free text format". Therefore, situations will arise where this module does not support parsing the output from a specific server, and you may find yourself needing more control over how parsing happens. Fortunately, you can create customized parsers to suit your needs.

Example: This is a snippet of the output from running the "whois google.be" command.

Domain:	google.be
Status:	NOT AVAILABLE
Registered:	Tue Dec 12 2000

Registrant:
    Not shown, please visit www.dnsbelgium.be for webbased whois.

Registrar Technical Contacts:
    Organisation:	MarkMonitor Inc.
    Language:	en
    Phone:	+1.2083895740
    Fax:	+1.2083895771

Registrar:
    Name:	 MarkMonitor Inc.
    Website: http://www.markmonitor.com

Nameservers:
    ns2.google.com
    ns1.google.com
    ns4.google.com
    ns3.google.com

Keys:

Flags:
    clientTransferProhibited
...

In this case, the "name servers" are listed on separate lines. The default BaseParser regexes won't find all of these server names. In order to accommodate this extra step, the "parse" method was overwritten within the parser subclass as seen below:

class RegexBE(BaseParser):
    _be_expressions = {  # the base class (BaseParser) will handle these regexes
        BaseKeys.CREATED: r'Registered: *(.+)',
        BaseKeys.REGISTRAR: r'Registrar:\n.+Name: *(.+)',
        BaseKeys.REGISTRANT_NAME: r'Registrant:\n *(.+)'
    }
    
    def __init__(self):
        super().__init__()
        self.update_reg_expressions(self._be_expressions)
    
    def parse(self, blob: str) -> Dict[str, Any]:
        # run base class parsing for other keys
        parsed_output = super().parse(blob)
        # custom parsing is needed to extract all the name servers
        ns_match = re.search(r"Name servers: *(.+)Keys: ", blob, re.DOTALL)
        if ns_match:
            parsed_output[BaseKeys.NAME_SERVERS] = [m.strip() for m in ns_match.group(1).split('\n') if m.strip()]
        return parsed_output

asyncwhois's People

Contributors

anvil avatar blindingradiance avatar fabaff avatar juuljuup avatar kasimov-maxim avatar pogzyb avatar rahulxs avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar

asyncwhois's Issues

Tag the releases

Latest release on PyPI is 0.4.1 but on GitHub it's 0.4.0.

Could you please that the source for 0.4.1?

Thanks

Benchmarking asyncwhois against registrant name

Parsing Whois data is hard, especially because the format differ depending on the TLD. I've a specific issue with registrant value. So I decided to test multiple python whois library (pythonwhoisalt, asyncwhois, whoisit, whoisdomain) against the registrant field using google's domain dataset and check for their speed too. Initially, I was using whoisdomain, so here the initial post on its github: mboot-github/WhoisDomain#21

Here the script I wrote: https://gist.github.com/baderdean/cc4643ecd95d3ccde31dee80ebdbea28

Asyncwhois was the best in term of quality, yet slower than whoisdomain by far. Is it something some one could reproduce to tell if that's related to my specific case or is it generic?

And here the results:

{'asyncwhois': {'count': 49,
                'duration': 285.84409061399947,
                'percentage': 26,},
 'whoisdomain': {'count': 44,
                 'duration': 195.54051797400007,
                 'percentage': 24},
 'whoisit': {'count': 6,
             'duration': 27.91238160300054,
             'percentage': 3,},
'pythonwhoisalt': {'count': 7,
                    'duration': 1055.0711162629996,
                    'percentage': '4%'}}

PS: I've created similar issues in other projects as well.

Infinite loop triggered with RDAP domain search

Hello,

Many thanks for this interesting project, I encountered an infinite loop while using this package. Here is the scenario to reproduce this bug with the latest version of this package (1.0.10).

python3 -m venv venv
venv/bin/python -m pip install asyncwhois
venv/bin/python
from logging import basicConfig
from asyncwhois import rdap_domain
basicConfig(level='DEBUG')
result = rdap_domain('myspreadshop.net')
# infinite loop triggered, raising RecursionError at some point 

Fix mismatched keys in rdap and whois methods

The rdap_domain method uses whodap's to_whois_dict method behind the scenes. This library returns slightly different keys for the whois dictionary that asyncwhois does not.

For example:

import asyncwhois

w = asyncwhois.whois_domain("google.com")
r = asyncwhois.rdap_domain("google.com")

w_keys = w.parser_output.keys()
r_keys = r.parser_output.keys()

# see mismatches
print([k for k in r_keys if k not in w_keys])
print([k for k in w_keys if k not in r_keys])

The task is to write a static function in the DomainLookup class:

@staticmethod
def _convert_whodap_keys(parser_output: dict) -> dict:
    # handle mismatched keys
    return parser_output

The above function should be used in the rdap_domain and aio_rdap_domain functions of DomainLookup

whois_dict = response.to_whois_dict()
_self._parser = _self._convert_whodap_keys(whois_dict)
return _self

Unexpected exception for parsing domain

Network request worked successfully, however response processing failed with the following error:

Traceback (most recent call last):

File "asd.py", line 6, in main
response = await asyncwhois.aio_rdap_domain('clientservices.scenber.com')

File "C:\Users\SAMPLE_USER\AppData\Local\Programs\Python\Python311\Lib\site-packages\asyncwhois_init_.py", line 93, in aio_rdap_domain
result = await DomainLookup.aio_rdap_domain(domain, httpx_client)

File "C:\Users\SAMPLE_USER\AppData\Local\Programs\Python\Python311\Lib\site-packages\asyncwhois\pywhois.py", line 156, in aio_rdap_domain
whois_dict = response.to_whois_dict()

File "C:\Users\SAMPLE_USER\AppData\Local\Programs\Python\Python311\Lib\site-packages\whodap\response.py", line 190, in to_whois_dict
flat.update(self._flat_entities(self.entities))

File "C:\Users\SAMPLE_USER\AppData\Local\Programs\Python\Python311\Lib\site-packages\whodap\response.py", line 238, in _flat_entities
vcard_type = vcard[0]

TypeError: 'DomainResponse' object is not subscriptable

Update "_no_match_checks" list

In asyncwhois.parse_tld.DomainParser.parse there is a check to see if the given query output contains "not found" language. Specifically, there is a for loop that looks for matches in DomainParser._no_match_checks (lines 100-101) and raises an exception.
This list does a pretty good job, but could be expanded.

TODO:

Add Contact Emails To Default Parsed Output

I noticed that contact emails aren't being parsed by default and seems to be commented out in the code, any reasons why?

Should I fork and add email or was there a problem?

Cache data.iana.org/rdap/dns.json for a configurable amount of time

Hello,

I noticed that performing several RDAP searches results in downloading data.iana.org/rdap/dns.json each time a RDAP search is made.

In your opinion, can this file be cached for a configurable amount of time instead ? Or maybe I missed something that prevents implementing this behavior.

Thank you

Not working

Traceback (most recent call last):
File "C:/D/python/bulk_whois/bulk_whois.py", line 28, in
asyncio.run(main())
File "C:\Users\Drakaris\AppData\Local\Programs\Python\Python37-32\lib\asyncio\runners.py", line 43, in run
return loop.run_until_complete(main)
File "C:\Users\Drakaris\AppData\Local\Programs\Python\Python37-32\lib\asyncio\base_events.py", line 584, in run_until_complete
return future.result()
File "C:/D/python/bulk_whois/bulk_whois.py", line 23, in main
await asyncio.gather(*tasks)
File "C:\Users\Drakaris\AppData\Local\Programs\Python\Python37-32\lib\site-packages\asyncwhois_init_.py", line 19, in lookup
query_result = await do_async_whois_query(domain)
File "C:\Users\Drakaris\AppData\Local\Programs\Python\Python37-32\lib\site-packages\asyncwhois\query.py", line 21, in do_async_whois_query
stderr=asyncio.subprocess.PIPE
File "C:\Users\Drakaris\AppData\Local\Programs\Python\Python37-32\lib\asyncio\subprocess.py", line 202, in create_subprocess_shell
stderr=stderr, **kwds)
File "C:\Users\Drakaris\AppData\Local\Programs\Python\Python37-32\lib\asyncio\base_events.py", line 1503, in subprocess_shell
protocol, cmd, True, stdin, stdout, stderr, bufsize, **kwargs)
File "C:\Users\Drakaris\AppData\Local\Programs\Python\Python37-32\lib\asyncio\base_events.py", line 463, in _make_subprocess_transport
raise NotImplementedError
NotImplementedError

'servers' submodule missing from package in 1.1.1

Hey There.

I think we forgot to update the setup.py configuration to include the servers submodule in the distributed package.

diff --git a/setup.py b/setup.py
index ffc90ae..aa7f7a1 100644
--- a/setup.py
+++ b/setup.py
@@ -47,7 +47,7 @@ setuptools.setup(
         "Framework :: AsyncIO",
     ],
     url="https://github.com/pogzyb/asyncwhois",
-    packages=["asyncwhois"],
+    packages=setuptools.find_packages(),
     package_dir={"asyncwhois": "asyncwhois"},
     python_requires=">=3.9",
 )

find_packages should automatically do the trick. Sorry for the misshap.

No response for some domains

Hi. Your library is great, but I ran into a problem.

import asyncwhois
asyncwhois.whois_domain("urbanvibes.com").parser_output
{domain_name: None, created: None, updated: None, expires: None, registrar: None, registrar_iana_id: None, registrant_name: None, registrant_organization: None, registrant_address: None, registrant_city: None, registrant_state: None, registrant_zipcode: None, registrant_country: None, registrant_email: None, dnssec: None, status: [], name_servers: [], admin_name: None, admin_id: None, admin_organization: None, admin_city: None, admin_address: None, admin_state: None, admin_zipcode: None, admin_country: None, admin_phone: None, admin_fax: None, admin_email: None, billing_name: None, billing_id: None, billing_organization: None, billing_city: None, billing_address: None, billing_state: None, billing_zipcode: None, billing_country: None, billing_phone: None, billing_fax: None, billing_email: None, tech_name: None, tech_id: None, tech_organization: None, tech_city: None, tech_address: None, tech_state: None, tech_zipcode: None, tech_country: None, tech_phone: None, tech_fax: None, tech_email: None}
asyncwhois.whois_domain("urbanvibes.com").query_output
' Domain Name: URBANVIBES.COM\r\n Registry Domain ID: 1569257607_DOMAIN_COM-VRSN\r\n Registrar WHOIS Server: whois.crazydomains.com\r\n Registrar URL: http://www.crazydomains.com.au\r\n Updated Date: 2020-01-13T07:38:10Z\r\n Creation Date: 2009-09-16T18:00:20Z\r\n Registry Expiry Date: 2025-09-16T18:00:20Z\r\n Registrar: Dreamscape Networks International Pte Ltd\r\n Registrar IANA ID: 1291\r\n Registrar Abuse Contact Email: [email protected]\r\n Registrar Abuse Contact Phone: +61 894 220 890\r\n Domain Status: ok https://icann.org/epp#ok\r\n Name Server: NS1.GKSMDNS.COM\r\n Name Server: NS2.GKSMDNS.COM\r\n DNSSEC: unsigned\r\n URL of the ICANN Whois Inaccuracy Complaint Form: https://www.icann.org/wicf/\r\n>>> Last update of whois database: 2023-06-02T08:41:25Z <<<\r\n\r\nFor more information on Whois status codes, please visit https://icann.org/epp\r\n\r\nNOTICE: The expiration date displayed in this record is the date the\r\nregistrar's sponsorship of the domain name registration in the registry is\r\ncurrently set to expire. This date does not necessarily reflect the expiration\r\ndate of the domain name registrant's agreement with the sponsoring\r\nregistrar. Users may consult the sponsoring registrar's Whois database to\r\nview the registrar's reported date of expiration for this registration.\r\n\r\nTERMS OF USE: You are not authorized to access or query our Whois\r\ndatabase through the use of electronic processes that are high-volume and\r\nautomated except as reasonably necessary to register domain names or\r\nmodify existing registrations; the Data in VeriSign Global Registry\r\nServices' ("VeriSign") Whois database is provided by VeriSign for\r\ninformation purposes only, and to assist persons in obtaining information\r\nabout or related to a domain name registration record. VeriSign does not\r\nguarantee its accuracy. By submitting a Whois query, you agree to abide\r\nby the following terms of use: You agree that you may use this Data only\r\nfor lawful purposes and that under no circumstances will you use this Data\r\nto: (1) allow, enable, or otherwise support the transmission of mass\r\nunsolicited, commercial advertising or solicitations via e-mail, telephone,\r\nor facsimile; or (2) enable high volume, automated, electronic processes\r\nthat apply to VeriSign (or its computer systems). The compilation,\r\nrepackaging, dissemination or other use of this Data is expressly\r\nprohibited without the prior written consent of VeriSign. You agree not to\r\nuse electronic processes that are automated and high-volume to access or\r\nquery the Whois database except as reasonably necessary to register\r\ndomain names or modify existing registrations. VeriSign reserves the right\r\nto restrict your access to the Whois database in its sole discretion to ensure\r\noperational stability. VeriSign may restrict or terminate your access to the\r\nWhois database for failure to abide by these terms of use. VeriSign\r\nreserves the right to modify these terms at any time.\r\n\r\nThe Registry database contains ONLY .COM, .NET, .EDU domains and\r\nRegistrars.\r\n'
import platform
platform.platform()
'Linux-4.18.0-425.19.2.el8_7.x86_64-x86_64-with-glibc2.31'
import sys
sys.version
'3.11.3 (main, May 23 2023, 13:25:46) [GCC 10.2.1 20210110]'

But the problem does not reproduce on windows.

import asyncwhois
asyncwhois.whois_domain("urbanvibes.com").parser_output
{domain_name: 'URBANVIBES.COM', created: datetime.datetime(2009, 9, 16, 0, 0), updated: datetime.datetime(2020, 1, 13, 15, 38, 10), expires: datetime.datetime(2025, 9, 16, 0, 0), registrar: 'Dreamscape Networks International Pte Ltd', registrar_iana_id: '1291', registrant_name: 'SPORT & FASHION MANAGEMENT PTE. LTD.', registrant_organization: 'SPORT & FASHION MANAGEMENT PTE. LTD.', registrant_address: '6 SHENTON WAY #18-11 OUE DOWNTOWN 2', registrant_city: 'SINGAPORE', registrant_state: 'SINGAPORE', registrant_zipcode: '068809', registrant_country: 'SG', registrant_email: '[email protected]', dnssec: 'unsigned', status: ['ok https://icann.org/epp#ok'], name_servers: ['NS1.GKSMDNS.COM', 'NS2.GKSMDNS.COM'], admin_name: 'SPORT & FASHION MANAGEMENT PTE. LTD.', admin_id: 'C-008487039-SN', admin_organization: 'SPORT & FASHION MANAGEMENT PTE. LTD.', admin_city: 'SINGAPORE', admin_address: '6 SHENTON WAY, #18-11, OUE DOWNTOWN 2', admin_state: 'SINGAPORE', admin_zipcode: '068809', admin_country: 'SG', admin_phone: '+65.66104279', admin_fax: '+65.', admin_email: '[email protected]', billing_name: None, billing_id: None, billing_organization: None, billing_city: None, billing_address: None, billing_state: None, billing_zipcode: None, billing_country: None, billing_phone: None, billing_fax: None, billing_email: None, tech_name: 'SPORT & FASHION MANAGEMENT PTE. LTD.', tech_id: 'C-008487039-SN', tech_organization: 'SPORT & FASHION MANAGEMENT PTE. LTD.', tech_city: 'SINGAPORE', tech_address: '6 SHENTON WAY, #18-11, OUE DOWNTOWN 2', tech_state: 'SINGAPORE', tech_zipcode: '068809', tech_country: 'SG', tech_phone: '+65.66104279', tech_fax: '+65.', tech_email: '[email protected]'}
import sys
sys.version
'3.11.3 (tags/v3.11.3:f3909b8, Apr 4 2023, 23:49:59) [MSC v.1934 64 bit (AMD64)]'
import platform
platform.platform()
'Windows-10-10.0.19044-SP0'

Release tagging

Could you please tag the releases?

This would allow to use the source tarball from GitHub to build packages for distributions with running the tests during the build process. Thanks.

Add code linter workflow

Add black code-style linter that runs on each PR

  • run the black formatter on the code base
  • create linter.yml under .github/workflows

aio_whois_domain() running infinitely

While using the library to perform mass WHOIS lookups, I found that the aio_whois_domain() function is not respecting the timeout parameter and running the query infinitely.

Example query performed:

loop = asyncio.get_event_loop()
result = loop.run_until_complete(asyncwhois.aio_whois_domain("1stchoicebankca.com"))

As per the source code, default timeout is set to 10 seconds, but surely its taking more than that.

can not successfully run demo in readme

Hi,
I can not successfully got demain information as demoed in README.
I use version 1.0.10 with python3.8.When I check in code I found aio_whois_domian is the method to use with async .But this function return DomainLookup instance.And I cannot find how to got domain expiretime and other information ,can any one help me on this issue?

Add rate-limit check to `parse_tld.py`

If you hit a particular WHOIS server too frequently in a certain amount of time, the server may return a "rate limit" response.

In asyncwhois.parse_tld.DomainParser.parse there is a check to see if the given query output contains "not found" language. Specifically, there is a for loop that looks for matches in DomainParser._no_match_checks (lines 100-101) and raises an exception.

The same can be replicated for rate limit responses query output.

TODO:

Stuck on .tk domain

On whois of any registered in the past .tk domain, entire thread gets stuck on regex.

For example, let's use asdasdasdasd.tk domain, which is has been registered sometime ago, but now is free.

Whois service return the text data:


   Domain name:
      ASDASDASDASD.TK

   Organisation:
      Freedom Registry, Inc.
      2225 East Bayshore Road #290
      Palo Alto CA 94303
      United States
      Phone: +1 650-681-4172
      Fax: +1 650-681-4173

   Domain Nameservers:
      NS01.FREENOM.COM
      NS02.FREENOM.COM
      NS03.FREENOM.COM
      NS04.FREENOM.COM

   Your selected domain name is a domain name that has been
   cancelled, suspended, refused or reserved at the Dot TK Registry

   It may be available for re-registration at http://www.dot.tk

   In the interim, the rights for this domain have been automatically
   transferred to Freedom Registry, Inc.

   Please be advised that the Dot TK Registry, Freenom and
   Freedom Registry, Inc. cannot be held responsible for any content
   that was previously available at this domain name.

   Due to restrictions in Dot TK 's Privacy Statement personal information
   about the previous registrants of the domain name cannot be released
   to the general public.

   Dot TK is proud to work with numerous governmental law enforcement
   agencies to stop spam, fraud, phishing attempts, child pornography and
   other illicit content on Dot TK websites. These agencies may contact the
   Dot TK Registry directly with any enquiries they may have regarding the
   usage of this domain by previous registrants.

   Record maintained by: Dot TK Domain Registry

So, the problem is in parse_tld.py#L1169, because it search for Owner contact, that doesn't exist.

imho, this regex enough dangerous, but as hotfix, i assume, would be enough to add const available for re-registration at to parse_tld.DomainParser._no_match_checks

.org domains

Hi, I've got a strange error when try to get whois of .org domains:
result = asyncwhois.whois_domain('iana.org')
Traceback (most recent call last):
File "", line 1, in
...
socket.gaierror: [Errno 11001] getaddrinfo failed

result = asyncwhois.whois_domain('domain.org')
Traceback (most recent call last):
File "", line 1, in
...
socket.gaierror: [Errno 11001] getaddrinfo failed

result = asyncwhois.whois_domain('nlmk.org')
Traceback (most recent call last):
File "", line 1, in
...
socket.gaierror: [Errno 11001] getaddrinfo failed

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.