Fix bug in creation date parsing for contacts. Implement .co.jp with recursive handle lookups, fixes #22 partially. Skip WHOIS referals with a protocol specification, fixes #25.

master
Sven Slootweg 10 years ago
parent 8fe54fa66b
commit d86e4ba916

@ -20,15 +20,19 @@ def json_fallback(obj):
return obj
if args.file is None:
data = pythonwhois.net.get_whois_raw(args.domain[0])
data, server_list = pythonwhois.net.get_whois_raw(args.domain[0], with_server_list=True)
else:
server_list = []
with open(args.file, "r") as f:
data = f.read().split("\n--\n")
if args.raw == True:
print "\n--\n".join(data)
else:
parsed = pythonwhois.parse.parse_raw_whois(data, normalized=True)
if len(server_list) > 0:
parsed = pythonwhois.parse.parse_raw_whois(data, normalized=True, never_query_handles=False, handle_server=server_list[-1])
else:
parsed = pythonwhois.parse.parse_raw_whois(data, normalized=True)
if args.json == True:
print json.dumps(parsed, default=json_fallback)

@ -1,8 +1,11 @@
from . import net, parse
def get_whois(domain, normalized=[]):
raw_data = net.get_whois_raw(domain)
return parse.parse_raw_whois(raw_data, normalized=normalized)
raw_data, server_list = net.get_whois_raw(domain, with_server_list=True)
# Unlisted handles will be looked up on the last WHOIS server that was queried. This may be changed to also query
# other servers in the future, if it turns out that there are cases where the last WHOIS server in the chain doesn't
# actually hold the handle contact details, but another WHOIS server in the chain does.
return parse.parse_raw_whois(raw_data, normalized=normalized, never_query_handles=False, handle_server=server_list[-1])
def whois(*args, **kwargs):
raise Exception("The whois() method has been replaced by a different method (with a different API), since pythonwhois 2.0. Either install the older pythonwhois 1.2.3, or change your code to use the new API.")

