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

第23回 Windows Live フォト ギャラリー ── はてなフォトライフ プラグインの作成 Part II

この記事を読むのに必要な時間:およそ 12 分

プラグインの登録

まだ何もメソッドの処理を記述していませんが,Liveアプリケーションがプラグインを認識するための条件は既に満たしています。デバッグにも必要になるので,この時点でビルドしたアセンブリ(DLLファイル)をLiveアプリケーションが参照できるように登録してみましょう。

プラグインの登録はレジストリを編集する必要があります。ここでは直接レジストリエディタ※3を使用して以下のキーと値を追加してください図6⁠。

キーの場所※4

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows Live\PublishPlugins\[任意の名前]

値(いずれも文字列値)

名前
AssemblyPath DLLファイルへの絶対パス(ファイル名を含む)
ClassName 名前空間を含めたプラグインのクラス名
FriendlyName Liveアプリケーションのメニューに表示される名前

図6 レジストリエディタによる編集

図6 レジストリエディタによる編集

追加した後,Live フォト ギャラリーを起動するとアップロードメニューに追加した項目が表示されていると思います。

デバッグに関してですが,Visual Stuidoからデバッグを行う場合はプロジェクトのプロパティのデバッグタブにある開始動作から「外部プログラムの開始」を選択し,Live フォト ギャラリー(WLXPhotoGallery.exe)を選択します。そうするとデバッグ実行時にLive フォト ギャラリーが起動し,ブレークポイントの使用や変数の参照などが可能です。

※3

スタートメニューからファイル名を指定して実行を選択しregeditと入力するとエディタが起動します。必要のないところまで変更しないよう編集には十分注意してください。

※4

Vista 64bit版の場合,HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Windows Live\PublishPluginsが対象のキーとなります。

はてなフォトライフAPIの利用

はてなフォトライフに写真をアップロードするコードは前回の記事中に書いています。前回のコードに少し変更を加えてプラグインクラスに追加します。

前回作成したメソッドは次の3個でした。

  • CreateWsseHeaderValue
  • GetPostUri
  • PostPhoto

そして,XMLを使用するためにImportsステートメントで次のように名前空間を指定していました。

Imports <xmlns="http://purl.org/atom/ns#">
Imports <xmlns:hatena="http://www.hatena.ne.jp/info/xmlns#">
Imports <xmlns:dc="http://purl.org/dc/elements/1.1/">

プラグインでもXMLを扱うためデフォルトの名前空間を次のように変更します。

Imports <xmlns:atom="http://purl.org/atom/ns#"> ' 変更
Imports <xmlns:hatena="http://www.hatena.ne.jp/info/xmlns#">
Imports <xmlns:dc="http://purl.org/dc/elements/1.1/">

この変更に併せてGetPostUriメソッドの以下の部分を変更します。

' <link rel="service.post">要素の取得
' 以下へ変更 Dim elements = From e In document.<feed>.<link> Where e.@rel = "service.post"
Dim elements = From e In document.<atom:feed>.<atom:link> Where e.@rel = "service.post"

PostPhotoメソッドは少し引数が多くなりますが,写真の名前とContent Type(image/jpegnなど)のStringおよびSystem.IO.Streamを引数に加えます。そして,引数の値を使用するようにコードを変更します。写真のバイトデータは引数のStreamから取得し,サーバーへ渡す<entry>要素も以下のコードのように記述します。メソッドの全文を示します。

Protected Shared Sub PostPhoto(ByVal userName As String, ByVal password As String, _
                               ByVal postUri As String, ByVal title As String, ByVal contentType As String, ByVal photoStream As System.IO.Stream)
    ' リクエストの作成
    Dim request = DirectCast(WebRequest.Create(postUri), HttpWebRequest)
    With request
        .Method = "POST"

        ' WSSE認証用
        .Headers.Add(HttpRequestHeader.Authorization, "WSSE profile=""UsernameToken""")
        .Headers.Add("X-WSSE", CreateWsseHeaderValue(userName, password))

        .ContentType = "application/x.atom+xml"
        .Accept = "application/x.atom+xml, application/xml, text/xml, */*"
        .ServicePoint.Expect100Continue = False
    End With

    ' 写真をバイト配列として読み込み
    Dim photoBuffer = New Byte() {}
    Using reader = New System.IO.BinaryReader(photoStream)
        If photoStream.Length <= Integer.MaxValue Then
            photoBuffer = reader.ReadBytes(CInt(photoStream.Length))
        End If
    End Using

    ' <entry>要素
    Dim entry = <entry xmlns="http://purl.org/atom/ns#">
                    <title><%= title %></title>
                    <content mode="base64" type=<%= contentType %>><%= Convert.ToBase64String(photoBuffer) %></content>
                    <hatena:generator url="http://gihyo.jp/dev/serial/01/wl-sdk/" version="1.0">gihyo.jp sample tool</hatena:generator>
                </entry>

    ' <entry>要素をバイト配列へ変換
    Dim entryBuffer = System.Text.Encoding.UTF8.GetBytes(entry.ToString)
    request.ContentLength = entryBuffer.Length

    ' POSTデータ書き込み
    Using stream = request.GetRequestStream
        stream.Write(entryBuffer, 0, entryBuffer.Length)
    End Using

    ' レスポンス取得
    Dim document As XDocument ' (記事中では使用していません)
    Using response = DirectCast(request.GetResponse, HttpWebResponse), _
          reader = New System.IO.StreamReader(response.GetResponseStream, System.Text.Encoding.UTF8)
        document = XDocument.Load(reader)
    End Using
End Sub

作成するプラグインではアップロード先のフォルダを指定しませんので,<dc:subject>要素は前回のコードから削除しています。

CreateWsseHeaderValueメソッドは変更せずに使用します。

著者プロフィール

松江祐輔(まつえゆうすけ)

日本システムウエア株式会社 勤務。現在,ハードウェア設計・検証業務を担当。大学生・大学院生時代はベンチャー企業 有限会社ミレニアムシステムズにプログラマーとして従事。趣味はプログラミング。好きな言語はVisual Basic。Microsoft MVP for Windows Live Platform(Jul 2010 - Jun 2011),Windows Live(Jul 2011 - Jun 2013)。

URL:http://katamari.jp