#!/usr/bin/env python # -*- coding: euc-jp -*- """SpamLookupper: Bulkfeeds DNSBL API を使用したスパムブログ判定クラス Bulkfeeds DNSBL API については http://bulkfeeds.net/app/blacklist をご覧ください。 """ import sys, urlparse, socket __version__ = '0.0.1' __author__ = 'SETOGUCHI Mitsuhiro ' ## class SpamLookupperError(Exception): """SpamLookupper のための例外クラス""" def __init__(self, value): self.value = value def __str__(self): return repr(self.value) ## class SpamLookupper: """SpamLookup のためのクラス without_sub_domain マップはサブドメイン型ではない Blog サービスの ドメインをキー、ユーザIDを特定するまでのディレクトリ数を値としています。 """ without_sub_domain = {'ameblo.jp': 1, 'blog.goo.ne.jp': 1, 'blog.livedoor.jp': 1, 'blog.so-net.ne.jp': 1, 'blogs.dion.ne.jp': 1, 'blogs.yahoo.co.jp': 1, 'ch.kitaguni.tv': 2, 'd.hatena.ne.jp': 1, 'diary.jp.aol.com': 1, 'livejournal.com': 2, 'plaza.rakuten.co.jp': 1, 'shinshu.fm': 2, 'spaces.msn.com': 2, 'yablog.jp': 1, 'blog.drecom.jp': 1} ## def __init__(self): """SpamLookupper クラスの初期化メソッド flag を 0 で初期化する""" self.flag = 0 ## def _domain_for_dnsbl(self, url): parsed_url = urlparse.urlparse(url) site = parsed_url[1].split(':')[0].lstrip('www.') path_tupple = parsed_url[2].split('/') domain = '' if self.without_sub_domain.has_key(site): for i in range(self.without_sub_domain[site], 0, -1): domain = '%s.%s' % (domain, path_tupple[i]) domain = '%s.%s.rbl.bulkfeeds.jp' % (domain, site) return domain.lstrip('.') ## def is_spam(self, url): """引数 url がスパムブログであるかどうかを判断するメソッド url が "http://" で始まらない場合は SpamLookupperError が送出される。 返り値はスパムブログであると判定された場合1、そうでない場合0である。""" self.__init__() url = url.strip() if not url.startswith('http://'): msg = '%s does not starts with "http://".' % url raise SpamLookupperError, msg domain = self._domain_for_dnsbl(url) try: host = socket.gethostbyname(domain) except socket.gaierror, e: host = '' if host == '127.0.0.2': self.flag = 1 return self.flag ## if __name__ == '__main__': u = sys.argv[1] sl = SpamLookupper() if sl.is_spam(u): print u, 'maybe spam.'