Live Spaces
今回からはWindows Live Spacesに関するAPI/
Live Spacesに用意されているAPI/
- 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に記事を投稿する場合、
メールで投稿する場合、

移動したページで、

キーワードを組み合わせたメールアドレス宛へ指定したメールから投稿することで、
この方法を利用して投稿する場合、
' Imports System.Net.Mail
' メールメッセージ
' 引数の from には投稿に使用するメールアドレスを指定
' 引数の to には ブログのメールアドレスを指定
Dim message = New MailMessage(
"from@example.jp" ,
"***.your_spaces_name@spaces.live.com" ,
"タイトル",
"本文")
Using client = New SmtpClient("smtp.example.jp" , 587) ' SMTPサーバーアドレスとポート番号を指定
' メール送信
client.Send(message)
End Using
写真の投稿はメールにファイルを添付します。コードは次のようになります。ファイルを添付するコードを追加しています。
' メールメッセージ
' 引数の from には投稿に使用するメールアドレスを指定
' 引数の to には ブログまたはアルバムのメールアドレスを指定
Dim message = New MailMessage(
"from@examlple.jp" ,
"***.album_id.your_spaces_name@spaces.live.com" ,
"タイトル",
"本文")
Using client = New SmtpClient("smtp.example.jp" , 587) ' SMTPサーバーアドレスとポート番号を指
' メールに写真を添付
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は、
MetaWeblog APIは、
ブログの操作は、
https://storage.msn.com/storageservice/MetaWeblog.rpc
この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をアプリケーションから呼び出せるようになります。

記事の投稿
今回はMetaWeblog APIを利用し、
新しい記事の投稿はmetaWeblog.
blogid | ブログID Live Spacesの場合自分のブログを表す |
---|---|
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#の場合は、
' Imports System.Net
' サービスエンドポイント
Dim serviceEndpoint = "https://storage.msn.com/storageservice/MetaWeblog.rpc"
' パラメーター
Dim blogId = "MyBlog" ' Live Spaces の場合 MyBlog で固定
Dim userName = "***" ' Live Spaces の URL に含む文字列
Dim password = "***" ' 秘密のキーワード
Dim publish = True ' 投稿 True / 下書き False
Dim categories = New List(Of String) From {"Books"} ' カテゴリー(Live Spaces はひとつのカテゴリー指定しか対応していません)
' content 構造体に指定する項目
Dim title = "タイトル" ' 記事タイトル
Dim description = "本文" ' 記事の本文
Dim dateCreated = DateTime.UtcNow ' 投稿日時
' 要求時に送信するXML
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>
' XML を Byte 配列に変換
Dim data() As Byte
Using ms = New System.IO.MemoryStream
requestXml.Save(ms)
data = ms.ToArray
End Using
' WebClient オブジェクトを作成し XML として送信する必要がある
Dim client = New WebClient
client.Headers.Add(HttpRequestHeader.ContentType, "text/xml")
' XML の送信(記事の投稿)と応答の受信
Dim responseData = client.UploadData(serviceEndpoint, data)
Dim responseStream = New System.IO.MemoryStream(responseData)
' BOM(Byte Order Mark) がレスポンスの先頭についている場合、削除してから XML へ変換する必要がある
Dim bom = System.Text.Encoding.UTF8.GetPreamble ' BOM
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
' XDocument に変換
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 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のコードでは、
今回はここまでです。次回は今回と異なる認証方法や、