はじめに
今回も前回に引き続いてLive SpacesのAPI/
クライアント認証
Windows Live IDアカウントによる認証方法は、

今回はLive ID Client SDKを使用しますので下記を参考にインストールを行ってください。
開発環境
Live ID Client SDK
Live ID Client SDKは、
インストーラーを実行すると、
64bit Windows環境にインストールする場合は少し注意が必要です。SDKのインストール後にサンプルアプリケーションが自動で起動しますが、

プロジェクトの作成とライブラリーの参照
本記事ではVisual Studio 2010とVisual Basicを使用しますが、
まずは、
サインイン処理
それでは、
最初にサインイン ダイアログ

この処理にはIdentityクラスとIdentityManagerクラスを使います。Identityクラスはユーザーを表します。Identityクラスのインスタンス生成にIdentityManagerクラスを使用します。Liveサービスの認証サーバーとのやりとりもIdentityManagerが使われます。Identityオブジェクトの作成とサインイン ダイアログの表示するコードは次のようになります。
' Imports Microsoft.WindowsLive.Id.Client と Import 宣言
' IdentityManager, Identity インスタンス生成
Dim manager = IdentityManager.CreateInstance("LiveSpacesSample;***@live.jp;Live Spaces Sample", "Live Spaces Sample")
Dim identity = manager.CreateIdentity
If Not identity.IsAuthenticated Then
' 認証されていない場合
If identity.Authenticate Then ' ダイアログの表示
' (認証が成功した場合)
Else
' (ユーザーによりキャンセルされた場合)
End If
End If
IdentityManagerのインスタンスは、
Identityのインスタンスは、
チケットの取得
サインインが完了し認証されている状態のとき、
' チケットの取得
Dim ticket = Identity.GetTicket("storage.msn.com", "MBI", True)
GetTicketメソッドの引数は、
このチケットの値を、
ここまでのコードをまとめると次のようになります。IdentityManagerオブジェクトとIdentityオブジェクトを格納する変数はPrivate変数に変更しています。サインイン関連の処理で例外が発生した場合、
Private Manager As IdentityManager
Private Identity As Identity
' Live Spaces アクセス用のチケットを返す
Function GetTicket() As String
Try
Manager = IdentityManager.CreateInstance("LiveSpacesSample;***@live.jp;Live Spaces Sample", "Live Spaces Sample")
Identity = Manager.CreateIdentity
Catch ex As WLLogOnException
Throw
End Try
If Not Identity.IsAuthenticated Then
If Identity.Authenticate Then
Try
' チケットの取得
Dim ticket = Identity.GetTicket("storage.msn.com", "MBI", True)
Return ticket
Catch ex As WLLogOnException
Throw
End Try
Else
' Do nothing
End If
End If
Return Nothing
End Function
実際にチケットを使用しているコードはこの後に紹介します。
カテゴリーの取得
さて前回はLive Spaces MetaWeblog APIを利用して記事の投稿を行いましたが、
新しい記事の投稿はmetaWeblog.
blogid | ブログID Live Spacesの場合自分のブログを表す |
---|---|
username | ユーザー名 |
password | パスワード |
パスワードの値は、
カテゴリー取得の場合、
<methodResponse xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<params>
<param>
<value>
<array>
<data>
<value>
<struct>
<member>
<name>description</name>
<value>Test Posts</value>
</member>
<member>
<name>htmlUrl</name>
<value />
</member>
<member>
<name>rssUrl</name>
<value />
</member>
<member>
<name>title</name>
<value>Test Posts</value>
</member>
</struct>
</value>
<value>
<struct>
<member>
<name>description</name>
<value>Books</value>
</member>
<member>
<name>htmlUrl</name>
<value />
</member>
<member>
<name>rssUrl</name>
<value />
</member>
<member>
<name>title</name>
<value>Books</value>
</member>
</struct>
</value>
</data>
</array>
</value>
</param>
</params>
</methodResponse>
カテゴリーの数だけ構造体を表す<struct>要素が含まれています。その中の、
カテゴリーを取得するコードは次のようになります。
Sub GetCategories()
' パラメーター
Dim blogId = "MyBlog" ' Live Spaces の場合 MyBlog で固定
Dim userName = "***" ' Live Spaces の URL に含む文字列
Dim password = "" ' 秘密のキーワード
' 要求時に送信するXML
Dim requestXml =
<?xml version="1.0" encoding="utf-8"?>
<methodCall>
<methodName>metaWeblog.getCategories</methodName>
<params>
<param><value><string><%= blogId %></string></value></param>
<param><value><string><%= userName %></string></value></param>
<param><value><string><%= password %></string></value></param>
</params>
</methodCall>
' 応答の受信
Dim doc = GetResponse(requestXml)
' カテゴリーの列挙
For Each m In doc...<member>
If m.<name>.Value = "title" Then
Console.WriteLine(m.<value>.Value)
End If
Next
End Sub
送信するXMLにはメソッド名としてmetaWeblog.
Function GetResponse(ByVal requestXml As XDocument) As XDocument
' サービスエンドポイント
Dim serviceEndpoint = "https://storage.msn.com/storageservice/MetaWeblog.rpc"
' 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")
' ■ チケットを使用した認証 ■
Dim ticket = GetTicket()
client.Headers.Add(HttpRequestHeader.Authorization, "WLID1.0 " & ticket)
' 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(Convert.ToInt32(responseStream.Length - bom.Length - 1)) As Byte
For i = 0 To buf.Length - 1
buf(i) = CByte(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()
Return doc
End Function
上記コードの多くの部分は、
Authorization: WLID1.0 ticket_data
ここまでを実行して正しくカテゴリーが取得できたでしょうか? 指定しているパラメーターなどが誤っている場合、
記事の取得と編集
カテゴリーの取得以外に、
- 最近投稿したブログの記事や下書きの記事一覧の取得
- 指定した記事の取得
- 記事の編集
最近の記事一覧の取得
最近投稿した下書きを含む記事を取得してみましょう。前回紹介したmetaWeblog.
最近の記事一覧の取得は、
blogid | ブログID Live Spacesの場合自分のブログを表す |
---|---|
username | ユーザー名 |
password | パスワード |
numberOfPosts | 取得する記事数 |
戻り値、
title | 記事のタイトル |
---|---|
description | 記事の本文 |
postid | 記事のID |
dateCreated | 投稿日時 |
categories | 記事のカテゴリーの配列 |
publish | 記事が公開済みの場合1、 |
実際のコードは次のようになります。
Sub GetRecentPosts()
' パラメーター
Dim blogId = "MyBlog" ' Live Spaces の場合 MyBlog で固定
Dim userName = "***" ' Live Spaces の URL に含む文字列
Dim password = "" ' 秘密のキーワード
Dim numberOfPosts = 20 ' 取得する記事数(最大20)
' 要求時に送信するXML
Dim requestXml =
<?xml version="1.0" encoding="utf-8"?>
<methodCall>
<methodName>metaWeblog.getRecentPosts</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><i4><%= numberOfPosts %></i4></value></param>
</params>
</methodCall>
' 応答の受信
Dim doc = GetResponse(requestXml)
End Sub
指定した記事の取得
記事の投稿や最近の記事一覧の取得などにより記事のIDがわかれば、
blogid | 記事のID |
---|---|
username | ユーザー名 |
password | パスワード |
戻り値は、
コードは次のようになります。
Sub GetPost()
' パラメーター
Dim blogId = "xxx" ' 取得する記事のID (getRecentPosts で取得できる postid)
Dim userName = "***" ' Live Spaces の URL に含む文字列
Dim password = "" ' 秘密のキーワード
' 要求時に送信するXML
Dim requestXml =
<?xml version="1.0" encoding="utf-8"?>
<methodCall>
<methodName>metaWeblog.getPost</methodName>
<params>
<param><value><string><%= blogId %></string></value></param>
<param><value><string><%= userName %></string></value></param>
<param><value><string><%= password %></string></value></param>
</params>
</methodCall>
' 応答の受信
Dim doc = GetResponse(requestXml)
End Sub
記事の編集
今回の最後は記事の編集です。記事の編集、
blogid | 記事のID |
---|---|
username | ユーザー名 |
password | パスワード |
content | 記事の情報の構造体 |
publish | 公開する場合1、 |
content構造体の項目は次の通りです。
title | 記事のタイトル |
---|---|
description | 記事の本文 |
dateCreated | 投稿日時 |
categories | 記事のカテゴリーの配列 |
正常に処理が完了したときの戻り値は、
<methodResponse xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<params>
<param>
<value>
<boolean>1</boolean>
</value>
</param>
</params>
</methodResponse>
コードは次のようになります。
Sub EditPost()
' パラメーター
Dim blogId = "xxx" ' 取得する記事のID (getRecentPosts で取得できる postid)
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.editPost</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 doc = GetResponse(requestXml)
' ブログへ移動
Process.Start("http://" & userName & ".spaces.live.com/blog/cns!" & blogId & ".entry")
End Sub
今回は以上です。前回の内容とあわせると、