đây là một giải pháp sẵn sàng để sử dụng làm việc cho tôi; được viết cho Python 3.1 (khi quay trở lại Py2.x, hãy đặc biệt quan tâm đến sự phân biệt văn bản byte/Unicode). điểm truy cập duy nhất của bạn là phương thức DRWHO.whois()
, dự kiến một tên miền sẽ được chuyển vào; sau đó nó sẽ cố gắng giải quyết tên bằng cách sử dụng nhà cung cấp được cấu hình là DRWHO.whois_providers[ '*' ]
(một giải pháp hoàn chỉnh hơn có thể phân biệt các nhà cung cấp theo tên miền cấp cao nhất). DRWHO.whois()
sẽ trả lại một từ điển có một mục nhập text
, chứa văn bản phản hồi được máy chủ WHOIS gửi lại. Một lần nữa, một giải pháp hoàn chỉnh hơn sẽ thử và phân tích cú pháp văn bản (phải được thực hiện riêng cho từng nhà cung cấp, vì không có định dạng chuẩn) và trả lại định dạng có cấu trúc hơn (ví dụ: đặt cờ available
. trông có sẵn). chúc vui vẻ!
##########################################################################
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' ])
Vâng, tôi biết.Tuy nhiên, việc sử dụng quá nhiều công cụ hệ thống và trình bao bọc xung quanh chúng khiến cho việc chuyển ứng dụng sang hệ thống khác khó khăn hơn, nhưng tôi đoán tôi sẽ liên kết với những gì tôi có ngay bây giờ, nếu nó hoạt động;) – kender
Với rào cản trừu tượng tốt, bạn có thể thực hiện nó bất cứ khi nào nó thuận tiện! "Bây giờ là tốt hơn không bao giờ, Mặc dù không bao giờ thường tốt hơn * ngay bây giờ *." :) – cdleary
@kender: nó làm cho nó dễ dàng hơn! Bạn chỉ cần chuyển đổi nội bộ từ gwhois sang Xwhois. Nếu bạn cũng muốn tiếp tục triển khai cũ, bạn có thể mở rộng lớp cũ và chỉ ghi đè lên ví dụ như phương pháp tra cứu. – hopla