import json import time import urllib.request response = urllib.request.urlopen('https://as286.net/data/ana-invalids.txt') raw_invalids_list = response.read().decode("utf-8") problematic_asns = {} for line in raw_invalids_list.splitlines(): if 'altpfx=NONE' in line or 'altpfx=PARTIAL' in line: prefix, asn_raw, everything_else = line.split(';', 2) # TODO tackle case where a prefix is coming from several AS# if 'srcASes' in asn_raw: continue asn = int(asn_raw.replace('srcAS=', '')) if asn in problematic_asns: if prefix not in problematic_asns[asn]['prefixes']: problematic_asns[asn]['prefixes'].append(prefix) else: problematic_asns[asn] = {} problematic_asns[asn]['prefixes'] = [prefix] print(len(problematic_asns)) no_noc_or_abuse = 0 no_noc = 0 http_error = 0 for asn, data in problematic_asns.items(): # To not hammer the API time.sleep(1) email = '' try: with urllib.request.urlopen("https://stat.ripe.net/data/whois/data.json?resource=" + str(asn)) as url: raw_whois = json.loads(url.read().decode()) for records in raw_whois['data']['records']: for contacts in records: if contacts['key'] == 'OrgNOCEmail': email = contacts['value'] break if email: break if not email: no_noc += 1 with urllib.request.urlopen("https://stat.ripe.net/data/abuse-contact-finder/data.json?resource=" + str(asn)) as url: raw_abuse = json.loads(url.read().decode()) try: email = raw_abuse['data']['anti_abuse_contacts']['abuse_c'][0]['email'] except (IndexError, KeyError): print("Can't find NOC or Abuse contact for AS" + str(asn)) no_noc_or_abuse += 1 problematic_asns[asn]['email'] = email except urllib.error.HTTPError as e: print('Error while fetching AS' + str(asn) + ' ' + str(e)) http_error += 1 print(no_noc_or_abuse) print(no_noc) print(http_error)