昨日は、C++でmixiの足跡APIを叩いてみましたが今日はpythonと行きましょう。
ただ、そのままpythonライブラリ...というのも面白くないので、本日リリースされたIronPython2.0アルファ2に合わせて、IronPythonでやってみようと思います。
基本的には、もうVisual Basic.NETです。pythonらしきソースが無くなってます。
処理は、昨日のC++版と大して変わりません。Atom/WSSE認証を使ってルートエントリからサービスを、またサービスから足跡エントリを取得しています。
やっぱり既存のライブラリがあると無いではソースの量に差が出ますね。
#またまた適当クオリティで申し訳ないです
import clr
clr.AddReferenceByPartialName("System.Xml")
clr.AddReferenceByPartialName("IronPython")
import sys
import System
class MixiService:
def __init__(self, username, password):
self.username = username
self.password = password
def get_content(self, url):
webreq = System.Net.WebRequest.Create(url)
sha = System.Security.Cryptography.SHA1CryptoServiceProvider()
tim = System.DateTime.Now.ToString("yyyy-MM-ddTHH:mm:ssZ")
nonce = "xxxxxxxxxxxxxxxxxxxx"
pwd_bytes = System.Text.Encoding.UTF8.GetBytes(nonce + tim + self.password)
nonce_bytes = System.Text.Encoding.ASCII.GetBytes(nonce)
pwd_base64 = System.Convert.ToBase64String(sha.ComputeHash(pwd_bytes))
nonce_base64 = System.Convert.ToBase64String(nonce_bytes)
auth = "UsernameToken Username=\"" + self.username \
+ "\", PasswordDigest=\"" + pwd_base64 \
+ "\", Nonce=\"" + nonce_base64 \
+ "\", Created=\"" + tim + "\""
webreq.Headers.Add("X-WSSE", auth)
stream = webreq.GetResponse().GetResponseStream()
return System.IO.StreamReader(stream, System.Text.Encoding.UTF8)
def query_xml(reader, xpath, ns):
xmlreader = System.Xml.XmlTextReader(reader)
doc = System.Xml.XmlDocument()
doc.Load(xmlreader)
if ns:
nsmanager = System.Xml.XmlNamespaceManager(doc.NameTable)
nsmanager.AddNamespace(ns["name"], ns["uri"])
node = doc.SelectSingleNode(xpath, nsmanager)
else:
node = doc.SelectSingleNode(xpath)
return node.Value
def dump_data(reader):
xmlreader = System.Xml.XmlTextReader(reader)
doc = System.Xml.XmlDocument()
doc.Load(xmlreader)
nsmanager = System.Xml.XmlNamespaceManager(doc.NameTable)
nsmanager.AddNamespace("Atom", "http://www.w3.org/2005/Atom")
list = doc.SelectNodes("/Atom:feed/Atom:entry", nsmanager)
for node in list:
print(node.SelectSingleNode("Atom:title", nsmanager).InnerText)
print(node.SelectSingleNode("Atom:updated", nsmanager).InnerText)
print(node.SelectSingleNode("Atom:link/@href", nsmanager).Value)
print
if __name__ == '__main__':
if len(sys.argv) < 2: sys.exit()
service = MixiService(sys.argv[1], sys.argv[2])
# get footstamp service
data = service.get_content("http://mixi.jp/atom/tracks")
ns = {"name": "app", "uri": "http://purl.org/atom/app#"}
value = query_xml(data, "//app:service/app:workspace/app:collection/@href", ns)
# get footstamp data
data = service.get_content(value)
dump_data(data)