C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[5]: vb.netでLivedoorBlogへ記事投稿


(過去ログ 129 を表示中)

[トピック内 9 記事 (1 - 9 表示)]  << 0 >>

■76748 / inTopicNo.1)  vb.netでLivedoorBlogへ記事投稿
  
□投稿者/ 神戸 (1回)-(2015/08/09(Sun) 00:10:23)

分類:[VB.NET/VB2005 以降] 

開発環境Visual Studio2010 vb.net

LivedoorBlogにLivedoorBlogが提供してるAtom Pub APIを使いvb.netプログラムから
Blog記事をアップロードするプログラムを作ろうとしてます。

初心者なのでネットでサンプルコードを探し見つけて取り込み動かそうとしてるのですが
見つけたサンプルではエラーが出て詰まってしまいましたので基本的なことを質問させていただきます。

参考にさせて頂いたソースはこちらのBlog
http://swkyh.blogspot.jp/2013/08/atom-pub-apivbnet_1.html
ソースは少し長いのでここに貼るべきか悩みましたがとりえず貼らずに質問します。
もし貼ったほうがいいのでしたらレスのほうが貼らせていただきます。

質問1
上記のソースだと宣言した変数を使うときに変数の頭に小文字のwを付けます
1箇所ではなく何箇所かでやってるのですがこれの意味が理解できません。

Dim nonce As Byte() = makeRandamBytes(40)
bytemain.AddRange(wNonce)
他に
Dim sha1 As New SHA1Managed()
passwordDigest = wSha1.ComputeHash(bytemain.ToArray())

質問2
ソースでは下から2行目にimgurlという変数を宣言せずに使ってますが
これも理解できずに困ってます。

質問3
ソース中にmakeRandamBytes(40)という関数がありますが
説明では「makeRandamBytesで40文字の乱数を作成しています。」と書いてましたが
ソースが無いのでこれも理解できませんでした。
単に40バイト長のランダム文字列を作ってるだけなのでしょうか?
サンプルソースが動けば試行錯誤が出来るのでしょうが動かないので詰まってます。


やりたい事が具体的なので参考になりそうなサンプルを探してまわってますが
使えるサンプルがあるのは上記のBlogだけでした。
初心者の質問ですがよろしくお願いします。
引用返信 編集キー/
■76749 / inTopicNo.2)  Re[1]: vb.netでLivedoorBlogへ記事投稿
□投稿者/ Hongliang (329回)-(2015/08/09(Sun) 07:21:33)
> 質問1
> 上記のソースだと宣言した変数を使うときに変数の頭に小文字のwを付けます
> 1箇所ではなく何箇所かでやってるのですがこれの意味が理解できません。
多分、
・ブログ記事主さんが実際に使っているのでは癖かなにかでw接頭辞をつけていた
・ブログに掲載するに当たって削除することにした
・そこで修正漏れがあった
ってところでしょう。

> 質問2
> ソースでは下から2行目にimgurlという変数を宣言せずに使ってますが
> これも理解できずに困ってます。
処理の内容を見た感じ画像を投稿するもののようです。
LivedoorBlogのAPIを私は知りませんが、画像投稿にはこのURLでAPIを呼び出せというのはありませんか?
記事投稿における"http://livedoor.blogcms.jp/atom/blog/abc/article"のような。

> 質問3
> ソース中にmakeRandamBytes(40)という関数がありますが
> 説明では「makeRandamBytesで40文字の乱数を作成しています」と書いてましたが
> ソースが無いのでこれも理解できませんでした。
> 単に40バイト長のランダム文字列を作ってるだけなのでしょうか?
まあそうじゃないですか?
// 文字列じゃなくてバイト列で十分ぽいけど。
引用返信 編集キー/
■76750 / inTopicNo.3)  Re[2]: vb.netでLivedoorBlogへ記事投稿
□投稿者/ 神戸 (2回)-(2015/08/09(Sun) 09:27:36)
No76749 (Hongliang さん) に返信
返答ありがとうございます。
こちらの知らない文法とかじゃないようなので少しだけ安心しました

返答を参考にソースを試行錯誤して試してみたいと思います
たぶん思った通りの動作をするソースが組めるまで問題山積だと
思ってるので「解決済」にはせずに置かせていただきます。
※同じような質問でスレ乱立をさせないためです。



こちらのやりたい事を少し具体的に書いておきます。

最終目的:
vb.netで作成したhtmlをLivedoorBlogに直接投稿することです。
投稿するにはLivedoorBlogが提供するAtom Pub APIを使い
アップロードするしか方法がありません。

