#!/usr/bin/env python # # IP to location translation using a few online data providers. # # Nasko Oskov # import sys import urllib from xml.dom import minidom # # Print a node from DOM in the format: # nodeName: nodeValue # while allowing flexible spacing between the two # and caller specified node name # def print_node(node, spaces=0, name=""): separator = "" for k in range(1, spaces): separator += " " try: if name == "": name = node.nodeName value = node.childNodes[0].nodeValue.strip() print name + ":" + separator + "\t" + value except: value = "" def get_from_blogama(ipaddress): url = "http://blogama.org/ip_query.php?output=xml&ip=" rawData = "" try: rawData = urllib.urlopen(url + ipaddress).read() dom = minidom.parseString(rawData) print_blogama(dom) except: print "Couldn't parse dmw output" print rawData return def print_blogama(dom): # # # 208.80.195.34 # OK # US # United States # CA # California # San Diego # 92121 # 32.9014 # -117.208 # print_node(dom.getElementsByTagName("Ip").item(0), 8) print_node(dom.getElementsByTagName("City").item(0), 4) try: region = dom.getElementsByTagName("RegionName").item(0) regionCode = dom.getElementsByTagName("RegionCode").item(0) print region.nodeName + ":\t" + region.childNodes[0].nodeValue + " (" + regionCode.childNodes[0].nodeValue + ")" except: print region.nodeName + ":" try: country = dom.getElementsByTagName("CountryName").item(0) countryCode = dom.getElementsByTagName("CountryCode").item(0) print country.nodeName + ":\t" + country.childNodes[0].nodeValue + " (" + countryCode.childNodes[0].nodeValue + ")" except: print country.nodeName + ":" print_node(dom.getElementsByTagName("ZipPostalCode").item(0)) print_node(dom.getElementsByTagName("Latitude").item(0)) print_node(dom.getElementsByTagName("Longitude").item(0)) def get_from_dmw(ipaddress): url = "http://geoip.dmwtechnologies.com/api.php?apikey=dmwd8cd98f99b204e9800998ecf8427eda0c5ab4fa2b60b93876b470bfafc7e44a8a66a2a35fdaec18cb1af7e6540f09&ip=" rawData = "" try: rawData = urllib.urlopen(url + ipaddress).read() dom = minidom.parseString(rawData) print_dmw(dom) except: print "Couldn't parse dmw output" print rawData return def print_dmw(dom): #208.80.195.34 #United States #.http://geoip.dmwtechnologies.com/flags/us.gif #.Washington #.US #California #San Diego #.32.9014 #.-117.2079 #.NA #.NA #.NA #.+1 #.Dollar #.1 USD = 1 USD #.1 USD = 1 USD # 10:49 AM PDT #63.1 F Mostly Cloudy #.This is a demo account exclusively for www.phpclasses.org. #8 #22 print_node(dom.getElementsByTagName("IpAddress").item(0), 8) print_node(dom.getElementsByTagName("CityName").item(0), 8) print_node(dom.getElementsByTagName("RegionName").item(0), 8) print_node(dom.getElementsByTagName("CountryName").item(0), 8) print_node(dom.getElementsByTagName("LocalTime").item(0), 8) print_node(dom.getElementsByTagName("CurrentTemperature").item(0)) print_node(dom.getElementsByTagName("TotalRequestsMade").item(0)) print_node(dom.getElementsByTagName("RemainingRequests").item(0)) def get_from_infosniper(ipaddress): url = "http://www.infosniper.net//xml.php?lang=1&ip_address=" rawData = "" try: rawData = urllib.urlopen(url + ipaddress).read() dom = minidom.parseString(rawData) print_infosniper(dom) except: print "Couldn't parse infosniper output" print rawData return def print_infosniper(dom): # # # # 80.137.230.29 # p5089e61d.dip.t-dialin.net # Deutsche Telekom Germany # Germany # de # http://www.infosniper.net/country_flags/de.gif # Nordrhein-Westfalen # Aachen # n/a # n/a # .n/a # 50.7708 # 6.1053 # 37 # # print_node(dom.getElementsByTagName("ipaddress").item(0), 0, "IpAddress") print_node(dom.getElementsByTagName("hostname").item(0), 0, "Hostname") print_node(dom.getElementsByTagName("provider").item(0), 0, "Provider") print_node(dom.getElementsByTagName("city").item(0), 4, "City") print_node(dom.getElementsByTagName("state").item(0), 4, "State") try: country = dom.getElementsByTagName("country").item(0) countryCode = dom.getElementsByTagName("countrycode").item(0) print country.nodeName + ":\t" + country.childNodes[0].nodeValue + " (" + countryCode.childNodes[0].nodeValue + ")" except: print country.nodeName + ":" print_node(dom.getElementsByTagName("areacode").item(0), 0, "AreaCode") print_node(dom.getElementsByTagName("postalcode").item(0), 0, "PostalCode") print_node(dom.getElementsByTagName("latitude").item(0), 0, "Latitude") print_node(dom.getElementsByTagName("longitude").item(0), 0, "Longitude") print_node(dom.getElementsByTagName("queries").item(0), 0, "Queries") def get_from_geoplugin(ipaddress): url = "http://www.geoplugin.net/xml.gp?ip=" rawData = "" try: rawData = urllib.urlopen(url + ipaddress).read() dom = minidom.parseString(rawData) print "IP Address:\t" + ipaddress print_geoplugin(dom) except: print "Couldn't parse infosniper output" print rawData return def print_geoplugin(dom): # # # Redmond # WA # 425 # 819 # US # United States # NA # 47.670601 # -122.068497 # USD # $ # 1 # print_node(dom.getElementsByTagName("geoplugin_city").item(0), 4, "City") print_node(dom.getElementsByTagName("geoplugin_region").item(0), 4, "State") try: country = dom.getElementsByTagName("geoplugin_countryName").item(0) countryCode = dom.getElementsByTagName("geoplugin_countryCode").item(0) print "Country:\t" + country.childNodes[0].nodeValue + " (" + countryCode.childNodes[0].nodeValue + ")" except: print country.nodeName + ":" print_node(dom.getElementsByTagName("geoplugin_areaCode").item(0), 0, "AreaCode") print_node(dom.getElementsByTagName("geoplugin_dmaCode").item(0), 0, "DmaCode") print_node(dom.getElementsByTagName("geoplugin_continentCode").item(0), 0, "Continent") print_node(dom.getElementsByTagName("geoplugin_latitude").item(0), 0, "Latitude") print_node(dom.getElementsByTagName("geoplugin_longitude").item(0), 0, "Longitude") print_node(dom.getElementsByTagName("geoplugin_currencyCode").item(0), 0, "Currency") print_node(dom.getElementsByTagName("geoplugin_currencyConverter").item(0), 0, "Currency Conv") def get_from_hostip(ipaddress): url = "http://api.hostip.info/get_html.php?position=true&ip=" + ipaddress #Country: UNITED STATES (US) #City: San Diego, CA #Latitude: 32.8149 #Longitude: -117.136 print urllib.urlopen(url).read() # Those will be the providers we query providers = {} # The optional ones have some limit per day, so don't # invoke them by default optional = { "dmw" : get_from_dmw, "infosniper" : get_from_infosniper, } # Default information providers default = { "geoplugin" : get_from_geoplugin, "blogama" : get_from_blogama, "hostip" : get_from_hostip, } # If there are explicit providers on the command line, # execute them or enable the "all" keyword if len(sys.argv) > 2: if sys.argv[2] == "all": providers.update(default) providers.update(optional) else: for arg in sys.argv: if optional.has_key(arg): func = optional[arg] elif default.has_key(arg): func = default[arg] else: func = "" if callable(func): providers[arg] = func # if we have no providers, but at least an IP, use the defaults elif len(sys.argv) == 2: providers = default # list all providers else: print "Default providers:" for key, value in default.iteritems(): print "\t" + key print "Optional providers:" for key, value in optional.iteritems(): print "\t" + key sys.exit() # loop through all the providers querying each of them if __name__ == '__main__': # execute only if we are ran as script ip = sys.argv[1] for prov, func in providers.iteritems(): try: print "===(" + prov + ")===" func(ip) except: print "Failed in " + prov sys.exc_info()