OK, wydaje się to, że powinno być naprawdę proste, ale jestem trochę zdezorientowany:

Mam dwie wartości - domena i IP najlepiej opisany kodem:

        whois_result = Popen(['whois', str(domain)], stdout=PIPE,stderr=STDOUT).communicate()[0]
        debug_output(whois_result)
        if 'Not found' or 'No entries' in whois_result:
                print "Processing whois failure on '%s'" % str(domain)
                print "Trying the IP (%s) instead..." % ip
                whois_result = Popen(['whois', ip], stdout=PIPE,stderr=STDOUT).communicate()[0]
                debug_output(whois_result)
                if 'Not found' or 'No entries' in whois_result:
                        print "complete and utter whois failure, its you isnt it, not me."
                        return False
                else:
                        test = re.search("country.+([A-Z].)",whois_result)
                        countryid = test.group(1)

Ta funkcja sprawdza domenę Whois, jeśli to nie znajdzie, próbuje tego, co się staje, whois z adresem IP, ale to, co chcę wiedzieć, jest to, co jest najlepszym sposobem sprawdzenia, czy domena jest równa żadna nie martwić się o kontrolę domeny I przejdź do kontroli IP, ale także jeśli domena nie jest równa żadna, wykonaj kontrolę domeny, a następnie sprawdzić IP w tej kolejności. Przepraszam, jeśli jest to proste, ma to trochę zdezorientowane. Chyba mogłem na to ustawić zmienną i testować, ale czy istnieje bardziej elegancki sposób na to?

Jeśli umieściłem na najwyższym

if domain != None:

Jedynym sposobem na to wydaje się, że mogę to zrobić, powtarzając kod lub ustawienie zmiennej, myślę, że musi istnieć inne testy warunkowe, których mogłem użyć, o czym nie wiem.

Edytuj: Aktualizuj 2 Na podstawie odpowiedzi poniżej: - Ive również umieścić kod sprawdzania kraju z moją bazą danych.

def do_whois(data):
        if data is not None: return Popen(['whois', str(data)], stdout=PIPE,stderr=STDOUT).communicate()[0]
        return 'No entries'

def check_whois(data):
        conn = sqlite3.connect(db_name)
        cursor = conn.cursor()

        if 'No entries' in data or 'Not found' in data or 'No match for' in data:return False
        id = re.search("country.+([A-Z].)",data)
        if id is None:
                print "we didnt get nuttin from whois"
                return False
        countryid = id.group(1) 
        # fetch country from countrycode db
        cursor.execute("SELECT country,countrycode FROM countries WHERE countrycode = ?",(countryid,))
        country = cursor.fetchone()
        country = country[0]
        print "Server is from: " + country
        return (country,countryid)       

def find_country(domain, ip):
        return check_whois(do_whois(domain)) or check_whois(do_whois(ip))

Częścią problemu z tworzeniem tego solidnego jest różne wartości zwracane przez serwer Whois, np. Dla tego IP: 67.222.137.216

Powraca whois Server:

@ : whois 67.222.137.216
#
# Query terms are ambiguous.  The query is assumed to be:
#     "n 67.222.137.216"
#
# Use "?" to get help.
#

#
# The following results may also be obtained via:
# http://whois.arin.net/rest/nets;q=67.222.137.216?showDetails=true&showARIN=false&ext=netref2
#

BLUESQUAREDATAVPSLLC BLUESQUAREDATAVPSLLCNET (NET-67-222-137-213-1) 67.222.137.213 - 67.222.137.244
DFW Datacenter DFW-DATACENTER (NET-67-222-128-0-1) 67.222.128.0 - 67.222.159.255


#
# ARIN WHOIS data and services are subject to the Terms of Use
# available at: https://www.arin.net/whois_tou.html
#

Dzięki za wszelką pomoc.

1
user1064306 28 listopad 2011, 19:23

3 odpowiedzi

Najlepsza odpowiedź

Spróbuj tego

def do_whois(data):
    if data: return Popen(['whois', str(data)], stdout=PIPE,stderr=STDOUT).communicate()[0]
    return 'No entries'

def check_whois(data):
    if 'No entries' in data or 'Not found' in data:return False
    test = re.search("country.+([A-Z].)",whois_result)
    return test.group(1)

def find_whois(domain, ip):
    return check_whois(do_whois(domain)) or check_whois(do_whois(ip))
1
spicavigo 28 listopad 2011, 15:43

To nie zadziała:

if 'Not found' or 'No entries' in whois_result:

Jest to interpretowane jako if ('Not found') or ('No entries' in whois_result), które zawsze zwraca prawdziwe.

Odpowiedzieć na Twoje pytanie:

if domain != None && domain != 1:

-edytować-

Jeśli masz na myśli None zamiast "One", należy po prostu umieścić kod sprawdzania IP (który ma być wykonany po sprawdzeniu domeny) na tym samym poziomie wcięcia, co sprawdzenie domeny.

0
Tom van der Woerdt 28 listopad 2011, 15:28

Ten warunek jest nieprawidłowy:

if 'Not found' or 'No entries' in whois_result:

Zawsze będzie oceniona jako "true", ponieważ wyrażenie 'Not found' or 'No entries' in whois_result zawsze powróci 'Not found'.

Musisz zmienić oświadczenie IF:

if 'Not found' in whois_result or 'No entries' in whois_result:
0
Some programmer dude 28 listopad 2011, 15:40