LivedoorBlogが提供するAtom Pub APIには新旧2種類ありますが
新タイプは機能が足りず記事投稿に制限がつくので旧タイプを
利用するのが必須となります。


詳細機能:
Livedoor側の仕様で画像ファイルをアップロードすると
アップロードされたファイル名を自動で変換してしまうので
アップロードした後に変更された画像ファイル名を
取得しないと画像を埋め込んだhtmlが作成できません。
※今作ってるのがその画像をアップロードして戻りで
ファイル名を取得するプログラムです。

ここでは触れていませんがBlogの記事自体をアップロードするには
アップロードするhtmlをxml化してアップロードするのも作ります。

問題点:
Atom Pub APIが理解できてないし理解できるのか心配になってる。
ネット検索にサンプルソースが1つしか見つからなかったのに
コメントが付いてないしエラーが出てたので苦しんでる。

こんな感じですが頑張っていきたいと思います。
引用返信 編集キー/
■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

引用返信 編集キー/
■76753 / inTopicNo.5)  Re[2]: vb.netでLivedoorBlogへ記事投稿
□投稿者/ 神戸 (4回)-(2015/08/09(Sun) 18:19:35)
途中経過
色々と調べていると旧仕様でのアクセスURLは別のようなのでURL変更して試してます


パターン1
vbではないのですが他の言語でやってるのを見ると違うURLでやってるところがあったので
↓に変更
Dim LdEntryUrl As String = "http://cms.blog.livedoor.com/atom/blog_id=" & BlogID 
'このBlogIDは今は表にほどんど出てこないLivedoorで割り振られたIDで数字7桁

これだとエラーは同じ場所でエラーが403
Dim retUp As Byte() = wc.UploadData(LdEntryUrl, "POST", imgBytes)

パターン2
根本的にURLの考え方が間違えてるかもしれないと他のものに変更
Public LdEntryUrl As String = "http://livedoor.blogcms.jp/atom/blog/登録したBlogID/article"

これはvb側でエラーは出ずプログラムは正常終了
ただし画像はアップロードされず返ってきたメッセージではエラーが出てます

出たエラーメッセージは↓
<?xml version="1.0" encoding="utf-8"?>
<error>:1: parser error : Start tag expected, &apos;&lt;&apos; not found
&#65533;PNG
^
 at /usr/local/lib/perl5/site_perl/5.8.8/XML/Atom/Thing.pm line 28</error>
'エラーメッセージここまで

調べてみるとparser errorはPHPの構文エラー?


理解の限界を超えてしまいました
なにが原因なのでしょうか?

引用返信 編集キー/
■76754 / inTopicNo.6)  Re[3]: vb.netでLivedoorBlogへ記事投稿
□投稿者/ ヴァン (14回)-(2015/08/10(Mon) 09:52:46)
こんにちは。

画像投稿用のエンドポイントは、

http://livedoor.blogcms.jp/atom/blog/登録したBlogID/image

だったと思います。

あとリモートサーバーエラーの場合、

ServicePoint.Expect100Continue を false にすると良いかもしれません。




引用返信 編集キー/
■76756 / inTopicNo.7)  Re[4]: vb.netでLivedoorBlogへ記事投稿
□投稿者/ 神戸 (5回)-(2015/08/10(Mon) 12:00:30)
No76754 (ヴァン さん) に返信
> http://livedoor.blogcms.jp/atom/blog/登録したBlogID/image
情報ありがとうございます
その情報を元に調べてみます
引用返信 編集キー/
■76757 / inTopicNo.8)  Re[4]: vb.netでLivedoorBlogへ記事投稿
□投稿者/ 神戸 (6回)-(2015/08/10(Mon) 13:07:30)
No76754 (ヴァン さん) に返信
> 画像投稿用のエンドポイントは、
> http://livedoor.blogcms.jp/atom/blog/登録したBlogID/image

これが正解でした。

無事アップロードできましたし返ってきたxmlから
アップロード後のファイル名の取得もできました
本当にありがとうございます。

画像のアップロードに関しては出来るようになりましたが
続けてBlog本体のアップロードプログラムも作っていきます。

また詰まって質問する可能性が高いので
まだ解決済にはしないでおきます。
引用返信 編集キー/
■76759 / inTopicNo.9)  Re[5]: vb.netでLivedoorBlogへ記事投稿
□投稿者/ 神戸 (7回)-(2015/08/10(Mon) 22:27:54)
大きな問題もなくBlogの記事アップロードは完成しまたので
解決済にさせていただきます。


ありがとうございました
解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -