ما هي طريقة بايثون التي تقترحها للتحقق من سجلات قاعدة بيانات whois؟

StackOverflow https://stackoverflow.com/questions/50394

  •  09-06-2019
  •  | 
  •  

سؤال

أحاول تشغيل خدمة ويب تتطلب في الواقع التحقق من قواعد بيانات WHOIS.ما أفعله الآن قبيح وأريد تجنبه قدر الإمكان:أقوم باستدعاء أمر gwhois وتحليل مخرجاته.قبيح.

لقد قمت ببعض البحث لمحاولة العثور على طريقة بايثونية للقيام بهذه المهمة.عموما لم أحصل على شيء يذكر - رابط قائمة المناقشة القديمة هذا لديه طريقة للتحقق من وجود المجال.ليس تماما ما كنت أبحث عنه ...ومع ذلك، كان هذا أفضل إجابة قدمتها لي Google - وكل شيء آخر هو مجرد مجموعة من الأسئلة التي لم تتم الإجابة عليها.

هل نجح أي منكم في تشغيل بعض الطرق؟سأكون ممتنًا جدًا لبعض النصائح، أم يجب أن أفعل ذلك بطريقة مفتوحة المصدر، وأجلس وأقوم ببرمجة شيء ما بنفسي؟:)

هل كانت مفيدة؟

المحلول

لا حرج في استخدام أداة سطر الأوامر لفعل ما تريد.إذا قمت بوضع غلاف لطيف حول الخدمة، فيمكنك تنفيذ الأجزاء الداخلية كما تريد!على سبيل المثال:

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

الآن، سواء كنت تقوم بإنشاء مكتبة خاصة بك باستخدام urllib أم لا، أو تلتف حول أداة مساعدة لسطر الأوامر (كما تفعل)، أو تستورد مكتبة تابعة لجهة خارجية وتستخدمها (مثل أنت تقول)، تظل هذه الواجهة كما هي.

لا يعتبر هذا النهج قبيحًا على الإطلاق -- في بعض الأحيان تقوم أدوات الأوامر المساعدة بما تريد ويجب أن تكون قادرًا على الاستفادة منها.إذا أصبحت السرعة بمثابة عنق الزجاجة، فإن تجريدك يجعل عملية التبديل إلى تطبيق Python الأصلي شفافة بالنسبة إلى كود العميل الخاص بك.

العملية تتفوق على النقاء - هذا ما هو بايثونيك.:)

نصائح أخرى

أنظر إلى هذا:http://code.google.com/p/pywhois/

pywhois - وحدة Python لاسترداد معلومات WHOIS الخاصة بالمجالات

هدف:- قم بإنشاء وحدة Python بسيطة قابلة للاستيراد والتي ستنتج بيانات WHOIS التي تم تحليلها لمجال معين.- قادرة على استخراج البيانات لجميع TLDs الشهيرة (com ، org ، net ، ...) - الاستعلام عن خادم whois مباشرة بدلاً من المرور بخدمة ويب وسيطة مثلما يفعل الكثيرون.- يعمل مع Python 2.4+ ولا توجد تبعيات خارجية

مثال:

>>> import pywhois
>>> w = pywhois.whois('google.com')
>>> w.expiration_date
['14-sep-2011']
>>> w.emails
['contact-admin@google.com',
 'dns-admin@google.com',
 'dns-admin@google.com',
 'dns-admin@google.com']
>>> print w
...

وجدت هذا السؤال أثناء بحثي عن مكتبة بيثون whois.

لا أعرف أنني أتفق مع إجابة Cdleary على أن استخدام مكتبة تلتف أمرًا هو دائمًا أفضل طريقة للذهاب - لكن يمكنني رؤية أسبابه التي قالها هذا.

طليعة:يتولى خط cmd whois كل العمل الشاق (استدعاءات المقابس، والتحليل، وما إلى ذلك)

يخدع:غير محمولة؛قد لا تعمل الوحدة بناءً على أمر whois الأساسي.أبطأ، منذ تشغيل الأمر وعلى الأرجح Shell بالإضافة إلى أمر whois.تأثرت إذا لم تكن UNIX (Windows) ، UNIX مختلفة ، أولية UNIX ، أو أمر WHOIS الأقدم

أنا أبحث عن وحدة whois التي يمكنها التعامل مع عمليات بحث whois IP ولست مهتمًا بترميز عميل whois الخاص بي.

فيما يلي الوحدات التي قمت بتجربتها (بشكل طفيف) ومزيد من المعلومات حولها:

pywhoisapi:

  • بيت: http://code.google.com/p/pywhoisapi/
  • تصميم:عميل REST يصل إلى خدمة ARIN whois REST
  • الايجابيات:قادرة على التعامل مع عمليات البحث عن عنوان IP
  • سلبيات:هل أنت قادر على سحب المعلومات من خوادم whois الخاصة بسجلات RIR الأخرى؟

BulkWhois

  • بيت: http://pypi.python.org/pypi/BulkWhois/0.2.1
  • تصميم:عميل telnet يصل إلى واجهة استعلام whois telnet من RIR(؟)
  • الايجابيات:قادرة على التعامل مع عمليات البحث عن عنوان IP
  • سلبيات:هل أنت قادر على سحب المعلومات من خوادم whois الخاصة بسجلات RIR الأخرى؟

