使ってみよう! Windows Live SDK/API

第39回Live Spaces API/SDK(1)─⁠─ブログへ投稿

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 オプションメニュー 図1 オプションメニュー

移動したページで、メールからの投稿を有効にします。このページでは、投稿に使用するメールアドレスと秘密のキーワードと呼ばれる文字列を設定します図2)。

図2 電子メール投稿の設定
図2 電子メール投稿の設定

キーワードを組み合わせたメールアドレス宛へ指定したメールから投稿することで、メールからの投稿が可能になります。メールに写真を添付することで、フォトアルバムへ写真の投稿も可能です。メールした内容をすぐに記事としてブログへ投稿するか、下書きとして保存するかも設定できます。

この方法を利用して投稿する場合、プログラムでは次のように記述できます。以下は、Visual Basicを使用したメールの送信方法です。

' 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は、ブログの操作のために作られた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によるサインイン画面
図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)の場合は適宜修正が必要です。

' 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を指定しましょう。

サーバーからの応答は、正常に投稿できた場合、次のような記事の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を参照し、その記事のページへ移動しています。


今回はここまでです。次回は今回と異なる認証方法や、ブログの操作を紹介する予定です。

おすすめ記事

記事・ニュース一覧