2008-09-08 6 views
8

J'essaie de faire fonctionner un service Web qui nécessite de vérifier les bases de données whois. Ce que je fais en ce moment est moche et j'aimerais l'éviter autant que possible: j'appelle gwhois command et j'analyse sa sortie. Laid.Quelle méthode Python suggéreriez-vous pour vérifier les enregistrements de base de données whois?

J'ai fait quelques recherches pour essayer de trouver une façon pythonique de faire cette tâche. Généralement je n'ai presque rien - this old discussion list link a un moyen de vérifier si le domaine existe. Ce n'est pas ce que je cherchais ... Mais encore, c'était la meilleure réponse que Google m'ait donnée - tout le reste n'est qu'un tas de questions non résolues.

Vous avez réussi à faire fonctionner une méthode? J'apprécierais beaucoup quelques conseils, ou devrais-je juste le faire de la manière d'opensource, asseyez-vous et codez quelque chose par moi-même? :)

Répondre

5

Il n'y a rien de mal à utiliser un utilitaire de ligne de commande pour faire ce que vous voulez. Si vous mettez une bonne enveloppe autour du service, vous pouvez implémenter les internes comme vous le voulez! Par exemple:

class Whois(object): 
    _whois_by_query_cache = {} 

    def __init__(self, query): 
     """Initializes the instance variables to defaults. See :meth:`lookup` 
     for details on how to submit the query.""" 
     self.query = query 
     self.domain = None 
     # ... other fields. 

    def lookup(self): 
     """Submits the `whois` query and stores results internally.""" 
     # ... implementation 

Maintenant, si vous lancez votre propre en utilisant urllib, enrouler autour d'un utilitaire de ligne de commande (comme vous faites), ou d'importer une bibliothèque tierce partie et l'utiliser (comme you're saying), cette interface reste la même.

Cette approche n'est généralement pas considérée comme laide du tout - parfois les utilitaires de commande font ce que vous voulez et vous devriez être en mesure de les utiliser. Si la vitesse finit par devenir un goulot d'étranglement, votre abstraction rend le processus de passage à une implémentation Python native transparent pour votre code client.

Practicality beats purity - c'est ce qui est Pythonic. :)

+0

Ouais, je sais.Mais, en utilisant trop d'outils système et en construisant des wrappers autour d'eux, il devient plus difficile, disons, de migrer l'application vers un autre système ... Mais je suppose que je m'en tiendrai à ce que j'ai maintenant, si ça marche;) – kender

+3

bonne barrière d'abstraction, vous pouvez l'appliquer à chaque fois que c'est pratique! "Maintenant vaut mieux que jamais, Bien que jamais ne soit meilleur que * maintenant *." :) – cdleary

+1

@kender: c'est plus simple! Il suffit de passer les internes de gwhois à Xwhois. Si vous souhaitez également conserver l'ancienne implémentation, vous pouvez étendre l'ancienne classe et simplement remplacer la méthode de recherche par exemple. – hopla

0

Une autre façon de le faire est d'utiliser le module urllib2 pour analyser le service whois d'une autre page (de nombreux sites similaires existent). Mais cela ressemble encore plus à un hack que ce que vous faites maintenant, et vous donnerait une dépendance sur n'importe quel site whois que vous avez choisi, ce qui est mauvais. Je déteste le dire, mais à moins que vous ne souhaitiez ré-implémenter whois dans votre programme (qui serait en train de réinventer la roue), en exécutant whois sur le système d'exploitation et en analysant la sortie (c'est-à-dire ce que vous faites maintenant) semble être la bonne façon de le faire.

+0

non, vous ne devriez pas exécuter la commande whois de votre programme . Whois est un protocole très simple à implémenter, il suffit d'ouvrir une socket TCP sur le port 43 et de lire RFC3912. –

0

Parsing une autre page Web woulnd't être aussi mauvais (en supposant leur html woulnd't être très mauvais), mais il serait en fait me lier à eux - si elles sont en bas, je suis en bas :)

En fait, j'ai trouvé un vieux projet sur sourceforge: rwhois.py. Ce qui m'effraie un peu c'est que leur dernière mise à jour date de 2003. Mais, ça peut sembler un bon point de départ pour réimplémenter ce que je fais en ce moment ... Eh bien, je me suis senti obligé de poster le lien sur ce projet pour plus de référence.

+0

Eh bien, ce qui a vraiment changé au sujet de whois au cours des 5 dernières années. Je me risquerais à deviner "pas grand chose". Je pense toujours que tu ré-invente la roue. Ma réponse idéale est: utilisez ce qui fonctionne pour vous maintenant, à moins que vous ne perceviez un réel problème avec. –

1

