2008-09-08 21 views
8

Estoy intentando poner en marcha un servicio web que realmente requiere comprobar las bases de datos de whois. Lo que estoy haciendo ahora es feo y me gustaría evitarlo tanto como pueda: llamo al comando gwhois y analizo su salida. Feo.¿Qué forma de Python sugeriría para verificar los registros de la base de datos whois?

Hice una búsqueda para tratar de encontrar una manera pitónica para hacer esta tarea. En general, no obtuve casi nada: this old discussion list link tiene una forma de verificar si el dominio existe. No es lo que estaba buscando ... Pero aun así, fue lo mejor que Google me dio, todo lo demás es solo un montón de preguntas sin respuesta.

¿Alguno de ustedes ha logrado poner en marcha algún método? Apreciaría mucho algunos consejos, ¿o debería simplemente hacerlo de manera opensource, sentarse y codificar algo solo? :)

Respuesta

5

No hay nada de malo en utilizar una utilidad de línea de comandos para hacer lo que desee. Si pone un buen envoltorio alrededor del servicio, ¡puede implementar las partes internas como quiera! Por ejemplo:

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 

Ahora, si está o no rodar su propio uso de urllib, envolver alrededor de una utilidad de línea de comandos (como lo está haciendo), o importar una biblioteca de terceros y el uso que (como you're saying), esta interfaz se mantiene igual.

Este enfoque generalmente no se considera feo en absoluto - a veces las utilidades de comandos hacen lo que usted desea y usted debe poder aprovecharlas. Si la velocidad termina siendo un cuello de botella, su abstracción hace que el proceso de cambio a una implementación nativa de Python sea transparente para su código de cliente.

Practicality beats purity - eso es lo que es Pythonic. :)

+0

Sí, lo sé.Pero, usar demasiadas herramientas del sistema y crear envoltorios a su alrededor hace que sea más difícil, por ejemplo, migrar la aplicación a otro sistema ... Pero creo que me atengo a lo que obtuve ahora, si funciona;) – kender

+3

Con un una buena barrera de abstracción, ¡puedes implementarla siempre que sea conveniente! "Ahora es mejor que nunca, aunque nunca es mejor que * en este momento *". :) – cdleary

+1

@kender: ¡lo hace más fácil! Solo tienes que cambiar las partes internas de gwhois a Xwhois. Si también desea mantener la implementación anterior, puede ampliar la clase anterior y anular, por ejemplo, el método de búsqueda. – hopla

0

Otra forma de hacerlo es usar el módulo urllib2 para analizar el servicio whois de otra página (existen muchos sitios como este). Pero eso parece mucho más un hack que lo que haces ahora, y te daría una dependencia en cualquier sitio whois que elijas, lo cual es malo.

me gusta decirlo, pero a menos que desee volver a implementar whois en su programa (que se re-inventar la rueda), corriendo whois en el sistema operativo y analizando la salida (es decir, lo que está haciendo ahora) parece ser la forma correcta de hacerlo.

+0

No, no debería ejecutar el comando whois desde su programa . Whois es un protocolo muy simple de implementar, solo abre un socket TCP al puerto 43 y lee RFC3912. –

0

Analizar otra página web woulnd't ser tan malo (asumiendo su html woulnd't ser muy malo), pero en realidad me ataría a ellos - si es que están abajo, estoy abajo :)

De hecho, encontré un viejo proyecto en sourceforge: rwhois.py. Lo que me asusta un poco es que su última actualización es de 2003. Pero, podría parecer un buen lugar para comenzar la reimplementación de lo que hago ahora ... Bueno, me sentí obligado a publicar el enlace a este proyecto de todos modos, solo para mayor referencia.

+0

Bueno, lo que realmente ha cambiado sobre los whois en los últimos 5 años. Me atrevería a adivinar "no mucho". Sigo pensando que estás reinventando la rueda. Mi respuesta ideal es: use lo que funciona para usted ahora a menos que perciba un problema real con él. –

1

No sé si gwhois hace algo especial con la salida del servidor; sin embargo, puede conectarse al servidor Whois en el puerto whois (43), enviar su consulta, leer todos los datos en la respuesta y analizarlos. Para hacer la vida un poco más fácil, puede usar la clase telnetlib.Telnet (incluso si el protocolo whois es mucho más simple que el protocolo telnet) en lugar de los sockets simples.

Las partes difíciles:

  • qué servidor whois le pide?RIPE, ARIN, APNIC, LACNIC, AFRINIC, JPNIC, VERIO, etc. LACNIC podría ser una alternativa útil, ya que tienden a responder con datos útiles a solicitudes fuera de su dominio.
  • ¿Cuáles son las opciones y argumentos exactos para cada servidor whois? algunos ofrecen ayuda, otros no. En general, los nombres de dominio sin formato funcionan sin ninguna opción especial.
