ヘンに時間があまってしまったので,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)