Je ne sais pas si gwhois fait quelque chose de spécial avec la sortie du serveur; cependant, vous pouvez simplement vous connecter au serveur whois sur le port whois (43), envoyer votre requête, lire toutes les données dans la réponse et les analyser. Pour rendre la vie un peu plus facile, vous pouvez utiliser la classe telnetlib.Telnet (même si le protocole whois est beaucoup plus simple que le protocole telnet) au lieu de simples sockets.

Les parties délicates:

  • quel serveur whois vous demandera?RIPE, ARIN, APNIC, LACNIC, AFRINIC, JPNIC, VERIO etc LACNIC pourrait être un repli utile, car ils ont tendance à répondre avec des données utiles aux demandes en dehors de leur domaine.
  • Quelles sont les options et les arguments exacts pour chaque serveur whois? certains offrent de l'aide, d'autres non. En général, les noms de domaine simples fonctionnent sans aucune option spéciale.
+0

problème réel n'est pas dans l'interrogation des serveurs, mais l'analyse de leurs sorties. Malheureusement, ce qu'ils retournent le format change beaucoup entre les serveurs. L'une des lignes, l'heure d'expiration, peut ressembler à: Date d'expiration: 05-Sep-2009 15:24:49 UTC ou Expire le: 26-Dec-14 ou, certains serveurs ne donnent pas cela du tout. – kender

+0

Ils font tous deux partie du problème. Dans mon cas, il était assez difficile de trouver le serveur whois correct (faisant autorité) dans tous les cas. L'analyse des données n'était pas aussi difficile, car nous étions essentiellement intéressés par les sous-réseaux parents, donc avec un peu d'essais et d'erreurs, nous avons terminé. Je ne peux pas fournir de code, désolé. – tzot

0
import socket 
socket.gethostbyname_ex('url.com') 

si elle retourne un gaierror vous savez savez ce n'est pas inscrit tout DNS

+1

-1 = Faire une requête DNS n'est pas la même chose qu'une requête whois –

0

est ici une solution prête à l'emploi qui fonctionne pour moi; écrit pour Python 3.1 (lors du backporting vers Py2.x, attention aux différences entre les octets et le texte Unicode). votre seul point d'accès est la méthode DRWHO.whois(), qui s'attend à ce qu'un nom de domaine soit transmis; il essaiera alors de résoudre le nom en utilisant le fournisseur configuré comme DRWHO.whois_providers[ '*' ] (une solution plus complète pourrait différencier les fournisseurs selon le domaine de premier niveau). DRWHO.whois() retournera un dictionnaire avec une seule entrée text, qui contient le texte de réponse renvoyé par le serveur WHOIS. Encore une fois, une solution plus complète essaierait alors d'analyser le texte (qui doit être fait séparément pour chaque fournisseur, car il n'y a pas de format standard) et renverrait un format plus structuré (par exemple, un flag available qui spécifie si le domaine semble disponible). s'amuser!

########################################################################## 
import asyncore as         _sys_asyncore 
from asyncore import loop as       _sys_asyncore_loop 
import socket as          _sys_socket 



########################################################################## 
class _Whois_request(_sys_asyncore.dispatcher_with_send, object): 
    # simple whois requester 
    # original code by Frederik Lundh 

    #----------------------------------------------------------------------- 
    whoisPort = 43 

    #----------------------------------------------------------------------- 
    def __init__(self, consumer, host, provider): 
    _sys_asyncore.dispatcher_with_send.__init__(self) 
    self.consumer = consumer 
    self.query = host 
    self.create_socket(_sys_socket.AF_INET, _sys_socket.SOCK_STREAM) 
    self.connect((provider, self.whoisPort,)) 

    #----------------------------------------------------------------------- 
    def handle_connect(self): 
    self.send(bytes('%s\r\n' % (self.query,), 'utf-8')) 

    #----------------------------------------------------------------------- 
    def handle_expt(self): 
    self.close() # connection failed, shutdown 
    self.consumer.abort() 

    #----------------------------------------------------------------------- 
    def handle_read(self): 
    # get data from server 
    self.consumer.feed(self.recv(2048)) 

    #----------------------------------------------------------------------- 
    def handle_close(self): 
    self.close() 
    self.consumer.close() 


########################################################################## 
class _Whois_consumer(object): 
    # original code by Frederik Lundh 

    #----------------------------------------------------------------------- 
    def __init__(self, host, provider, result): 
    self.texts_as_bytes = [] 
    self.host   = host 
    self.provider  = provider 
    self.result   = result 

    #----------------------------------------------------------------------- 
    def feed(self, text): 
    self.texts_as_bytes.append(text.strip()) 

    #----------------------------------------------------------------------- 
    def abort(self): 
    del self.texts_as_bytes[:] 
    self.finalize() 

    #----------------------------------------------------------------------- 
    def close(self): 
    self.finalize() 

    #----------------------------------------------------------------------- 
    def finalize(self): 
    # join bytestrings and decode them (witha a guessed encoding): 
    text_as_bytes   = b'\n'.join(self.texts_as_bytes) 
    self.result[ 'text' ] = text_as_bytes.decode('utf-8') 