+0

problema real no está en la consulta de servidores, sino en el análisis de sus resultados. lamentablemente, lo que devuelven el formato cambia mucho entre los servidores. Una de las líneas, el tiempo de caducidad, puede verse como: Fecha de vencimiento: 05-Sep-2009 15:24:49 GMT o Expira el: 26-Dic-14 o , algunos servidores no da para eso en absoluto. – kender

+0

Ambos son parte del problema. En mi caso, fue bastante difícil encontrar el servidor whois correcto (autorizado) en todos los casos. Analizar los datos no fue tan difícil, ya que estábamos interesados ​​básicamente en las subredes principales, por lo que con un poco de prueba y error ya terminamos. No puedo proporcionar el código, sin embargo, lo siento. – tzot

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

si se devuelve un gaierror sabes sé que no es registrado en cualquier DNS

+1

-1 = Hacer una consulta DNS no es lo mismo que una consulta whois –

0

aquí es una solución lista para usar que funciona para mí; escrito para Python 3.1 (cuando backporting a Py2.x, tenga especial cuidado de los bytes/distinciones de texto Unicode). su único punto de acceso es el método DRWHO.whois(), que espera que se pase un nombre de dominio; A continuación, intentará resolver el nombre utilizando el proveedor configurado como DRWHO.whois_providers[ '*' ] (una solución más completa podría diferenciar a los proveedores según el dominio de nivel superior). DRWHO.whois() devolverá un diccionario con una sola entrada text, que contiene el texto de respuesta enviado por el servidor WHOIS. De nuevo, una solución más completa intentará analizar el texto (que debe hacerse por separado para cada proveedor, ya que no hay un formato estándar) y devolverá un formato más estructurado (por ejemplo, establecer un indicador available que especifique si el dominio parece disponible). ¡que te diviertas!

########################################################################## 
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

vistazo a esto: http://code.google.com/p/pywhois/

pywhois - módulo de Python para recuperar la información de WHOIS de dominios

Objetivo: - Crear un módulo de Python importables sencilla que producirá analizado los datos de WHOIS para un determinado dominio. - Capaz de extraer datos para todos los TLD populares (com, org, net, ...) - Consulta directamente un servidor WHOIS en lugar de pasar por un servicio web intermedio como lo hacen muchos otros. - Funciona con Python 2.4+ y sin dependencias externas

Ejemplo:

>>> 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

¿Se puede instalar esto con pip? Hay un paquete pywhois 0.1 pero parece que no es lo mismo. – samwize

+0

@samwize (y otros que quieran saber esto) ver: http://stackoverflow.com/questions/11578943/error-when-using-pywhois –

6

Encontrado esta pregunta en el proceso de mi propia buscar una biblioteca whois de python

No sé si estoy de acuerdo con la respuesta de cdleary que usar una biblioteca que envuelve un comando siempre es la mejor opción, pero puedo ver sus razones por las que dijo esto.

Pro: cmd línea whois se encarga de todo el trabajo duro (llamadas de socket, análisis, etc.)

En contra: no es portátil; el módulo puede no funcionar según el comando whois subyacente. Más lento, ya que ejecutar un comando y muy probablemente shell además del comando whois. afectado si no UNIX (Windows), diferente UNIX, mayores UNIX o mayores comando whois

Busco a un módulo de whois que puede manejar búsquedas de IP whois y no estoy interesado en la codificación de mi propio cliente whois.

Éstos son los módulos que I (ligera) probé y más información al respecto:

pywhoisapi:

  • Inicio: http://code.google.com/p/pywhoisapi/
  • Diseño: El cliente REST para acceder a ARIN servicio REST whois
  • Beneficios: Capaz de manejar las búsquedas de direcciones IP
  • Contras: ¿Se puede obtener información de los servidores whois de otros RIR?

BulkWhois

  • Inicio: http://pypi.python.org/pypi/BulkWhois/0.2.1
  • Diseño: cliente Telnet para acceder a la interfaz de consulta telnet whois del RIR
  • Pros (?): Capaz de manejar la búsqueda de direcciones IP
  • Contras: Capaz para obtener información de los servidores whois de otros RIR?

pywhois:

  • Inicio: http://code.google.com/p/pywhois/
  • Diseño: RESTO cliente acceden a los servicios whois RRID
  • Pros: Accessses muchos RRIDs; tiene pitón rama 3.x
  • Contras: no parece para manejar búsquedas de direcciones IP

pitón-whois:

whoisclient - tenedor de pitón-whois

Actualización: terminé usando pywhoisapi para las búsquedas IP inversas que estaba haciendo

Cuestiones relacionadas