PythonでDNSクエリを送る

この記事は私が投稿した https://zenn.dev/haan/articles/c7ba9ee0b6c1f7 の再掲です。 import dns.resolver resolver = dns.resolver.Resolver() answers = resolver.resolve('www.google.com', 'a') for rdata in answers: print(rdata.address) 基本的にはこれだけですが、もう少し細かいことをやりたい場合の例をいくつかご紹介します。 問い合わせ先リゾルバなどを指定 resolver = dns.resolver.Resolver() resolver.nameservers = ['8.8.8.8', '8.8.4.4'] resolver.port = 53 resolver.timeout = 5 NXDOMAINを拾う resolver = dns.resolver.Resolver() try: answers = resolver.resolve('存在しないFQDN', 'a') for rdata in answers: print(rdata.address) except dns.resolver.NXDOMAIN: print('no record') MXレコードを取得 import dns.resolver resolver = dns.resolver.Resolver() answers = resolver.resolve('gmail.com', 'mx') for rdata in answers: print(f'Preference: {rdata.preference}') print(f'Server: {rdata.exchange.to_text(omit_final_dot=True)}') rdata には dns.rdtypes.ANY.MX.MX 型が返ります。Preferench値とメールサーバーのホスト名はそれぞれ上記のように取得できます。 rdata.exhange は dns.name.Name 型が返ります。dns.name.Name 型はdnspythonにおいて広く汎用的に使われる型で、to_text() メソッドで簡単にstr型に変換できる優れものです。ただし、(リソースレコードが実際にそうだから仕方がないのですが、)末尾に".“がついてきて、邪魔です。そこで omit_final_dot=True としておくと、この末尾の”.“を除外した形でstr型へ変換してくれます。 TXTレコードを取得 resolver = dns.resolver.Resolver() answers = resolver.resolve('gmail.com', 'txt') for rdata in answers: tuple = rdata.strings for item in tuple: print(item.decode('utf-8')) TXTレコードは .strings で取得できますが、この返値はbyte型のtupleになるため注意が必要です。これは、TXTレコードが ...

August 17, 2025 · 3 min