このサイトについて

MyMiniCityにいい感じでリダイレクトしてくれるPython製リダイレクタ

MyMiniCityにいい感じでリダイレクトしてくれるPython製リダイレクタ


ヘンに時間があまってしまったので,XMLでステータスを読み込んで,必要に応じていい感じのURLにリダイレクトするスクリプトをちょろっと書いてみた。街を健全な状態に保ってくれます。

以下のリンクをクリックすると,ステータスに合わせて「/ind」とか「/tra」といったURLにリダイレクトしますよ:-)。

http://coreblog.org/ats/mmredirect

最初はElementTree使ってXMLをパースしてたんだけど,PureなPython2.3とかでも動かしたくなったので正規表現でバースするように変更したのでした。

ApacheなどにCGIとして仕込んで動かすことを前提にしています。ユーザIDを適宜変えれば使えるはず。PythonのCGIHTTPServerでは,Statusヘッダを解釈してくれないので,うまく動かないみたいです。

    #!/usr/bin/env python
    # coding: utf-8
    
    # Redirector for myminicity
    #
    # (c) 2008 Shibata Atsushi (shibata at webcore dot co dot jp)
    
    
    from urllib import urlopen
    import re
    import socket
    
    # Attribute names for data, and path for raising each values
    attrs = {'unemployment':'ind',
             'transport':'tra',
             'criminality':'sec',
             'pollution':'env'}
    
    urlpat = 'http://%s.myminicity.com/'
    
    def read_citystatus(userid):
        """
        Reading city status via XML, returning dictionary.
        The dictionary contains values, which show status of city,
        such as unemployment, transport(reversed), criminality, pollution.
        
        Argument(s)
        
        userid : userid (subdomain) for city
        """
        url = urlpat % userid
        url += 'xml'
        socket.setdefaulttimeout(20)
        # trying to get XML source
        items = re.findall(r'<(.+?)>(.+?)', urlopen(url).read())
        rd = {}
        # scanning xml
        for i in items:
            if i[0] in attrs:
                try:
                    rd[i[0]] = int(i[1])
                except:
                    rd[i[0]] = 0
        rd['transport'] = 100 - rd.get('transport', 100)
        return rd
    
    def get_url(userid):
        """
        Returning most expected URL
        """
        d = read_citystatus(userid)
        l = d.keys()
        l.sort(lambda x, y: cmp(d[y], d[x]))
        url = urlpat % userid
        if d[l[0]] == 0:
            tail = ''
        else:
            tail = attrs[l[0]]
        return url + tail
    
    resp = """Status: 302 Found
    Location: %(url)s
    Content-type: text/html
    
    <html><body>
    <a href="%(url)s">%(url)s</a>
    </body></html>"""
    
    if __name__ == '__main__':
        url = get_url('atsshib')
        print resp % dict(url=url)
    
MyMiniCityのブログパーツ/ウィジェット/リダイレクタを作ってみた MyMiniCityのブログパーツ/ウィジェット/リダイレクタを作ってみた
Size 1057 - File type text/corewiki
by ats last modified 2008-01-23 22:58
MyMiniCity用のブログパーツ / ウィジェット - My Lovely City - シンプル&コンパクト MyMiniCity用のブログパーツ / ウィジェット - My Lovely City - シンプル&コンパクト
Size 1 kB - File type text/html
by ats last modified 2008-01-23 22:58
2010-08-27 04:46