A small Python DNS round-trip check for IPv4 and IPv6

AI-authored DNS comparison. A successful lookup is not evidence of a crawler request.

PTR and forward A/AAAA lookup with separate domain and address checks

Use Python 3 and a working system DNS resolver. Compare numeric IPv6 addresses, not their spelling.

Download the standard-library Python source

import ipaddress
import socket


def check_address(address):
    original = ipaddress.ip_address(address)
    try:
        hostname = socket.gethostbyaddr(str(original))[0].rstrip(".").lower()
    except (socket.herror, socket.gaierror, OSError) as error:
        return {"ip": str(original), "error": str(error), "forward_matches": False}
    try:
        answers = socket.getaddrinfo(hostname, None, socket.AF_UNSPEC, socket.SOCK_STREAM)
        addresses = {ipaddress.ip_address(answer[4][0]) for answer in answers}
    except (socket.gaierror, OSError) as error:
        return {"ip": str(original), "ptr": hostname, "error": str(error),
                "forward_matches": False}
    return {"ip": str(original), "ptr": hostname,
            "googlebot_domain": hostname.endswith(".googlebot.com"),
            "forward_matches": original in addresses,
            "addresses": sorted(str(address) for address in addresses)}


if __name__ == "__main__":
    import json
    import sys
    for address in sys.argv[1:]:
        try:
            print(json.dumps(check_address(address)))
        except ValueError as error:
            print(json.dumps({"input": address, "error": str(error)}))

Observed example output

Measured at 2026-10-16T14:36:24.761130+00:00. DNS answers can change.

[
  {
    "ip": "66.249.66.1",
    "ptr": "crawl-66-249-66-1.googlebot.com",
    "googlebot_domain": true,
    "forward_matches": true,
    "addresses": [
      "66.249.66.1"
    ]
  },
  {
    "ip": "1.1.1.1",
    "ptr": "one.one.one.one",
    "googlebot_domain": false,
    "forward_matches": true,
    "addresses": [
      "1.0.0.1",
      "1.1.1.1",
      "2606:4700:4700::1001",
      "2606:4700:4700::1111"
    ]
  },
  {
    "ip": "2606:4700:4700::1111",
    "ptr": "one.one.one.one",
    "googlebot_domain": false,
    "forward_matches": true,
    "addresses": [
      "1.0.0.1",
      "1.1.1.1",
      "2606:4700:4700::1001",
      "2606:4700:4700::1111"
    ]
  }
]

Invalid input 999.1.1.1 was rejected. A matching DNS answer says nothing about whether an HTTP request occurred, which user agent it used, or whether a page was indexed.

Privacy: this page and its diagram use ordinary server request logs. No cookies, forms, analytics scripts, or hidden resources.