########################################################################## 
class DRWHO: 

    #----------------------------------------------------------------------- 
    whois_providers = { 
    '~isa': 'DRWHO/whois-providers', 
    '*':  'whois.opensrs.net', } 

    #----------------------------------------------------------------------- 
    def whois(self, domain): 
    R   = {} 
    provider = self._get_whois_provider('*') 
    self._fetch_whois(provider, domain, R) 
    return R 

    #----------------------------------------------------------------------- 
    def _get_whois_provider(self, top_level_domain): 
    providers = self.whois_providers 
    R   = providers.get(top_level_domain, None) 
    if R is None: 
     R = providers[ '*' ] 
    return R 

    #----------------------------------------------------------------------- 
    def _fetch_whois(self, provider, domain, pod): 
    #..................................................................... 
    consumer = _Whois_consumer(   domain, provider, pod) 
    request = _Whois_request( consumer, domain, provider) 
    #..................................................................... 
    _sys_asyncore_loop() # loops until requests have been processed 


#========================================================================= 
DRWHO = DRWHO() 


domain = 'example.com' 
whois  = DRWHO.whois(domain) 
print(whois[ 'text' ]) 
8

Regardez ceci: http://code.google.com/p/pywhois/

pywhois - Module Python pour récupérer des informations WHOIS de domaines

Objectif: - Créer un module simple Python importable qui produira des données WHOIS analysées pour une donnée domaine. - Capable d'extraire des données pour tous les TLD populaires (com, org, net, ...) - Interrogez directement un serveur WHOIS au lieu de passer par un service Web intermédiaire comme le font beaucoup d'autres. - Fonctionne avec Python 2.4+ et aucune dépendance externe

Exemple:

>>> import pywhois 
>>> w = pywhois.whois('google.com') 
>>> w.expiration_date 
['14-sep-2011'] 
>>> w.emails 
['[email protected]', 
'[email protected]', 
'[email protected]', 
'[email protected]'] 
>>> print w 
... 
+0

Peut-elle être installée avec pip? Il y a un paquet pywhois 0.1 mais cela ne semble pas être la même chose. – samwize

+0

@samwize (et d'autres voulant le savoir) voir: http://stackoverflow.com/questions/11578943/error-when-using-pywhois –

6

cette question trouvé le processus de ma propre recherche une bibliothèque de whois python.

Je ne sais pas que je suis d'accord avec la réponse de cdleary qu'utiliser une bibliothèque qui enveloppe une commande est toujours la meilleure voie à suivre - mais je peux voir ses raisons pour lesquelles il l'a dit.

Pro: gère whois cmd-ligne tout le travail dur (appels socket, analyse syntaxique, etc.)

Con: non portable; Le module peut ne pas fonctionner en fonction de la commande whois sous-jacente. Plus lent, car il exécute une commande et probablement un shell en plus de la commande whois. affectés sinon UNIX (Windows), différents UNIX, ancien UNIX ou whois plus

Je cherche un module whois qui peut gérer les recherches IP whois et je ne suis pas intéressé à coder mon propre client whois.

Voici les modules que je (légèrement) essayées et plus d'informations à ce sujet:

pywhoisapi:

  • Accueil: http://code.google.com/p/pywhoisapi/
  • Conception: client REST accès ARIN Service whois REST
  • Avantages: Capable de gérer les recherches d'adresses IP
  • Contre: Peut-il extraire des informations des serveurs whois des autres RIR?

BulkWhois

  • Accueil: http://pypi.python.org/pypi/BulkWhois/0.2.1
  • Conception: client telnet accéder à l'interface de requête telnet whois de RIR
  • Plus (?): Capable de gérer la recherche d'adresses IP
  • Inconvénients: Capable extraire des informations des serveurs whois des autres RIR?

pywhois:

  • Accueil: http://code.google.com/p/pywhois/
  • Conception: client REST accès RRID services whois
  • Avantages: Accessses beaucoup RRIDs; a branche 3.x python
  • Contre: ne semble pas gérer la recherche d'adresses IP

python-whois:

whoisclient - fourche-whois python

  • Accueil: http://gitorious.org/python-whois
  • Conception: enveloppements commande "whois"
  • dépend: IPy.py
  • Inconvénients: ne semble pas gérer la recherche d'adresses IP

Mise à jour: Je fini par utiliser pywhoisapi pour les recherches IP inverse que je faisais

Questions connexes