reg.cgi
Cirrusのサンプルサーバ
先にSQLiteでテーブルを作っておく必要あり
CREATE TABLE registrations (
m_username VARCHAR COLLATE NOCASE,
m_identity VARCHAR,
m_updatetime DATETIME,
PRIMARY KEY (m_username)
);
CREATE INDEX registrations_updatetime ON registrations (m_updatetime ASC);
reg.cgi
dbFile = './registrations.db'
import cgi
import sqlite3
import xml.sax.saxutils
query = cgi.parse()
db = sqlite3.connect(dbFile)
### /reg.cgi?username=<自分の名前>&friends=<相手の名前(複数可)>&identity=<Cirrusで発行された長いID>
user = query.get('username', [None])[0]
identity = query.get('identity', [None])[0]
friends = query.get('friends', [])
print 'Content-type: text/plain\n\n<?xml version="1.0" encoding="utf-8"?>\n<result>'
### 自分の名前とIDをDBに追加or更新
if user:
try:
c = db.cursor()
c.execute("insert or replace into registrations values (?, ?, datetime('now'))", (user, identity))
print '\t<update>true</update>'
except:
print '\t<update>false</update>'
### 相手が1時間以内にDBにいたら、そのIDと名前を返す
### 相手のIDは複数の可能性がある(複数の場所でログインしている場合)
for f in friends:
print "\t<friend>\n\t\t<user>%s</user>" % (xml.sax.saxutils.escape(f), )
c = db.cursor()
c.execute("select m_username, m_identity from registrations where m_username = ? and m_updatetime > datetime('now', '-1 hour')", (f, ))
for result in c.fetchall():
eachIdent = result[1]
if not eachIdent:
eachIdent = ""
print "\t\t<identity>%s</identity>" % (xml.sax.saxutils.escape(eachIdent), )
if f != result[0]:
print "\t\t<registered>%s</registered>" % (xml.sax.saxutils.escape(result[0]), )
print "\t</friend>"
db.commit()
print "</result>"
こんなXMLを返す
<result>
<update>true</update>
<friend>
<user>探している相手の名前</user>
<identity>登録済みの相手のID</identity>
<registered>登録された相手の名前</registered>
<identity>登録済みの相手のID</identity>
<registered>登録された相手の名前</registered>
</friend>
<friend>
上と同様
</friend>
</result>