Skip to content

# Domain

The tool to check the availability or syntax of domain, IP or URL.

::

    ██████╗ ██╗   ██╗███████╗██╗   ██╗███╗   ██╗ ██████╗███████╗██████╗ ██╗     ███████╗
    ██╔══██╗╚██╗ ██╔╝██╔════╝██║   ██║████╗  ██║██╔════╝██╔════╝██╔══██╗██║     ██╔════╝
    ██████╔╝ ╚████╔╝ █████╗  ██║   ██║██╔██╗ ██║██║     █████╗  ██████╔╝██║     █████╗
    ██╔═══╝   ╚██╔╝  ██╔══╝  ██║   ██║██║╚██╗██║██║     ██╔══╝  ██╔══██╗██║     ██╔══╝
    ██║        ██║   ██║     ╚██████╔╝██║ ╚████║╚██████╗███████╗██████╔╝███████╗███████╗
    ╚═╝        ╚═╝   ╚═╝      ╚═════╝ ╚═╝  ╚═══╝ ╚═════╝╚══════╝╚═════╝ ╚══════╝╚══════╝

Provides the domains availability checker.

Author: Nissar Chababy, @funilrys, contactTATAfunilrysTODTODcom

Special thanks: https://pyfunceble.github.io/#/special-thanks

Contributors: https://pyfunceble.github.io/#/contributors

Project link: https://github.com/funilrys/PyFunceble

Project documentation: https://docs.pyfunceble.com

Project homepage: https://pyfunceble.github.io/

License: ::

    Copyright 2017, 2018, 2019, 2020, 2022, 2023, 2024, 2025 Nissar Chababy

    Licensed under the Apache License, Version 2.0 (the "License");
    you may not use this file except in compliance with the License.
    You may obtain a copy of the License at

        https://www.apache.org/licenses/LICENSE-2.0

    Unless required by applicable law or agreed to in writing, software
    distributed under the License is distributed on an "AS IS" BASIS,
    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    See the License for the specific language governing permissions and
    limitations under the License.

## `DomainAvailabilityChecker`

Bases: `AvailabilityCheckerBase`

Provides the interface for checking the availability of a given domain.

Parameters:

Name | Type | Description | Default
--- | --- | --- | ---
`subject` | `str` | Optional, The subject to work with. | `None`
`use_extra_rules` | `bool` | Optional, Activates/Disables the usage of our own set of extra rules. | `None`
`use_whois_lookup` | `bool` | Optional, Activates/Disables the usage of the WHOIS lookup to gather the status of the given :code:`subject`. | `None`
`use_dns_lookup` | `bool` | Optional, Activates/Disables the usage of the DNS lookup to gather the status of the given :code:`subject`. | `None`
`use_netinfo_lookup` | `bool` | Optional, Activates/Disables the usage of the network information lookup module to gather the status of the given :code:`subject`. | `None`
`use_http_code_lookup` | `bool` | Optional, Activates/Disables the usage of the HTTP status code lookup to gather the status of the given :code:`subject`. | `None`
`use_reputation_lookup` | `bool` | Optional, Activates/Disables the usage of the reputation dataset lookup to gather the status of the given :code:`subject`. | `None`
`do_syntax_check_first` | `bool` | Optional, Activates/Disables the check of the status before the actual status gathering. | `None`
`use_whois_db` | `bool` | Optional, Activates/Disable the usage of a local database to store the WHOIS datasets. | `None`