pywhois:

  • بيت: http://code.google.com/p/pywhois/
  • تصميم:عميل REST يصل إلى خدمات RRID whois
  • الايجابيات:يصل إلى العديد من RRIDs؛لديه فرع بيثون 3.x
  • سلبيات:لا يبدو أنه يتعامل مع عمليات البحث عن عنوان IP

بيثون وويس:

whoisclient - شوكة بيثون whois

  • بيت: http://gitorious.org/python-whois
  • تصميم:يلتف أمر "whois".
  • يعتمد على:IPy.py
  • سلبيات:لا يبدو أنه يتعامل مع عمليات البحث عن عنوان IP

تحديث:انتهى بي الأمر باستخدام pywhoisapi لعمليات البحث العكسي عن IP التي كنت أقوم بها

هنا هو عميل whois الذي أعيد تنفيذه في بايثون:http://code.activestate.com/recipes/577364-whois-client/

لا أعرف ما إذا كان gwhois يفعل شيئًا خاصًا بمخرجات الخادم؛ومع ذلك، يمكنك الاتصال بوضوح بخادم whois على المنفذ whois (43)، وإرسال استعلامك، وقراءة جميع البيانات الموجودة في الرد وتحليلها.لجعل الحياة أسهل قليلاً، يمكنك استخدام فئة telnetlib.Telnet (حتى لو كان بروتوكول whois أبسط بكثير من بروتوكول telnet) بدلاً من المقابس العادية.

الأجزاء الصعبة:

  • ما هو خادم whois الذي سوف تسأله؟يمكن أن تكون RIPE وARIN وAPNIC وLACNIC وAFRINIC وJPNIC وVERIO وما إلى ذلك LACNIC بمثابة بديل مفيد، نظرًا لأنها تميل إلى الرد ببيانات مفيدة على الطلبات خارج نطاقها.
  • ما هي الخيارات والوسائط الدقيقة لكل خادم whois؟البعض يقدم المساعدة، والبعض الآخر لا يفعل ذلك.وبشكل عام، تعمل أسماء النطاقات البسيطة دون أي خيارات خاصة.

هناك طريقة أخرى للقيام بذلك وهي الاستخدام urllib2 وحدة لتحليل خدمة WHOIS الخاصة بصفحة أخرى (توجد العديد من المواقع المشابهة).لكن هذا يبدو أكثر من مجرد اختراق لما تفعله الآن، ومن شأنه أن يمنحك الاعتماد على أي موقع whois تختاره، وهو أمر سيء.

أنا أكره أن أقول ذلك، ولكن إلا إذا كنت ترغب في إعادة التنفيذ whois في برنامجك (الذي سيعيد اختراع العجلة)، قيد التشغيل whois على نظام التشغيل ويبدو أن تحليل الإخراج (أي ما تفعله الآن) هو الطريقة الصحيحة للقيام بذلك.

لن يكون تحليل صفحة ويب أخرى بنفس السوء (بافتراض أن HTML الخاص بها لن يكون سيئًا للغاية)، ولكنه في الواقع سيربطني بهم - إذا كانوا معطلين، فأنا معطل :)

في الواقع لقد وجدت بعض المشاريع القديمة على sourceforge: rwhois.py.ما يخيفني قليلاً هو أن آخر تحديث لهم كان من عام 2003.ولكن قد يبدو هذا مكانًا جيدًا للبدء في إعادة تنفيذ ما أقوم به الآن...حسنًا، لقد شعرت بأنني مضطر لنشر الرابط لهذا المشروع على أي حال، فقط لمزيد من المعلومات.

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

إذا أعادت خطأً، فأنت تعلم أنه غير مسجل في أي DNS

إليك حل جاهز للاستخدام يناسبني؛مكتوب لـ Python 3.1 (عند الرجوع إلى Py2.x، انتبه بشكل خاص لتمييزات نص البايتات/Unicode).نقطة الوصول الوحيدة الخاصة بك هي الطريقة DRWHO.whois(), ، والذي يتوقع أن يتم تمرير اسم المجال؛سيحاول بعد ذلك حل الاسم باستخدام الموفر الذي تم تكوينه كـ DRWHO.whois_providers[ '*' ] (الحل الأكثر اكتمالاً يمكن أن يميز مقدمي الخدمة وفقًا لنطاق المستوى الأعلى). DRWHO.whois() سيعود قاموسًا بإدخال واحد text, ، والذي يحتوي على نص الرد الذي أرسله خادم WHOIS.مرة أخرى، سيحاول الحل الأكثر اكتمالًا تحليل النص (وهو ما يجب إجراؤه بشكل منفصل لكل مزود، حيث لا يوجد تنسيق قياسي) وإرجاع تنسيق أكثر تنظيمًا (على سبيل المثال، تعيين علامة available الذي يحدد ما إذا كان المجال يبدو متاحًا أم لا).استمتع!

##########################################################################
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' ] )
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top