2013年8月1日木曜日

ライブドアブログのAtom Pub APIで画像をアップロードする(VB.NET)

ライブドアブログのAtom Pub APIでの記事投稿に続いて、画像のアップロードです。
記事投稿よりもXMLがない分、コードはスッキリしているのですが、逆に悩みました。

他にAtom Pubに対応しているso-netやはてななどの仕様をみてみると、XMLで画像データはbase64でエンコードしてアップしているのでそのようにしてみたのですが、エラーでアップ出来ません。

どうも間違っていそうなのでググってみると、ヘッダにContent-Typeを指定して、画像はバイト配列のまま送信でいいようでした。
以下は、他のWebサーバ上のjpeg画像をダウンロードして、それをライブドアブログにアップロードするコードです。

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 imgBytes As Byte() = wc2.DownloadData("http://example.com/example.jpg")
wc.Headers.Add("X-WSSE", wsseHeader)
wc.Headers.Add("Content-Type", "image/jpeg")
Dim retUp As Byte() = wWc.UploadData(imgurl, "POST", imgBytes)

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

今日は1日これで悩みましたが、なんとかできてよかったです。
明日はこれを使って実装です。
がんばります。


[2013-08-05追記]
これでもどうもうまくアップできず、サーバーがエラーを返してくる時があるようです。
ASP.NETのせいなのかどうなのか、、よくわからないのですが。。
以下のコードをページのLoadなどに入れるとうまくいくようでした。

System.Net.ServicePointManager.Expect100Continue = False

なんとなくまだ不安定なのですが、しばらく様子見です。

0 件のコメント:

コメントを投稿