Source code in `PyFunceble/checker/availability/domain.py`

     61
     62
     63
     64
     65
     66
     67
     68
     69
     70
     71
     72
     73
     74
     75
     76
     77
     78
     79
     80
     81
     82
     83
     84
     85
     86
     87
     88
     89
     90
     91
     92
     93
     94
     95
     96
     97
     98
     99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203

    class DomainAvailabilityChecker(AvailabilityCheckerBase):
        """
        Provides the interface for checking the availability of a given domain.

        :param str subject:
            Optional, The subject to work with.
        :param bool use_extra_rules:
            Optional, Activates/Disables the usage of our own set of extra rules.
        :param bool use_whois_lookup:
            Optional, Activates/Disables the usage of the WHOIS lookup to gather
            the status of the given :code:`subject`.
        :param bool use_dns_lookup:
            Optional, Activates/Disables the usage of the DNS lookup to gather the
            status of the given :code:`subject`.
        :param bool use_netinfo_lookup:
            Optional, Activates/Disables the usage of the network information
            lookup module to gather the status of the given :code:`subject`.
        :param bool use_http_code_lookup:
            Optional, Activates/Disables the usage of the HTTP status code lookup
            to gather the status of the given :code:`subject`.
        :param bool use_reputation_lookup:
            Optional, Activates/Disables the usage of the reputation dataset
            lookup to gather the status of the given :code:`subject`.
        :param bool do_syntax_check_first:
            Optional, Activates/Disables the check of the status before the actual
            status gathering.
        :param bool use_whois_db:
            Optional, Activates/Disable the usage of a local database to store the
            WHOIS datasets.
        """

        def subject_propagator(self) -> "DomainAvailabilityChecker":
            """
            Propagate the currently set subject.

            .. warning::
                You are not invited to run this method directly.
            """

            self.status = AvailabilityCheckerStatus()
            self.params = AvailabilityCheckerParams()
            self.status.params = self.params

            self.status.subject_kind = "domain"

            return super().subject_propagator()

        def try_to_query_status_from_reputation(self) -> "DomainAvailabilityChecker":
            """
            Tries to query the status from the reputation lookup.
            """

            PyFunceble.facility.Logger.info(
                "Started to try to query the status of %r from: Reputation Lookup",
                self.status.idna_subject,
            )

            lookup_result = DomainReputationChecker(self.status.idna_subject).get_status()

            # pylint: disable=no-member
            if lookup_result and lookup_result.is_malicious():
                self.status.status = PyFunceble.storage.STATUS.up
                self.status.status_source = "REPUTATION"

                PyFunceble.facility.Logger.info(
                    "Could define the status of %r from: Reputation Lookup",
                    self.status.idna_subject,
                )

            PyFunceble.facility.Logger.info(
                "Finished to try to query the status of %r from: Reputation Lookup",
                self.status.idna_subject,
            )

            return self

        @AvailabilityCheckerBase.ensure_subject_is_given
        @AvailabilityCheckerBase.update_status_date_after_query
        def query_status(
            self,
        ) -> "DomainAvailabilityChecker":  # pragma: no cover
            """
            Queries the result without anything more.
            """
            ## Test Methods are more important.

            status_post_syntax_checker = None

            if not self.status.status and self.use_platform:
                self.try_to_query_status_from_platform()

            if not self.status.status and self.do_syntax_check_first:
                self.try_to_query_status_from_syntax_lookup(from_domain_test=True)

                if self.status.status:
                    status_post_syntax_checker = self.status.status

            if (
                self.use_whois_lookup
                and self.status.second_level_domain_syntax
                and self.should_we_continue_test(status_post_syntax_checker)
            ):
                self.try_to_query_status_from_whois()

            if self.use_dns_lookup and self.should_we_continue_test(
                status_post_syntax_checker
            ):
                self.try_to_query_status_from_dns()

            if self.use_netinfo_lookup and self.should_we_continue_test(
                status_post_syntax_checker
            ):
                self.try_to_query_status_from_netinfo()

            if self.use_reputation_lookup and self.should_we_continue_test(
                status_post_syntax_checker
            ):
                self.try_to_query_status_from_reputation()

            if self.use_extra_rules or (
                self.use_http_code_lookup
                and self.should_we_continue_test(status_post_syntax_checker)
            ):
                self.try_to_query_status_from_http_status_code(from_domain_test=True)

            if not self.status.status:
                self.status.status = PyFunceble.storage.STATUS.down
                self.status.status_source = "STDLOOKUP"

                PyFunceble.facility.Logger.info(
                    "Could not define status the status of %r. Setting to %r",
                    self.status.idna_subject,
                    self.status.status,
                )

            if self.use_extra_rules:
                self.try_to_query_status_from_extra_rules()

            return self

        @staticmethod
        def is_valid() -> bool:  # pylint: disable=arguments-differ
            raise NotImplementedError()