@ -2,7 +2,7 @@ import socket, re
from codecs import encode, decode
from . import shared
def get_whois_raw(domain, server="", previous=[], rfc3490=True, never_cut=False):
def get_whois_raw(domain, server="", previous=[], rfc3490=True, never_cut=False, with_server_list=False, server_list=[]):
# Sometimes IANA simply won't give us the right root WHOIS server
exceptions = {
".ac.uk": "whois.ja.net",
@ -14,8 +14,9 @@ def get_whois_raw(domain, server="", previous=[], rfc3490=True, never_cut=False)
if rfc3490:
domain = encode( domain if type(domain) is unicode else decode(domain, "utf8"), "idna" )
if len(previous) == 0:
if len(previous) == 0 and server == "":
# Root query
server_list = [] # Otherwise it retains the list on subsequent queries, for some reason.
is_exception = False
for exception, exc_serv in exceptions.iteritems():
if domain.endswith(exception):
@ -26,7 +27,7 @@ def get_whois_raw(domain, server="", previous=[], rfc3490=True, never_cut=False)
target_server = get_root_server(domain)
else:
target_server = server
if domain.endswith(".jp") and target_server == "whois.jprs.jp":
if target_server == "whois.jprs.jp":
request_domain = "%s/e" % domain # Suppress Japanese output
elif domain.endswith(".de") and ( target_server == "whois.denic.de" or target_server == "de.whois-servers.net" ):
request_domain = "-T dn,ace %s" % domain # regional specific stuff
@ -52,14 +53,18 @@ def get_whois_raw(domain, server="", previous=[], rfc3490=True, never_cut=False)
break
if never_cut == False:
new_list = [response] + previous
server_list.append(target_server)
for line in [x.strip() for x in response.splitlines()]:
match = re.match("(refer|whois server|referral url|whois server|registrar whois):\s*([^\s]+\.[^\s]+)", line, re.IGNORECASE)
if match is not None:
referal_server = match.group(2)
if referal_server != server:
if referal_server != server and "://" not in referal_server: # We want to ignore anything non-WHOIS (eg. HTTP) for now.
# Referal to another WHOIS server...
return get_whois_raw(domain, referal_server, new_list)
return new_list
return get_whois_raw(domain, referal_server, new_list, server_list=server_list, with_server_list=with_server_list)
if with_server_list:
return (new_list, server_list)
else:
return new_list
def get_root_server(domain):
data = whois_request(domain, "whois.iana.org")

@ -1,11 +1,13 @@
from __future__ import print_function
import re, sys, datetime
from . import net, shared
grammar = {
"_data": {
'id': ['Domain ID:[ ]*(?P<val>.+)'],
'status': ['\[Status\]\s*(?P<val>.+)',
'Status\s*:\s?(?P<val>.+)',
'\[State\]\s*(?P<val>.+)',
'^state:\s*(?P<val>.+)'],
'creation_date': ['\[Created on\]\s*(?P<val>.+)',
'Created on[.]*: [a-zA-Z]+, (?P<val>.+)',
@ -27,6 +29,7 @@ grammar = {
'Domain Create Date\s?[.]*:?\s*?(?P<val>.+)',
'Domain Registration Date\s?[.]*:?\s*?(?P<val>.+)',
'created:\s*(?P<val>.+)',
'\[Registered Date\]\s*(?P<val>.+)',
'created-date:\s*(?P<val>.+)',
'registered:\s*(?P<val>.+)',
'registration:\s*(?P<val>.+)'],
@ -72,6 +75,7 @@ grammar = {
'Last Update\s?[.]*:\s?(?P<val>.+)',
'Last updated on (?P<val>.+) [a-z]{3,4}',
'Last updated:\s*(?P<val>.+)',
'\[Last Update\]\s*(?P<val>.+) \([A-Z]+\)',
'Last update of whois database:\s?[a-z]{3}, (?P<val>.+) [a-z]{3,4}'],
'registrar': ['registrar:\s*(?P<val>.+)',
'Registrar:\s*(?P<val>.+)',
@ -153,7 +157,7 @@ else:
return isinstance(data, str)
def parse_raw_whois(raw_data, normalized=[]):
def parse_raw_whois(raw_data, normalized=[], never_query_handles=True, handle_server=""):
data = {}
raw_data = [segment.replace("\r", "") for segment in raw_data] # Carriage returns are the devil
@ -257,7 +261,7 @@ def parse_raw_whois(raw_data, normalized=[]):
data["registrar"] = [match.group(1).strip()]
data["contacts"] = parse_registrants(raw_data)
data["contacts"] = parse_registrants(raw_data, never_query_handles, handle_server)
# Parse dates
try:
@ -502,7 +506,7 @@ def preprocess_regex(regex):
regex = re.sub(r"\[ \]\*\(\?P<([^>]+)>\.\*\)", r"(?P<\1>.*)", regex)
return regex
def parse_registrants(data):
def parse_registrants(data, never_query_handles=True, handle_server=""):
registrant = None
tech_contact = None
billing_contact = None
@ -523,6 +527,7 @@ def parse_registrants(data):
"Holder of domain name:\n(?P<name>[\S\s]+)\n(?P<street>.+)\n(?P<postalcode>[A-Z0-9-]+)\s+(?P<city>.+)\n(?P<country>.+)\nContractual Language", # nic.ch
"\n\n(?:Owner)?\s+: (?P<name>.*)\n(?:\s+: (?P<organization>.*)\n)?\s+: (?P<street>.*)\n\s+: (?P<city>.*)\n\s+: (?P<state>.*)\n\s+: (?P<country>.*)\n", # nic.io
"Contact Information:\n\[Name\]\s*(?P<name>.*)\n\[Email\]\s*(?P<email>.*)\n\[Web Page\]\s*(?P<url>.*)\n\[Postal code\]\s*(?P<postalcode>.*)\n\[Postal Address\]\s*(?P<street1>.*)\n(?:\s+(?P<street2>.*)\n)?(?:\s+(?P<street3>.*)\n)?\[Phone\]\s*(?P<phone>.*)\n\[Fax\]\s*(?P<fax>.*)\n", # jprs.jp
"g\. \[Organization\] (?P<organization>.+)\n", # .co.jp registrations at jprs.jp
"Registrant ID:(?P<handle>.*)\nRegistrant Name:(?P<name>.*)\n(?:Registrant Organization:(?P<organization>.*)\n)?Registrant Address1:(?P<street1>.*)\n(?:Registrant Address2:(?P<street2>.*)\n)?(?:Registrant Address3:(?P<street3>.*)\n)?Registrant City:(?P<city>.*)\n(?:Registrant State/Province:(?P<state>.*)\n)?Registrant Postal Code:(?P<postalcode>.*)\nRegistrant Country:(?P<country>.*)\nRegistrant Country Code:.*\nRegistrant Phone Number:(?P<phone>.*)\n(?:Registrant Facsimile Number:(?P<facsimile>.*)\n)?Registrant Email:(?P<email>.*)", # .US, .biz (NeuStar)
"Registrant\n Name: (?P<name>.+)\n(?: Organization: (?P<organization>.+)\n)? ContactID: (?P<handle>.+)\n(?: Address: (?P<street1>.+)\n(?: (?P<street2>.+)\n(?: (?P<street3>.+)\n)?)? (?P<city>.+)\n (?P<postalcode>.+)\n (?P<state>.+)\n (?P<country>.+)\n)?(?: Created: (?P<creationdate>.+)\n)?(?: Last Update: (?P<changedate>.+)\n)?", # nic.it
" Organisation Name[.]* (?P<name>.*)\n Organisation Address[.]* (?P<street1>.*)\n Organisation Address[.]* (?P<street2>.*)\n(?: Organisation Address[.]* (?P<street3>.*)\n)? Organisation Address[.]* (?P<city>.*)\n Organisation Address[.]* (?P<postalcode>.*)\n Organisation Address[.]* (?P<state>.*)\n Organisation Address[.]* (?P<country>.*)", # Melbourne IT (what a horrid format...)
@ -606,17 +611,6 @@ def parse_registrants(data):
]
# Some registries use NIC handle references instead of directly listing contacts...
nic_contact_regexes = [
"personname:\s*(?P<name>.+)\norganization:\s*(?P<organization>.+)\nstreet address:\s*(?P<street>.+)\npostal code:\s*(?P<postalcode>.+)\ncity:\s*(?P<city>.+)\ncountry:\s*(?P<country>.+)\n(?:phone:\s*(?P<phone>.+)\n)?(?:fax-no:\s*(?P<fax>.+)\n)?(?:e-mail:\s*(?P<email>.+)\n)?nic-hdl:\s*(?P<handle>.+)\nchanged:\s*(?P<changedate>.+)", # nic.at
"contact-handle:[ ]*(?P<handle>.+)\ncontact:[ ]*(?P<name>.+)\n(?:organisation:[ ]*(?P<organization>.+)\n)?address:[ ]*(?P<street1>.+)\n(?:address:[ ]*(?P<street2>.+)\n)?(?:address:[ ]*(?P<street3>.+)\n)?(?:address:[ ]*(?P<street4>.+)\n)?address:[ ]*(?P<city>.+)\naddress:[ ]*(?P<state>.+)\naddress:[ ]*(?P<postalcode>.+)\naddress:[ ]*(?P<country>.+)\n(?:phone:[ ]*(?P<phone>.+)\n)?(?:fax:[ ]*(?P<fax>.+)\n)?(?:email:[ ]*(?P<email>.+)\n)?", # LCN.com
"person:\s*(?P<name>.+)\nnic-hdl:\s*(?P<handle>.+)\n", # .ie
"nic-hdl:\s*(?P<handle>.+)\ntype:\s*(?P<type>.+)\ncontact:\s*(?P<name>.+)\n(?:.+\n)*?(?:address:\s*(?P<street1>.+)\naddress:\s*(?P<street2>.+)\naddress:\s*(?P<street3>.+)\naddress:\s*(?P<country>.+)\n)?(?:phone:\s*(?P<phone>.+)\n)?(?:fax-no:\s*(?P<fax>.+)\n)?(?:.+\n)*?(?:e-mail:\s*(?P<email>.+)\n)?(?:.+\n)*?changed:\s*(?P<changedate>[0-9]{2}\/[0-9]{2}\/[0-9]{4}).*\n", # AFNIC madness without country field
"nic-hdl:\s*(?P<handle>.+)\ntype:\s*(?P<type>.+)\ncontact:\s*(?P<name>.+)\n(?:.+\n)*?(?:address:\s*(?P<street1>.+)\n)?(?:address:\s*(?P<street2>.+)\n)?(?:address:\s*(?P<street3>.+)\n)?(?:phone:\s*(?P<phone>.+)\n)?(?:fax-no:\s*(?P<fax>.+)\n)?(?:.+\n)*?(?:e-mail:\s*(?P<email>.+)\n)?(?:.+\n)*?changed:\s*(?P<changedate>[0-9]{2}\/[0-9]{2}\/[0-9]{4}).*\n", # AFNIC madness any country -at all-
"nic-hdl:\s*(?P<handle>.+)\ntype:\s*(?P<type>.+)\ncontact:\s*(?P<name>.+)\n(?:.+\n)*?(?:address:\s*(?P<street1>.+)\n)?(?:address:\s*(?P<street2>.+)\n)?(?:address:\s*(?P<street3>.+)\n)?(?:address:\s*(?P<street4>.+)\n)?country:\s*(?P<country>.+)\n(?:phone:\s*(?P<phone>.+)\n)?(?:fax-no:\s*(?P<fax>.+)\n)?(?:.+\n)*?(?:e-mail:\s*(?P<email>.+)\n)?(?:.+\n)*?changed:\s*(?P<changedate>[0-9]{2}\/[0-9]{2}\/[0-9]{4}).*\n", # AFNIC madness with country field
]
nic_contact_references = {
"registrant": [
"registrant:\s*(?P<handle>.+)", # nic.at
@ -627,10 +621,12 @@ def parse_registrants(data):
"tech": [
"tech-c:\s*(?P<handle>.+)", # nic.at, AFNIC, iis.se
"technical-contact:\s*(?P<handle>.+)", # LCN.com
"n\. \[Technical Contact\] (?P<handle>.+)\n", #.co.jp
],
"admin": [
"admin-c:\s*(?P<handle>.+)", # nic.at, AFNIC, iis.se
"admin-contact:\s*(?P<handle>.+)", # LCN.com
"m\. \[Administrative Contact\] (?P<handle>.+)\n", # .co.jp
],
"billing": [
"billing-c:\s*(?P<handle>.+)", # iis.se
@ -677,14 +673,10 @@ def parse_registrants(data):
break
# Find NIC handle contact definitions
handle_contacts = []
for regex in nic_contact_regexes:
for segment in data:
matches = re.finditer(regex, segment)
for match in matches:
handle_contacts.append(match.groupdict())
handle_contacts = parse_nic_contact(data)
# Find NIC handle references and process them
missing_handle_contacts = []
for category in nic_contact_references:
for regex in nic_contact_references[category]:
for segment in data:
@ -694,9 +686,23 @@ def parse_registrants(data):
if data_reference["handle"] == "-" or re.match("https?:\/\/", data_reference["handle"]) is not None:
pass # Reference was either blank or a URL; the latter is to deal with false positives for nic.ru
else:
found = False
for contact in handle_contacts:
if contact["handle"] == data_reference["handle"]:
found = True
data_reference.update(contact)
if found == False:
# The contact definition was not found in the supplied raw WHOIS data. If the
# method has been called with never_query_handles=False, we can use the supplied
# WHOIS server for looking up the handle information separately.
if never_query_handles == False:
try:
contact = fetch_nic_contact(data_reference["handle"], handle_server)
data_reference.update(contact)
except shared.WhoisException as e:
pass # No data found. TODO: Log error?
else:
pass # TODO: Log warning?
if category == "registrant":
registrant = data_reference
elif category == "tech":
@ -706,7 +712,7 @@ def parse_registrants(data):
elif category == "admin":
admin_contact = data_reference
break
# Post-processing
for obj in (registrant, tech_contact, billing_contact, admin_contact):
if obj is not None:
@ -732,6 +738,8 @@ def parse_registrants(data):
obj["street"] = "\n".join(street_items)
if 'changedate' in obj:
obj['changedate'] = parse_dates([obj['changedate']])[0]
if 'creationdate' in obj:
obj['creationdate'] = parse_dates([obj['creationdate']])[0]
if 'street' in obj and "\n" in obj["street"] and 'postalcode' not in obj:
# Deal with certain mad WHOIS servers that don't properly delimit address data... (yes, AFNIC, looking at you)
lines = [x.strip() for x in obj["street"].splitlines()]
@ -754,3 +762,33 @@ def parse_registrants(data):
"admin": admin_contact,
"billing": billing_contact,
}
def fetch_nic_contact(handle, lookup_server):
response = net.get_whois_raw(handle, lookup_server)
response = [segment.replace("\r", "") for segment in response] # Carriage returns are the devil
results = parse_nic_contact(response)
if len(results) > 0:
return results[0]
else:
raise shared.WhoisException("No contact data found in the response.")
def parse_nic_contact(data):
nic_contact_regexes = [
"personname:\s*(?P<name>.+)\norganization:\s*(?P<organization>.+)\nstreet address:\s*(?P<street>.+)\npostal code:\s*(?P<postalcode>.+)\ncity:\s*(?P<city>.+)\ncountry:\s*(?P<country>.+)\n(?:phone:\s*(?P<phone>.+)\n)?(?:fax-no:\s*(?P<fax>.+)\n)?(?:e-mail:\s*(?P<email>.+)\n)?nic-hdl:\s*(?P<handle>.+)\nchanged:\s*(?P<changedate>.+)", # nic.at
"contact-handle:[ ]*(?P<handle>.+)\ncontact:[ ]*(?P<name>.+)\n(?:organisation:[ ]*(?P<organization>.+)\n)?address:[ ]*(?P<street1>.+)\n(?:address:[ ]*(?P<street2>.+)\n)?(?:address:[ ]*(?P<street3>.+)\n)?(?:address:[ ]*(?P<street4>.+)\n)?address:[ ]*(?P<city>.+)\naddress:[ ]*(?P<state>.+)\naddress:[ ]*(?P<postalcode>.+)\naddress:[ ]*(?P<country>.+)\n(?:phone:[ ]*(?P<phone>.+)\n)?(?:fax:[ ]*(?P<fax>.+)\n)?(?:email:[ ]*(?P<email>.+)\n)?", # LCN.com
"Contact Information:\na\. \[JPNIC Handle\] (?P<handle>.+)\nc\. \[Last, First\] (?P<lastname>.+), (?P<firstname>.+)\nd\. \[E-Mail\] (?P<email>.+)\ng\. \[Organization\] (?P<organization>.+)\nl\. \[Division\] (?P<division>.+)\nn\. \[Title\] (?P<title>.+)\no\. \[TEL\] (?P<phone>.+)\np\. \[FAX\] (?P<fax>.+)\ny\. \[Reply Mail\] .*\n\[Last Update\] (?P<changedate>.+) \(JST\)\n", # JPRS .co.jp contact handle lookup
"person:\s*(?P<name>.+)\nnic-hdl:\s*(?P<handle>.+)\n", # .ie
"nic-hdl:\s*(?P<handle>.+)\ntype:\s*(?P<type>.+)\ncontact:\s*(?P<name>.+)\n(?:.+\n)*?(?:address:\s*(?P<street1>.+)\naddress:\s*(?P<street2>.+)\naddress:\s*(?P<street3>.+)\naddress:\s*(?P<country>.+)\n)?(?:phone:\s*(?P<phone>.+)\n)?(?:fax-no:\s*(?P<fax>.+)\n)?(?:.+\n)*?(?:e-mail:\s*(?P<email>.+)\n)?(?:.+\n)*?changed:\s*(?P<changedate>[0-9]{2}\/[0-9]{2}\/[0-9]{4}).*\n", # AFNIC madness without country field
"nic-hdl:\s*(?P<handle>.+)\ntype:\s*(?P<type>.+)\ncontact:\s*(?P<name>.+)\n(?:.+\n)*?(?:address:\s*(?P<street1>.+)\n)?(?:address:\s*(?P<street2>.+)\n)?(?:address:\s*(?P<street3>.+)\n)?(?:phone:\s*(?P<phone>.+)\n)?(?:fax-no:\s*(?P<fax>.+)\n)?(?:.+\n)*?(?:e-mail:\s*(?P<email>.+)\n)?(?:.+\n)*?changed:\s*(?P<changedate>[0-9]{2}\/[0-9]{2}\/[0-9]{4}).*\n", # AFNIC madness any country -at all-
"nic-hdl:\s*(?P<handle>.+)\ntype:\s*(?P<type>.+)\ncontact:\s*(?P<name>.+)\n(?:.+\n)*?(?:address:\s*(?P<street1>.+)\n)?(?:address:\s*(?P<street2>.+)\n)?(?:address:\s*(?P<street3>.+)\n)?(?:address:\s*(?P<street4>.+)\n)?country:\s*(?P<country>.+)\n(?:phone:\s*(?P<phone>.+)\n)?(?:fax-no:\s*(?P<fax>.+)\n)?(?:.+\n)*?(?:e-mail:\s*(?P<email>.+)\n)?(?:.+\n)*?changed:\s*(?P<changedate>[0-9]{2}\/[0-9]{2}\/[0-9]{4}).*\n", # AFNIC madness with country field
]
handle_contacts = []
for regex in nic_contact_regexes:
for segment in data:
matches = re.finditer(regex, segment)
for match in matches:
handle_contacts.append(match.groupdict())
return handle_contacts

@ -4,6 +4,9 @@ import sys, argparse, os, pythonwhois, json, datetime, codecs
import pkgutil
import encodings
# FIXME: The testing script is currently incapable of testing referenced NIC handles that are
# retrieved separately, such as is the case with the JPRS registry for .co.jp. This
# really needs to be fixed, to ensure that contact parsing for this doesn't break.
def get_codecs():
"""Dynamically get list of codecs in python."""

@ -0,0 +1,33 @@
[ JPRS database provides information on network administration. Its use is ]
[ restricted to network administration purposes. For further information, ]
[ use 'whois -h whois.jprs.jp help'. To suppress Japanese output, add'/e' ]
[ at the end of command, e.g. 'whois -h whois.jprs.jp xxx/e'. ]
[ ]
[ Notice -------------------------------------------------------------------- ]
[ JPRS will change JPRS WHOIS (web-based and port 43 Whois service) about the ]
[ following two points on January 18, 2015. ]
[ ]
[ 1) Change of the format of response about gTLD domain name ]
[ 2) Change of the character encoding ]
[ ]
[ For further information, please see the following webpage. ]
[ http://jprs.jp/whatsnew/notice/2014/20140319-whois.html (only in Japanese) ]
[ --------------------------------------------------------------------------- ]
Domain Information:
a. [Domain Name] GOOGLE.CO.JP
g. [Organization] Google Japan
l. [Organization Type] corporation
m. [Administrative Contact] DL152JP
n. [Technical Contact] TW124137JP
p. [Name Server] ns1.google.com
p. [Name Server] ns2.google.com
p. [Name Server] ns3.google.com
p. [Name Server] ns4.google.com
s. [Signing Key]
[State] Connected (2015/03/31)
[Registered Date] 2001/03/22
[Connected Date] 2001/03/22
[Last Update] 2014/04/01 01:18:23 (JST)

@ -0,0 +1,31 @@
[ JPRS database provides information on network administration. Its use is ]
[ restricted to network administration purposes. For further information, ]
[ use 'whois -h whois.jprs.jp help'. To suppress Japanese output, add'/e' ]
[ at the end of command, e.g. 'whois -h whois.jprs.jp xxx/e'. ]
[ ]
[ Notice -------------------------------------------------------------------- ]
[ JPRS will change JPRS WHOIS (web-based and port 43 Whois service) about the ]
[ following two points on January 18, 2015. ]
[ ]
[ 1) Change of the format of response about gTLD domain name ]
[ 2) Change of the character encoding ]
[ ]
[ For further information, please see the following webpage. ]
[ http://jprs.jp/whatsnew/notice/2014/20140319-whois.html (only in Japanese) ]
[ --------------------------------------------------------------------------- ]
Domain Information:
a. [Domain Name] NTTPC.CO.JP
g. [Organization] NTT PC Communications Incorporated
l. [Organization Type] Corporation
m. [Administrative Contact] TY4708JP
n. [Technical Contact] YA6489JP
p. [Name Server] ns1.sphere.ad.jp
p. [Name Server] ns2.sphere.ad.jp
s. [Signing Key]
[State] Connected (2015/03/31)
[Registered Date]
[Connected Date]
[Last Update] 2014/04/01 01:10:41 (JST)

@ -0,0 +1 @@
{"status": ["Connected (2015/03/31)"], "updated_date": ["2014-04-01T01:18:23"], "contacts": {"admin": {"handle": "DL152JP"}, "tech": {"handle": "TW124137JP"}, "registrant": {"organization": "Google Japan"}, "billing": null}, "nameservers": ["ns1.google.com", "ns2.google.com", "ns3.google.com", "ns4.google.com"], "creation_date": ["2001-03-22T00:00:00"], "raw": ["[ JPRS database provides information on network administration. Its use is ]\n[ restricted to network administration purposes. For further information, ]\n[ use 'whois -h whois.jprs.jp help'. To suppress Japanese output, add'/e' ]\n[ at the end of command, e.g. 'whois -h whois.jprs.jp xxx/e'. ]\n[ ]\n[ Notice -------------------------------------------------------------------- ]\n[ JPRS will change JPRS WHOIS (web-based and port 43 Whois service) about the ]\n[ following two points on January 18, 2015. ]\n[ ]\n[ 1) Change of the format of response about gTLD domain name ]\n[ 2) Change of the character encoding ]\n[ ]\n[ For further information, please see the following webpage. ]\n[ http://jprs.jp/whatsnew/notice/2014/20140319-whois.html (only in Japanese) ]\n[ --------------------------------------------------------------------------- ]\n\nDomain Information:\na. [Domain Name] GOOGLE.CO.JP\ng. [Organization] Google Japan\nl. [Organization Type] corporation\nm. [Administrative Contact] DL152JP\nn. [Technical Contact] TW124137JP\np. [Name Server] ns1.google.com\np. [Name Server] ns2.google.com\np. [Name Server] ns3.google.com\np. [Name Server] ns4.google.com\ns. [Signing Key] \n[State] Connected (2015/03/31)\n[Registered Date] 2001/03/22\n[Connected Date] 2001/03/22\n[Last Update] 2014/04/01 01:18:23 (JST)\n\n\n"]}

@ -0,0 +1 @@
{"status": ["Connected (2015/03/31)"], "updated_date": ["2014-04-01T01:10:41"], "nameservers": ["ns1.sphere.ad.jp", "ns2.sphere.ad.jp"], "contacts": {"admin": {"handle": "TY4708JP"}, "tech": {"handle": "YA6489JP"}, "registrant": {"organization": "NTT PC Communications Incorporated"}, "billing": null}, "raw": ["[ JPRS database provides information on network administration. Its use is ]\n[ restricted to network administration purposes. For further information, ]\n[ use 'whois -h whois.jprs.jp help'. To suppress Japanese output, add'/e' ]\n[ at the end of command, e.g. 'whois -h whois.jprs.jp xxx/e'. ]\n[ ]\n[ Notice -------------------------------------------------------------------- ]\n[ JPRS will change JPRS WHOIS (web-based and port 43 Whois service) about the ]\n[ following two points on January 18, 2015. ]\n[ ]\n[ 1) Change of the format of response about gTLD domain name ]\n[ 2) Change of the character encoding ]\n[ ]\n[ For further information, please see the following webpage. ]\n[ http://jprs.jp/whatsnew/notice/2014/20140319-whois.html (only in Japanese) ]\n[ --------------------------------------------------------------------------- ]\n\nDomain Information:\na. [Domain Name] NTTPC.CO.JP\ng. [Organization] NTT PC Communications Incorporated\nl. [Organization Type] Corporation\nm. [Administrative Contact] TY4708JP\nn. [Technical Contact] YA6489JP\np. [Name Server] ns1.sphere.ad.jp\np. [Name Server] ns2.sphere.ad.jp\ns. [Signing Key] \n[State] Connected (2015/03/31)\n[Registered Date] \n[Connected Date] \n[Last Update] 2014/04/01 01:10:41 (JST)\n\n\n"]}

@ -0,0 +1 @@
{"status": ["Connected (2015/03/31)"], "updated_date": ["2014-04-01T01:18:23"], "contacts": {"admin": {"handle": "DL152JP"}, "tech": {"handle": "TW124137JP"}, "registrant": {"organization": "Google Japan"}, "billing": null}, "nameservers": ["ns1.google.com", "ns2.google.com", "ns3.google.com", "ns4.google.com"], "creation_date": ["2001-03-22T00:00:00"], "raw": ["[ JPRS database provides information on network administration. Its use is ]\n[ restricted to network administration purposes. For further information, ]\n[ use 'whois -h whois.jprs.jp help'. To suppress Japanese output, add'/e' ]\n[ at the end of command, e.g. 'whois -h whois.jprs.jp xxx/e'. ]\n[ ]\n[ Notice -------------------------------------------------------------------- ]\n[ JPRS will change JPRS WHOIS (web-based and port 43 Whois service) about the ]\n[ following two points on January 18, 2015. ]\n[ ]\n[ 1) Change of the format of response about gTLD domain name ]\n[ 2) Change of the character encoding ]\n[ ]\n[ For further information, please see the following webpage. ]\n[ http://jprs.jp/whatsnew/notice/2014/20140319-whois.html (only in Japanese) ]\n[ --------------------------------------------------------------------------- ]\n\nDomain Information:\na. [Domain Name] GOOGLE.CO.JP\ng. [Organization] Google Japan\nl. [Organization Type] corporation\nm. [Administrative Contact] DL152JP\nn. [Technical Contact] TW124137JP\np. [Name Server] ns1.google.com\np. [Name Server] ns2.google.com\np. [Name Server] ns3.google.com\np. [Name Server] ns4.google.com\ns. [Signing Key] \n[State] Connected (2015/03/31)\n[Registered Date] 2001/03/22\n[Connected Date] 2001/03/22\n[Last Update] 2014/04/01 01:18:23 (JST)\n\n\n"]}

@ -0,0 +1 @@
{"status": ["Connected (2015/03/31)"], "updated_date": ["2014-04-01T01:10:41"], "nameservers": ["ns1.sphere.ad.jp", "ns2.sphere.ad.jp"], "contacts": {"admin": {"handle": "TY4708JP"}, "tech": {"handle": "YA6489JP"}, "registrant": {"organization": "NTT PC Communications Incorporated"}, "billing": null}, "raw": ["[ JPRS database provides information on network administration. Its use is ]\n[ restricted to network administration purposes. For further information, ]\n[ use 'whois -h whois.jprs.jp help'. To suppress Japanese output, add'/e' ]\n[ at the end of command, e.g. 'whois -h whois.jprs.jp xxx/e'. ]\n[ ]\n[ Notice -------------------------------------------------------------------- ]\n[ JPRS will change JPRS WHOIS (web-based and port 43 Whois service) about the ]\n[ following two points on January 18, 2015. ]\n[ ]\n[ 1) Change of the format of response about gTLD domain name ]\n[ 2) Change of the character encoding ]\n[ ]\n[ For further information, please see the following webpage. ]\n[ http://jprs.jp/whatsnew/notice/2014/20140319-whois.html (only in Japanese) ]\n[ --------------------------------------------------------------------------- ]\n\nDomain Information:\na. [Domain Name] NTTPC.CO.JP\ng. [Organization] NTT PC Communications Incorporated\nl. [Organization Type] Corporation\nm. [Administrative Contact] TY4708JP\nn. [Technical Contact] YA6489JP\np. [Name Server] ns1.sphere.ad.jp\np. [Name Server] ns2.sphere.ad.jp\ns. [Signing Key] \n[State] Connected (2015/03/31)\n[Registered Date] \n[Connected Date] \n[Last Update] 2014/04/01 01:10:41 (JST)\n\n\n"]}
Loading…
Cancel
Save