Live Spaces
今回からはWindows Live Spaces に関するAPI/SDKを使ってみましょう。Live Spacesは、オンラインのWindows Liveサービスのひとつで無料のブログサービスです。最近は目立ったアップデートはなく、ほかのブログサービスの機能と比べ見劣りする部分もありますが、ガジェットの追加や簡単なデザインのカスタマイズ、アクセスの制限などの機能が特徴です。Live MessengerやLive フォトなど、ほかのWindows Liveサービスとの連携しているのも特徴です。もちろんWindows Live Writerからブログの投稿も可能です。
Live Spacesに用意されているAPI/SDKは次の2種類があります。
Live Spaces MetaWeblog API
Webサイトではなく外部アプリケーションからブログに記事の投稿や編集・削除、ブログやユーザーの情報を取得するためのAPIです。Live Spaces特有のものではなくMetaWeblog APIという一般的な方法が使用します。Live SpacesはこのAPIに対応したブログということになります。この後、もう少し詳しく紹介します。
Live Spaces APIs and Feeds
Live SpacesのURLにパラメーターを付けてアクセスすると、タイトルと本文を指定した投稿ページを開いたり、指定したガジェットを追加するページを開いたりするAPIです(実行はユーザーがします) 。また、Live Spacesはひとりのユーザーに対して複数のRSSフィードが提供されています。それらのフィードのURLと内容の解説がMSDN Libraryに解説されています。このAPIとフィードについて今回は説明していません。
今回は、Live Spacesにアプリケーションから記事を投稿してみましょう。
メールから投稿
Live Spacesに記事を投稿する場合、Webサイトから投稿する方法以外に、携帯電話などからメールで投稿する機能が用意されています。単純にLive Spacesに投稿したいだけの場合、この機能をアプリケーションから使用するのもひとつの手かもしれません。
メールで投稿する場合、あらかじめ機能を有効にしておく必要があります。設定は、自分のLive Spacesへ移動し(http://***.spaces.live.com 形式のURLです) 、オプションメニューから電子メール投稿を選択します(図1 ) 。
図1 オプションメニュー
移動したページで、メールからの投稿を有効にします。このページでは、投稿に使用するメールアドレスと秘密のキーワードと呼ばれる文字列を設定します(図2 )。
図2 電子メール投稿の設定
キーワードを組み合わせたメールアドレス宛へ指定したメールから投稿することで、メールからの投稿が可能になります。メールに写真を添付することで、フォトアルバムへ写真の投稿も可能です。メールした内容をすぐに記事としてブログへ投稿するか、下書きとして保存するかも設定できます。
この方法を利用して投稿する場合、プログラムでは次のように記述できます。以下は、Visual Basicを使用したメールの送信方法です。
Dim message = New MailMessage (
"from@example.jp" ,
"***.your_spaces_name@spaces.live.com" ,
"タイトル" ,
"本文" )
Using client = New SmtpClient ( "smtp.example.jp" , 587 )
client . Send ( message )
End Using
写真の投稿はメールにファイルを添付します。コードは次のようになります。ファイルを添付するコードを追加しています。
Dim message = New MailMessage (
"from@examlple.jp" ,
"***.album_id.your_spaces_name@spaces.live.com" ,
"タイトル" ,
"本文" )
Using client = New SmtpClient ( "smtp.example.jp" , 587 )
Dim file = "kasukabe.jpg"
Dim data = New Attachment ( file , Net . Mime . MediaTypeNames . Application . Octet )
message . Attachments . Add ( data )
client . Send ( message )
End Using
Live Spaces MetaWeblog API
MetaWeblog APIは、ブログの操作のために作られたAPIです。最近のブログシステムの多くがこのAPIに対応し、Live Spacesもそのひとつです。Windows Live WriterなどMetaWeblog APIに対応したクライアントアプリケーションであれば、共通した方法で各ブログにアクセスが可能です。Live SpacesはMetaWeblog APIを提供していますが、このAPI以外にもAtomPubと呼ばれるプロトコルもブログ操作のためによく用いられている方法です。ちなみにLive Writerはどちらにも対応したアプリケーションです。
MetaWeblog APIは、XML-PRCというプロトコルを使用しています。これは通信にHTTP、データにXMLを使用した単純なものです。この後出てくるコードを見ればすぐに理解できるのではないかと思います。
ブログの操作は、サービスエンドポイントと呼ばれるURLにアクセスし、必要な情報を記述したXML文書を送信します。応答もXML形式で返ってきます。このXMLによる通信はXML-RPCで定義され、サーバーとやりとりする情報の内容がMetaWeblog APIとして定義されています。Live Spacesのサービスエンドポイントは次のURLです。
https://storage.msn.com/storageservice/MetaWeblog.rpc
このAPIを利用すれば、Live Spaces以外のAPI対応ブログも同じように操作可能です。ただし、MetaWeblog APIはある程度 汎用的な内容になっていますので、各ブログの仕様は確認する必要があるでしょう。また、MetaWeblog APIを拡張したMovable Type APIもよく利用されています(MetaWeblog API自体はBlogger APIを拡張したものです)。
認証方法
Live Spaces MetaWeblog APIを利用してブログへアクセスするにはユーザーの認証が必要になります。認証方法は次の3種類が用意されています。
ユーザー名とパスワード
認証にユーザー名とパスワードを用いる方法です。ユーザー名は、ユーザーのLive SpaceのURLに含まれる文字列(http://***.spaces.live.com の***の値)になります。パスワードは、メールによる投稿で使用した秘密のパスワードです。
Cookie
Live IDアカウントでサインインするパスポート認証と呼ばれる方法です。サインインサーバーの応答時にCookieが設定されているので、その値を使って認証します。この方法については解説しません。
チケット
Cookieと同じくLive IDアカウントでサインインする方法ですが、Cookieではなくチケットと呼ばれる認証用の値を取得し、HTTP Authorizationヘッダーに指定することで認証します。これはWindows Live ID Client SDKを利用することで実現できます。Live ID Client SDKを利用すると、図3 に示すサインインUIをアプリケーションから呼び出せるようになります。
図3 Live ID Client SDKによるサインイン画面
記事の投稿
今回はMetaWeblog APIを利用し、ユーザー名とパスワードによる認証を使って新しい記事を投稿します。
新しい記事の投稿はmetaWeblog.newPost メソッドを使用します。このメソッド名と必要な引数をXMLで記述しサーバーへ送信します。指定するメソッドの引数は次の通りです。
blogid
ブログID
Live Spacesの場合自分のブログを表す「MyBlog」に固定
username
ユーザー名
password
パスワード
content
記事の情報の構造体(後述)
publish
すぐに公開または下書きとして保存かを示す1または0の値
content構造体に指定できる項目は次の通りです。構造体はキー名とその値のペアで表します。ブログによっては、これ以外の項目を利用するものもあります。
title
記事のタイトル
description
記事の本文(省略可能)
dateCreated
投稿日時(省略可能)
categories
記事のカテゴリーの配列(省略可能)
上記の省略の可否はLive Spacesの場合です。dateCreatedはUTC時刻を用います。
実際に送信するXML文書は次のようになります。
<? xml version = "1.0" encoding = "utf-8" ?>
<methodCall>
<methodName> metaWeblog.newPost </methodName>
<params>
<param>
<value>
<string> MyBlog </string>
</value>
</param>
<param>
<value>
<string> *userName* </string>
</value>
</param>
<param>
<value>
<string> *password* </string>
</value>
</param>
<param>
<value>
<struct>
<member>
<name> title </name>
<value>
<string> タイトル </string>
</value>
</member>
<member>
<name> description </name>
<value>
<string> 本文 </string>
</value>
</member>
<member>
<name> categories </name>
<value>
<array>
<data>
<value>
<string> Books </string>
</value>
</data>
</array>
</value>
</member>
<member>
<name> dateCreated </name>
<value>
<dateTime.iso8601> 2010-03-30T03:30:00 </dateTime.iso8601>
</value>
</member>
</struct>
</value>
</param>
<param>
<value>
<boolean> 1 </boolean>
</value>
</param>
</params>
</methodCall>
このようなXMLを作成しサーバーへ送信するコードは次のようになります。Visual Basicで記述しています。C#の場合は、XMLリテラル部分のXMLを文字列で記述するなど変更が必要です。またVisual Basicの場合でも文法にVisual Basic 10.0の文法を使用していますので、Visual Basic 9.0(Visual Basic 2008)の場合は適宜修正が必要です。
Dim serviceEndpoint = "https://storage.msn.com/storageservice/MetaWeblog.rpc"
Dim blogId = "MyBlog"
Dim userName = "***"
Dim password = "***"
Dim publish = True
Dim categories = New List ( Of String ) From { "Books" }
Dim title = "タイトル"
Dim description = "本文"
Dim dateCreated = DateTime . UtcNow
Dim requestXml =
<? xml version = "1.0" encoding = "utf-8" ?>
<methodCall>
<methodName> metaWeblog.newPost </methodName>
<params>
<param><value><string> <% = blogId %> </string></value></param>
<param><value><string> <% = userName %> </string></value></param>
<param><value><string> <% = password %> </string></value></param>
<param>
<value>
<struct>
<member>
<name> title </name>
<value><string> <% = title %> </string></value>
</member>
<member>
<name> description </name>
<value><string> <% = description %> </string></value>
</member>
<member>
<name> categories </name>
<value>
<array>
<% = From c In categories
Select <data><value><string> <% = c %> </string></value></data>
%>
</array>
</value>
</member>
<member>
<name> dateCreated </name>
<value><dateTime.iso8601> <% = dateCreated . ToString ( "s" ) %> </dateTime.iso8601></value>
</member>
</struct>
</value>
</param>
<param><value><boolean> <% = If ( publish , 1 , 0 ) %> </boolean></value></param>
</params>
</methodCall>
Dim data () As Byte
Using ms = New System . IO . MemoryStream
requestXml . Save ( ms )
data = ms . ToArray
End Using
Dim client = New WebClient
client . Headers . Add ( HttpRequestHeader . ContentType , "text/xml" )
Dim responseData = client . UploadData ( serviceEndpoint , data )
Dim responseStream = New System . IO . MemoryStream ( responseData )
Dim bom = System . Text . Encoding . UTF8 . GetPreamble
Dim includesBom = True
For Each b In bom
If responseStream . ReadByte <> b Then
includesBom = False
responseStream . Seek ( 0 , System . IO . SeekOrigin . Begin )
Exit For
End If
Next
Dim doc As XDocument
If includesBom Then
Dim buf ( responseStream . Length - bom . Length - 1 ) As Byte
For i = 0 To buf . Length - 1
buf ( i ) = responseStream . ReadByte
Next
doc = XDocument . Parse ( System . Text . Encoding . UTF8 . GetString ( buf ))
Else
doc = XDocument . Parse ( System . Text . Encoding . UTF8 . GetString ( responseStream . ToArray ))
End If
responseStream . Close ()
Dim postId = doc .< methodResponse >.< params >.< param >.< value >. Value
Process . Start ( "http://" & userName & ".spaces.live.com/blog/cns!" & postId & ".entry" )
作成したXML文書はHTTP POSTメソッドでサーバーへ送信しているだけです。このときContent-Typeはtext/xmlを指定しましょう。
サーバーからの応答は、正常に投稿できた場合、次のような記事のIDを含むXMLが返ってきます。
<? xml version = "1.0" encoding = "utf-8" ?>
<methodResponse xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd = "http://www.w3.org/2001/XMLSchema" >
<params>
<param>
<value> AFE8504AA8CD166F!1165 </value>
</param>
</params>
</methodResponse>
示したVisual Basicのコードでは、応答部分もすでに書いてあります。Live SpacesからのXMLには、Unicode形式のテキストの先頭に付けるBOM(Byte Order Mark)という符号化判別用のデータがあります。これが付いたままだとXDocument.Parseメソッドが使えないため、BOMを削除する処理を書いています。この処理のため少しだけ行数が増えていますが、MetaWeblog APIによる操作は、難しいものではないことがわかると思います。コードの最後では、投稿した記事のIDを参照し、その記事のページへ移動しています。
今回はここまでです。次回は今回と異なる認証方法や、ブログの操作を紹介する予定です。