### `query_status()`

Queries the result without anything more.

Source code in `PyFunceble/checker/availability/domain.py`

    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199

    @AvailabilityCheckerBase.ensure_subject_is_given
    @AvailabilityCheckerBase.update_status_date_after_query
    def query_status(
        self,
    ) -> "DomainAvailabilityChecker":  # pragma: no cover
        """
        Queries the result without anything more.
        """
        ## Test Methods are more important.

        status_post_syntax_checker = None

        if not self.status.status and self.use_platform:
            self.try_to_query_status_from_platform()

        if not self.status.status and self.do_syntax_check_first:
            self.try_to_query_status_from_syntax_lookup(from_domain_test=True)

            if self.status.status:
                status_post_syntax_checker = self.status.status

        if (
            self.use_whois_lookup
            and self.status.second_level_domain_syntax
            and self.should_we_continue_test(status_post_syntax_checker)
        ):
            self.try_to_query_status_from_whois()

        if self.use_dns_lookup and self.should_we_continue_test(
            status_post_syntax_checker
        ):
            self.try_to_query_status_from_dns()

        if self.use_netinfo_lookup and self.should_we_continue_test(
            status_post_syntax_checker
        ):
            self.try_to_query_status_from_netinfo()

        if self.use_reputation_lookup and self.should_we_continue_test(
            status_post_syntax_checker
        ):
            self.try_to_query_status_from_reputation()

        if self.use_extra_rules or (
            self.use_http_code_lookup
            and self.should_we_continue_test(status_post_syntax_checker)
        ):
            self.try_to_query_status_from_http_status_code(from_domain_test=True)

        if not self.status.status:
            self.status.status = PyFunceble.storage.STATUS.down
            self.status.status_source = "STDLOOKUP"

            PyFunceble.facility.Logger.info(
                "Could not define status the status of %r. Setting to %r",
                self.status.idna_subject,
                self.status.status,
            )

        if self.use_extra_rules:
            self.try_to_query_status_from_extra_rules()

        return self

### `subject_propagator()`

Propagate the currently set subject.

.. warning:: You are not invited to run this method directly.

Source code in `PyFunceble/checker/availability/domain.py`

     92
     93
     94
     95
     96
     97
     98
     99
    100
    101
    102
    103
    104
    105
    106

    def subject_propagator(self) -> "DomainAvailabilityChecker":
        """
        Propagate the currently set subject.

        .. warning::
            You are not invited to run this method directly.
        """

        self.status = AvailabilityCheckerStatus()
        self.params = AvailabilityCheckerParams()
        self.status.params = self.params

        self.status.subject_kind = "domain"

        return super().subject_propagator()

### `try_to_query_status_from_reputation()`

Tries to query the status from the reputation lookup.

Source code in `PyFunceble/checker/availability/domain.py`

    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135

    def try_to_query_status_from_reputation(self) -> "DomainAvailabilityChecker":
        """
        Tries to query the status from the reputation lookup.
        """

        PyFunceble.facility.Logger.info(
            "Started to try to query the status of %r from: Reputation Lookup",
            self.status.idna_subject,
        )

        lookup_result = DomainReputationChecker(self.status.idna_subject).get_status()

        # pylint: disable=no-member
        if lookup_result and lookup_result.is_malicious():
            self.status.status = PyFunceble.storage.STATUS.up
            self.status.status_source = "REPUTATION"

            PyFunceble.facility.Logger.info(
                "Could define the status of %r from: Reputation Lookup",
                self.status.idna_subject,
            )

        PyFunceble.facility.Logger.info(
            "Finished to try to query the status of %r from: Reputation Lookup",
            self.status.idna_subject,
        )

        return self