2010年10月9日土曜日

Android端末上に電子掲示板システムを構築する方法

このブログ記事をはてなブックマークに追加

最近になって日本においてもAndroid端末が続々と発表されて巷で賑わいを見せている。ドコモからはGALAXY S、auからはIS03、ソフトバンクからはDesire HDと立て続けに発売される。このほかにも年末までにタブレット端末を含めた複数のAndroid端末が発売されるようで結構なことだ。


Androidも盛り上がってきたし、Android端末を使って手軽で役に立つことができないか考えてみた。そこで今回、Android端末をウェブサーバにして、そこに電子掲示板システム(BBS)を構築してみた。これさえあれば不意にプライベートなBBSを使いたくなったときにいつでも利用することができる。たとえばライトニングトークやセミナーなどのようなイベントの参加者からその場でちょっとしたアンケートや感想を貰いたいときに便利ではないかと思う。ちょっとした話題作りにもなるかも。

電子掲示板システムの作成に必要なものはAndroid端末とSL4A/Pythonだけ。あとは今回作成した android_bbs.py を使えばいい。そして、SL4Aを使ってサーバを立ち上げてから、android_bbs.pyを起動すれば完了だ。SL4Aによるサーバの起動方法とアドレス取得についてはPythonを使ってAndroid端末を5分でリモートカメラにする方法で書いたのでそちらを参考にして欲しい。

今回の電子掲示板システムはPythonを使って即席で作ったこともあってエラー処理などを入れずに30行ちょいのシンプルな作りになっている。sqlite3モジュールによるSQLiteデータベースで記事を管理し、wsgiref.simple_serverモジュールを使ってウェブサーバ構築した。簡単だ。ただ、Android独自の機能は使っていないのでAndroid端末専用というわけではないけど。Android独自の機能を入れるとしたら、たとえばTwitterなどの投稿者の位置情報表示に対抗して、投稿者ではなくサーバの位置、さらに向きや速度も一緒に表示されるようにするとか。誰得な機能だけど。

以下にソースコードを示す。

android_bbs.py

# -*- coding: utf-8 -*- import cgi,sqlite3,datetime from wsgiref.simple_server import make_server LIMIT=50 # 最大表示記事数. DB_FILE='/sdcard/bbs.sqlite' con=sqlite3.connect(DB_FILE) cur=con.cursor() cur.execute('CREATE TABLE IF NOT EXISTS bbs (id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, user TEXT, datetime TEXT, data TEXT)') INSERT_DB='INSERT INTO bbs VALUES(NULL,?,?,?)' def post(user,data): if data=='': return if user=='': user='匿名' dt=datetime.datetime.today().strftime('%Y-%m-%d %H:%M:%S') cur.execute(INSERT_DB,(cgi.escape(user.decode('utf-8')),dt,cgi.escape(data.decode('utf-8')).replace('\n','<br />'))) con.commit() def bbs(environ,start_response): if environ['PATH_INFO']=='/': if environ['REQUEST_METHOD']=='POST': fs=cgi.FieldStorage(fp=environ['wsgi.input'],environ=environ,keep_blank_values=1) post(fs.getfirst('user','').strip(),fs.getfirst('data','').strip()) data=u'<html><head><title>BBS by Android</title></head><body><form action="/" method="post"><div><textarea name="data" cols="40" rows="5"></textarea></div><span>名前:<input type="text" name="user" size="20" maxlength="30" /></span> <span><input type="submit" name="submit" value="送信" /></span> <span><input type="button" value="更新" onclick="location.reload(true);" /></span></form>' cur.execute('SELECT * FROM bbs ORDER BY id DESC') for i, row in enumerate(cur): if i>=LIMIT: break data+=('<div><p>%d <b>%s</b> %s</p><p>%s</p></div>' % row) data+='</body></html>' start_response('200 OK',[('Content-type','text/html;charset=utf-8')]) return [data.encode('utf-8')] httpd=make_server('',8080,bbs) httpd.serve_forever()

1 コメント:

わさび さんのコメント...

すごい!さすが!
大変参考になりました。
http://goo.gl/VvS6Yo