■76751 / inTopicNo.4) |
Re[1]: vb.netでLivedoorBlogへ記事投稿 |
□投稿者/ 神戸 (3回)-(2015/08/09(Sun) 13:06:37)
|
改めて質問させていただきます。
前回の返答を参考に文法エラーが出てた箇所を下記のように
修正しデバッグできるようはなりました。
フォーム上にボタンを置きボタンを押すとグーグルの画像を
Blogサイトにアップするという動作確認用サンプルです。
ですが実行させてみると401エラーが発生し止まってしまいました。
色々と調べてみたのですがvb以外の仕様も多く理解できません
この行でエラーストップ
Dim retUp As Byte() = wc.UploadData(LdEntryUrl, "POST", imgBytes) 'ここでエラー:リモートサーバーエラー401
エラーは401(承認失敗?)です
何が問題でどう対処すればいいのでしょうか?
もしかしたらと考えている問題点
Livedoorが提供するAtomPubは新旧の2種類あり使おうとしてるの旧タイプ
新旧の違いによってAtomPubにつかうルートエンドポイントのURLが違う?
Web開発の知識が皆無なので問題点を解決する検索方法もわかりません。
必要になりそうな参考文献
LivedoorのAtomPubの仕様
http://help.blogpark.jp/archives/52288925.html
ソース
FormLoad時に
System.Net.ServicePointManager.Expect100Continue = False
Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button_PicUpload.Click
Dim wc As New WebClient
Dim wc2 As New WebClient
Dim stream As IO.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"←元ソース
'↑を↓へ変更(値はLoad時に設定)
'↓LivedoorBlogアカウントIdを設定
'Dim LdUsername As String = "abc"
'↓BlogアカウントパスワードではなくAtomPubキー生成で作られたパスワードを設定
'Dim LdPassword As String = "1234"←アカウントパスワードではなくAtomPub用パスワードを設定
'↓BlogUrlではなくAtomPubキー生成で作られたルートエンドポイントを設定
'Dim LdEntryUrl As String = "https://livedoor.blogcms.jp/atompub/LivedoorBlogId" ←LivedoorBlogId部分は具体的なBlogIdだったので伏せてます
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(nonce)
bytemain.AddRange(System.Text.Encoding.UTF8.GetBytes(created))
bytemain.AddRange(System.Text.Encoding.UTF8.GetBytes(LdPassword))
Dim sha1 As New SHA1Managed()
Dim passwordDigest As Byte()
passwordDigest = sha1.ComputeHash(bytemain.ToArray())
Dim format As String = "UsernameToken Username=""{0}"", PasswordDigest=""{1}"", Nonce=""{2}"", Created=""{3}"""
Dim wsseHeader As String = String.Format(format, LdUsername, _
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)
TextBox_Top.Text = sr.ReadToEnd() '←ここは拾えてるのでId/Passwordは承認されてる?
'サンプルでグーグルの画像を設定してみた
Dim imgBytes As Byte() = wc2.DownloadData("https://www.google.co.jp/images/srpr/logo11w.png") '←一度ローカルに保存して画像が拾えてるのは確認
wc.Headers.Add("X-WSSE", wsseHeader)
wc.Headers.Add("Content-Type", "image/jpeg")
'Dim retUp As Byte() = wWc.UploadData(imgurl, "POST", imgBytes)
'↓imgurlは存在しない変数、上に使ってないURL変数があったのでそれに変更
Dim retUp As Byte() = wc.UploadData(LdEntryUrl, "POST", imgBytes) 'ここでエラー:リモートサーバーエラー401
TextBox_Bottom.Text = System.Text.Encoding.UTF8.GetString(retUp)
wc.Dispose()
wc2.Dispose()
End Sub
Private Function makeRandamBytes(ByVal ByteLength As Integer) As Byte()
'指定数の文字の乱数を作成
Dim r As New System.Random(1000)
Dim bs As Byte() = New Byte(ByteLength) {}
r.NextBytes(bs)
Return bs
End Function
|
|