2009/07/02

python resolv

Python を使って名前を解決するぞ! と思ったんですが
初心者はそんなことのやり方も知りません
ググってみたら最初に出てきたのが
Ruby, Pythonで並列に逆引きを行う - bkブログ
Ruby と Python の threading の比較を resolve でしてるページでした
で、中で使ってるのは socket.gethostbyaddr

そっか、socket かと思い試してみました
>>> import socket
>>> socket.gethostbyaddr('www.google.com')
('jp-in-f99.google.com', [], ['66.249.89.99'])
>>> socket.gethostbyname('www.google.com')
'66.249.89.99
あら、1 つしか答えてくれません
$ host www.google.com
www.google.com is an alias for www.l.google.com.
www.l.google.com has address 66.249.89.99
www.l.google.com has address 66.249.89.147
www.l.google.com has address 66.249.89.104
www.l.google.com has IPv6 address 2001:4860:c004::68
こういうの期待してたんですが

あれー、と思って検索語を変更 -> python dns
dnspython home page ってページが top に
ん〜、だったら最初から pypi 使えよって話な気もしますが
インストールしてみて
>>> import dns.resolver
>>> [ i.address for i in dns.resolver.query('www.google.com') ]
['66.249.89.99', '66.249.89.104', '66.249.89.147']
>>> [ i.address for i in dns.resolver.query('mail.google.com') ]
ん〜、何か可愛くない

一歩戻って gethostbyname でググると
Manpage of GETHOSTBYNAME ってだから man 見ろよと
でも
gethostbyname*() と gethostbyaddr*() は過去のものである。アプリケーションでは、代わりに getaddrinfo(3) と getnameinfo(3) を使用すること。
と書いてあります
>>> import socket
>>> socket.getaddrinfo('www.google.com', 80)
[(2, 1, 6, '', ('66.249.89.147', 80)), (2, 2, 17, '', ('66.249.89.147', 80)), (2, 3, 0, '', ('66.249.89.147', 80)), (2, 1, 6, '', ('66.249.89.104', 80)), (2, 2, 17, '', ('66.249.89.104', 80)), (2, 3, 0, '', ('66.249.89.104', 80)), (2, 1, 6, '', ('66.249.89.99', 80)), (2, 2, 17, '', ('66.249.89.99', 80)), (2, 3, 0, '', ('66.249.89.99', 80)), (10, 1, 6, '', ('2001:4860:c004::68', 80, 0, 0)), (10, 2, 17, '', ('2001:4860:c004::68', 80, 0, 0)), (10, 3, 0, '', ('2001:4860:c004::68', 80, 0, 0))]
おぉ、こ、これは

これは socket の reference を見ろということだろということで
>>> import socket
>>> socket.gethostbyname_ex('www.google.com')
('www.l.google.com', ['www.google.com'], ['66.249.89.147', '66.249.89.99', '66.249.89.104'])
_ex って
なんか、まぁ、これで、解決したのかしら...

0 件のコメント:

コメントを投稿