2013年8月1日木曜日

ライブドアブログのAtom Pub APIで投稿する(VB.NET)

ライブドアブログでAtom Pub APIでの記事投稿ができます。
しかし正式に対応しているわけではないらしく、仕様などについての情報がかなり少なめです。

Atom Pub APIについて
http://help.blogpark.jp/archives/52288925.html

これだけなんです。
ググって他のブログなどを参考にしつつ、VB.NETでなんとか投稿できるようになりました。そのコードが以下です。
Dim wc As New WebClient
Dim wc2 As New WebClient
Dim stream As Stream
Dim sr As StreamReader
Dim enc As Encoding = Encoding.UTF8

Dim username As String = "abc"
Dim password As String = "1234"
Dim upurl As String = "http://livedoor.blogcms.jp/atom/blog/abc/article"

Dim nonce As Byte() = makeRandamBytes(40)
Dim created As String = DateTime.Now.ToString("yyyy-MM-ddTHH:mm:ssZ")

Dim bytemain As New List(Of Byte)
bytemain.AddRange(wNonce)
bytemain.AddRange(System.Text.Encoding.UTF8.GetBytes(created))
bytemain.AddRange(System.Text.Encoding.UTF8.GetBytes(password))

Dim sha1 As New SHA1Managed()
Dim passwordDigest As Byte()
passwordDigest = wSha1.ComputeHash(bytemain.ToArray())

Dim format As String = "UsernameToken Username=""{0}"", 
PasswordDigest=""{1}"", Nonce=""{2}"", Created=""{3}"""
Dim wsseHeader As String = String.Format(format, username, 
Convert.ToBase64String(passwordDigest), 
Convert.ToBase64String(nonce), created)


wc.Headers.Add("X-WSSE", wsseHeader)
stream = wc.OpenRead("http://livedoor.blogcms.jp/atom/")
sr = New StreamReader(stream, enc)

literal1.Text = wSr.ReadToEnd()

Dim uploadXml As String = "<?xml version=""1.0"" encoding=""utf-8""
?>" & vbNewLine _
& "<entry xmlns=""http://www.w3.org/2005/Atom""" & vbNewLine _
& "    xmlns:app=""http://www.w3.org/2007/app""" & vbNewLine _
& "    xmlns:blogcms=""http://blogcms.jp/-/spec/atompub/1.0/"">"
 & vbNewLine _
& "    <title>テスト</title>" & vbNewLine _
& "    <updated>" & created & "</updated>"
 & vbNewLine _
& "    <published>" & created & "</published>"
 & vbNewLine _
& "    <author><name>abc</name></author>"
 & vbNewLine _
& "    <blogcms:source>" & vbNewLine _
& "        <blogcms:body><![CDATA[<p>ボディ</p
>]]></blogcms:body>" & vbNewLine _
& "        <blogcms:more><![CDATA[<p>更に読むの内容
</p>]]></blogcms:more>" & vbNewLine _
& "    </blogcms:source>" & vbNewLine _
& "    <app:control>" & vbNewLine _
& "        <app:draft>yes</app:draft>" & vbNewLine _
& "    </app:control>" & vbNewLine _
& "</entry>"
Dim uploadBytes As Byte() = System.Text.Encoding.UTF8.GetBytes(uploadXml)
wc.Headers.Add("X-WSSE", wWsseHeader)
Dim retUp As Byte() = wWc.UploadData(upurl, "POST", uploadBytes)

literal1.Text = System.Text.Encoding.UTF8.GetString(retUp)


makeRandamBytesで40文字の乱数を作成しています。

XMLが微妙に違っていたりするとダメだったりするみたいです。
インデントしたら大丈夫になったり?とかなんだかいろいろやってたので違うかもしれないですが、とにかく苦労しました。

あと、画像のアップロードがさらに大変だったのですが、、次の記事で。。


0 件のコメント:

コメントを投稿