DOBON.NETプログラミング道掲示板

[ 最新記事及び返信フォームをトピックトップへ ]

■33941 / inTopicNo.1)  レンタルサーバからファイルを取得する方法を教えてください。
  
□投稿者/ 新米 一般人(1回)-(2018/08/02(Thu) 08:40:50)
  • アイコン環境/言語:[win7 VB.net framework4.0 HTTP通信] 
    分類:[.NET] 

    あるレンタルサーバからファイルを
    取得するツールを作成しております。
    ログインしてcookieの取得まではでき、
    ファイルは一応にダウンロード出来ているようですが、
    ダウンロードしたファイルの中身が空の状態です。
    この問題の解決方法を教えてください。
    ダウンロードしたのはテキストファイルです。

    〈参考〉
    ダウンロードに使用している関数は
    WebClientのDownloadFileです。
    WebBrowserでレンタルサーバのページを開き、
    その後、WebBrowserで取得したcookieを
    WebClientに渡して実行しています。

    コードを掲載できておらず申し訳ないですが、
    宜しくお願い致します。

    以上、宜しくお願い致します。
マルチポストを報告
違反を報告
引用返信 削除キー/
■33942 / inTopicNo.2)  Re[1]: レンタルサーバからファイルを取得する方法を教えてください。
□投稿者/ 魔界の仮面弁士 大御所(1137回)-(2018/08/02(Thu) 10:28:53)
  • アイコン2018/08/02(Thu) 10:53:13 編集(投稿者)

    No33941に返信(新米さんの記事)
    > あるレンタルサーバからファイルを
    > 取得するツールを作成しております。
    取得…ということは、アップロードではなくダウンロードですね。

    そのサーバーでは、ファイル転送のプロトコルとして
    何と何をサポートしているのでしょうか。
    ssh, ftp, sftp, scp, http, https …


    > ログインしてcookieの取得まではでき、
    > ファイルは一応にダウンロード出来ているようですが、
    ということは、そのサーバーと言うのは Web サーバーなのですね?
    でもって、http/https でのファイル転送を行いたい、と。

    情報不足で、サーバー側の仕組みが分かりませんが、
    WebDAV とか RESTful な WebAPI を使ったダウンロードを行うのではなく、
    Web ページとして公開されているコンテンツの受信処理なのでしょうか?


    > ダウンロードしたファイルの中身が空の状態です。
    自作ツールではなく、ブラウザやフリーソフト等を用いれば
    ダウンロードできるのでしょうか?

    もしそうなら、レンタルサーバー側のアクセスログから
    リクエストの差異を追跡できないでしょうか。

    もしくは、Microsoft Message Analyzer や Fiddler を用いて
    クライアント側から通信内容を比較してみるとか。


    > ダウンロードしたファイルの中身が空の状態です。
    このとき、サーバー側の HTTPステータスコードは 200 を返してきていますか?
    3xx や 4xx 系のレスポンスという事は無いでしょうか。

    WebClient.DownloadFile で HTTPステータスコードを得るには、
    アプリケーション構成ファイルでネットワークトレースを有効にします。
    https://dobon.net/vb/dotnet/programing/networktrace.html

    もしくは、レンタルサーバー側のアクセスログで追跡するとか。


    > その後、WebBrowserで取得したcookieを
    > WebClientに渡して実行しています。
    情報不足過ぎて、失敗の理由については何とも言えないです。

    サーバーによっては、ユーザーエージェントに応じて
    異なるレスポンスを返すような設計になっているものがあります。
    HTTP キープアライブが切れると再認証を要求するケースもあるかもしれません。

    契約サーバーも、ソースコードも明かせない状況なのであれば、
    まずは通信ログから、想定通りのリクエストが送出されているかどうかを
    調査することから始めてみてはいかがでしょうか。

    リクエストさえ正しければ、期待通りのレスポンスになるはずですよね。
違反を報告
引用返信 削除キー/
■33943 / inTopicNo.3)  Re[2]: レンタルサーバからファイルを取得する方法を教えてください。
□投稿者/ 新米 一般人(2回)-(2018/08/02(Thu) 12:30:08)
  • アイコン
    魔界の仮面弁士 様

    早速のご回答ありがとうございます。
    質問が先行して申し訳ありません。
    コードは別途公開致します。

    No33942に返信(魔界の仮面弁士さんの記事)
    > 2018/08/02(Thu) 10:53:13 編集(投稿者)
    >
    > ■No33941に返信(新米さんの記事)
    >>あるレンタルサーバからファイルを
    >>取得するツールを作成しております。
    > 取得…ということは、アップロードではなくダウンロードですね。
    はい、ダウンロードです。

    > そのサーバーでは、ファイル転送のプロトコルとして
    > 何と何をサポートしているのでしょうか。
    > ssh, ftp, sftp, scp, http, https …
    httpsです。

    >>ログインしてcookieの取得まではでき、
    >>ファイルは一応にダウンロード出来ているようですが、
    > ということは、そのサーバーと言うのは Web サーバーなのですね?
    > でもって、http/https でのファイル転送を行いたい、と。
    はい、その通りです。
    webサーバからhttps通信にてファイルをダウンロード
    したいと考えております。
    ダウンロードしたいファイル形式は、
    exeファイルとiniファイルです。

    > 情報不足で、サーバー側の仕組みが分かりませんが、
    > WebDAV とか RESTful な WebAPI を使ったダウンロードを行うのではなく、
    > Web ページとして公開されているコンテンツの受信処理なのでしょうか?
    行いたいのは、公開コンテンツではなく、
    APIによるダウンロードです。
    WebBrowserを使用しているのは、
    認証がクリアできず、WebBrowserで
    一度認証を通し、cookieを取得するためです。
    (やり方がこれしかわからなかったためです。)

    >>ダウンロードしたファイルの中身が空の状態です。
    > 自作ツールではなく、ブラウザやフリーソフト等を用いれば
    > ダウンロードできるのでしょうか?
    ブラウザのダウンロード機能では
    ファイルのダウンロードができております。

    > もしそうなら、レンタルサーバー側のアクセスログから
    > リクエストの差異を追跡できないでしょうか。
    申し訳ないですが、
    レンタルサーバ側のアクセスログは
    どのように取得すればよいのでしょうか?

    > もしくは、Microsoft Message Analyzer や Fiddler を用いて
    > クライアント側から通信内容を比較してみるとか。
    試してみます。

    >>ダウンロードしたファイルの中身が空の状態です。
    > このとき、サーバー側の HTTPステータスコードは 200 を返してきていますか?
    > 3xx や 4xx 系のレスポンスという事は無いでしょうか。
    確認していませんでした。
    確認してみます。

    > WebClient.DownloadFile で HTTPステータスコードを得るには、
    > アプリケーション構成ファイルでネットワークトレースを有効にします。
    > https://dobon.net/vb/dotnet/programing/networktrace.html
    > もしくは、レンタルサーバー側のアクセスログで追跡するとか。
    参考にしてやってみます。

    >>その後、WebBrowserで取得したcookieを
    >>WebClientに渡して実行しています。
    > 情報不足過ぎて、失敗の理由については何とも言えないです。
    >
    > サーバーによっては、ユーザーエージェントに応じて
    > 異なるレスポンスを返すような設計になっているものがあります。
    > HTTP キープアライブが切れると再認証を要求するケースもあるかもしれません。
    >
    > 契約サーバーも、ソースコードも明かせない状況なのであれば、
    > まずは通信ログから、想定通りのリクエストが送出されているかどうかを
    > 調査することから始めてみてはいかがでしょうか。
    >
    > リクエストさえ正しければ、期待通りのレスポンスになるはずですよね。

    いろいろとアドバイス頂き、
    ありがとうございます。
    出先より戻りましたらコードのアップと
    アドバイス頂いた内容の確認を行います。

違反を報告
引用返信 削除キー/
■33944 / inTopicNo.4)  Re[3]: レンタルサーバからファイルを取得する方法を教えてください。
□投稿者/ 魔界の仮面弁士 大御所(1138回)-(2018/08/02(Thu) 16:15:48)
  • アイコンNo33943に返信(新米さんの記事)
    > 行いたいのは、公開コンテンツではなく、
    > APIによるダウンロードです。
    その API とは、どのようなものでしょうか。
    RESTful? SOAP? もしかして WebDAV とか?


    > 一度認証を通し、cookieを取得するためです。
    > (やり方がこれしかわからなかったためです。)
    それが正しい手順なのかどうかは、情報不足のため判断できません。


    > ブラウザのダウンロード機能では
    > ファイルのダウンロードができております。
    では Fiddler を使って、ブラウザーからのダウンロード時に
    どのようなリクエストが送出されているかを確認してみてください。

    そしてそれを、自作アプリからリクエストした場合と比較してみましょう。


    > レンタルサーバ側のアクセスログは
    > どのように取得すればよいのでしょうか?
    契約業者にお問い合わせください。
    レンタルサーバーの種類と設定によって異なりますし、
    アクセスログを直接公開していない場合もあります。
違反を報告
引用返信 削除キー/
■33945 / inTopicNo.5)  Re[4]: レンタルサーバからファイルを取得する方法を教えてください。
□投稿者/ 新米 一般人(3回)-(2018/08/03(Fri) 08:09:16)
  • アイコン魔界の仮面弁士 様

    いろいろとアドバイス頂きありがとうございます。
    遅くなりましたが、コード掲載させて頂きます。

    *************************************************************************
    wb.Url = New Uri("https://レンタルサーバのURL/")
    wb.Navigate("https://レンタルサーバのURL/")

    Do '開ききるまで待ちます
    Application.DoEvents()
    Loop While wb.ReadyState <> 4 OrElse wb.IsBusy


    Dim hec As HtmlElementCollection = wb.Document.GetElementsByTagName("input")
    Dim he As HtmlElement
    For Each he In hec
    If he.Name = "ftp_account" Then
    he.InnerText = "アカウント"

    Do '開ききるまで待ちます
    Application.DoEvents()
    Loop While wb.ReadyState <> 4 OrElse wb.IsBusy
    ElseIf he.Name = "ftp_password" Then
    he.InnerText = "パスワード"

    Do '開ききるまで待ちます
    Application.DoEvents()
    Loop While wb.ReadyState <> 4 OrElse wb.IsBusy
    End If
    Next

    Dim hec1 As HtmlElementCollection = wb.Document.GetElementsByTagName("form")

    hec1(0).InvokeMember("submit")

    Do '開ききるまで待ちます
    Application.DoEvents()
    Loop While wb.ReadyState <> 4 OrElse wb.IsBusy

    wb.Navigate("https://レンタルサーバのURL/dir/root/test/bbb.txt")

    Do '開ききるまで待ちます
    Application.DoEvents()
    Loop While wb.ReadyState <> 4 OrElse wb.IsBusy


    Dim wc As New WebClient
    wc.Headers.Add(HttpRequestHeader.Cookie, wb.Document.Cookie)

    wc.DownloadFile("レンタルサーバのURL/file/download/root/test.xlsx", "C:\test\test.xlsx")

    wb.Dispose()

    *************************************************************************

    「wc.DownloadFile」でダウンロードしたファイルの中身が空になっています。
    魔界の仮面弁士 様がおっしゃる通り正しくサーバのファイルの場所を
    指定できていないのだと考えています。
    アドバイス頂いた内容はまだ確認できておりませんが、
    確認しましたらご報告させて頂きます。


    No33944に返信(魔界の仮面弁士さんの記事)
    > ■No33943に返信(新米さんの記事)
    >>行いたいのは、公開コンテンツではなく、
    >>APIによるダウンロードです。
    > その API とは、どのようなものでしょうか。
    > RESTful? SOAP? もしかして WebDAV とか?
    >
    >
    >>一度認証を通し、cookieを取得するためです。
    >>(やり方がこれしかわからなかったためです。)
    > それが正しい手順なのかどうかは、情報不足のため判断できません。
    >
    >
    >>ブラウザのダウンロード機能では
    >>ファイルのダウンロードができております。
    > では Fiddler を使って、ブラウザーからのダウンロード時に
    > どのようなリクエストが送出されているかを確認してみてください。
    >
    > そしてそれを、自作アプリからリクエストした場合と比較してみましょう。
    >
    >
    >>レンタルサーバ側のアクセスログは
    >>どのように取得すればよいのでしょうか?
    > 契約業者にお問い合わせください。
    > レンタルサーバーの種類と設定によって異なりますし、
    > アクセスログを直接公開していない場合もあります。
違反を報告
引用返信 削除キー/
■33949 / inTopicNo.6)  Re[5]: レンタルサーバからファイルを取得する方法を教えてください。
□投稿者/ 魔界の仮面弁士 大御所(1139回)-(2018/08/04(Sat) 01:24:09)
  • アイコンNo33945に返信(新米さんの記事)
    > 遅くなりましたが、コード掲載させて頂きます。

    コードも重要ですが、それ以上に、
     * ブラウザーで正常にダウンロードされた時の HTTPS リクエスト内容
     * プログラムからダウンロードが失敗した時の HTTPS リクエスト内容
    を Fiddler 等で取得して、比較するのが手っ取り早い気がします。


    > wb.Url = New Uri("https://レンタルサーバのURL/")
    > wb.Navigate("https://レンタルサーバのURL/")
    この 2 行は同じ意味ですよね。どちらか一方だけで良いのでは。


    > Do '開ききるまで待ちます
    >   Application.DoEvents()
    > Loop While wb.ReadyState <> 4 OrElse wb.IsBusy

    ループ待機は悪手です。DoEvents も避けるべき。
    読み込み完了の待ち合わせには、DocumentCompleted イベントを使うようにしましょう。

    Visual Basic 2012 以降をお使いなら、DocumentCompleted の完了を待つために
    Task(Of HtmlDocument) を Return する Function を作っておくと便利かも。


    > wc.DownloadFile("レンタルサーバのURL/file/download/root/test.xlsx", "C:\test\test.xlsx")
    指定した URL に間違いがない事は確認済みでしょうか?
違反を報告
引用返信 削除キー/
■33950 / inTopicNo.7)  Re[6]: レンタルサーバからファイルを取得する方法を教えてください。
□投稿者/ 新米 一般人(4回)-(2018/08/04(Sat) 19:05:56)
  • アイコン魔界の仮面弁士 様

    返信遅くなりすみません。
    いろいろとアドバイスありがとうございます。

    > コードも重要ですが、それ以上に、
    >  * ブラウザーで正常にダウンロードされた時の HTTPS リクエスト内容
    >  * プログラムからダウンロードが失敗した時の HTTPS リクエスト内容
    > を Fiddler 等で取得して、比較するのが手っ取り早い気がします。
    今まで時間が取れずURLの確認がまだ出来ておりません。
    本日確認を行います。
    確認できましたら報告致します。

違反を報告
引用返信 削除キー/
■33951 / inTopicNo.8)  Re[7]: レンタルサーバからファイルを取得する方法を教えてください。
□投稿者/ 新米 一般人(5回)-(2018/08/07(Tue) 08:11:55)
  • アイコン魔界の仮面弁士 様

    連絡遅くなり申し訳ありません。
    fiddlerで確認しました。
    ダウンロード中のURLについては
    現在確認中です。
    私がダウンロードで送信したメッセージは
    200で応答が帰ってきております。

    使用しているレンタルサーバは
    hetemlftpです。

    もし、hetemlftpから
    VB.netのコードでダウンロードする方法について
    アドバイス頂けることがあればお願い致します。


    No33950に返信(新米さんの記事)
    > 魔界の仮面弁士 様
    >
    > 返信遅くなりすみません。
    > いろいろとアドバイスありがとうございます。
    >
    >>コードも重要ですが、それ以上に、
    >> * ブラウザーで正常にダウンロードされた時の HTTPS リクエスト内容
    >> * プログラムからダウンロードが失敗した時の HTTPS リクエスト内容
    >>を Fiddler 等で取得して、比較するのが手っ取り早い気がします。
    > 今まで時間が取れずURLの確認がまだ出来ておりません。
    > 本日確認を行います。
    > 確認できましたら報告致します。
    >
違反を報告
引用返信 削除キー/
■33952 / inTopicNo.9)  Re[8]: レンタルサーバからファイルを取得する方法を教えてください。
□投稿者/ 魔界の仮面弁士 大御所(1140回)-(2018/08/07(Tue) 08:59:02)
  • アイコンNo33951に返信(新米さんの記事)
    > 私がダウンロードで送信したメッセージは
    > 200で応答が帰ってきております。
    レスポンス(応答)を受け取るための
    リクエスト(要求)の差異を見れば分かりそうですね。


    > 使用しているレンタルサーバは
    > hetemlftpです。
    ヘテムルなら FTPS を使えば良いのでは?
    https://msdn.microsoft.com/ja-jp/library/system.net.ftpwebrequest.enablessl.aspx
    http://ummt.jp/tech/article/index.php?type=csharp&sid=140714_01
違反を報告
引用返信 削除キー/
■33954 / inTopicNo.10)  Re[9]: レンタルサーバからファイルを取得する方法を教えてください。
□投稿者/ 新米 一般人(6回)-(2018/08/07(Tue) 20:45:10)
  • アイコン魔界の仮面弁士さん
    ありがとうございます。

    > レスポンス(応答)を受け取るための
    > リクエスト(要求)の差異を見れば分かりそうですね。
    確認してみます。

    > ヘテムルなら FTPS を使えば良いのでは?
    情報ありがとうございます。
    参考にしてやってみます。
違反を報告
引用返信 削除キー/
■33963 / inTopicNo.11)  Re[10]: レンタルサーバからファイルを取得する方法を教えてください。
□投稿者/ 新米 一般人(7回)-(2018/08/17(Fri) 18:23:16)
  • アイコンNo33954に返信(新米さんの記事)
    魔界の仮面弁士さん

    返信が遅くなり申し訳ありません。

    参考で教えて頂いたFTPのコードにて所得を行ってみたのですが、
    認証がうまくクリアできずにファイルの取得ができませんでした。

    Fiddlerを使用したのですが、リクエストの差分が見つかりませんでした。
    「submit」された際のページにて、サーバ側でダウンロードやアップロードなどの
    コードをjavaで作成しているようです。
    IEの開発者ツールで、ダウンロード実行後のコードを解析し、
    「https://webftp.heteml.jp/file/download/root/setting.ini」という
    URLを作成していることろまではわかったのですが、
    これでファイルを取得しようとすると空のファイルが取得されます。
    「https://webftp.heteml.jp/root/setting.ini」でファイルを取得しようとすると
    添付ファイルのようにHTMLの結果が返ってきます。

    リクエストでファイルの場所が正しく指定できていないことが
    原因と考えているのですが、ファイルの場所を探す方法が検討つかずに
    困っております。
    (それ以外の原因かもしれませんが、それも検討が付きません。)


    何か現状に対してアドバイスを頂けますと助かります。
    いつも丸投げのような質問で申し訳ないですが、
    宜しくお願い致します。

イメージ
tmp.zip
/7KB
違反を報告
引用返信 削除キー/
■33964 / inTopicNo.12)  Re[11]: レンタルサーバからファイルを取得する方法を教えてください。
□投稿者/ sinmai 一般人(1回)-(2018/08/17(Fri) 20:21:22)
  • アイコンNo33963に返信(新米さんの記事)

    魔界の仮面弁士さん

    お世話になります。

    おかげ様でファイルのダウンロードができました。

    FFFTPでファイルのURLがわかったので、
    参考として教えて頂いたコードに設定して実行したところ、
    問題なくファイルのダウンロードに成功しました。

    いろいろとアドバイス頂いて本当にありがとうございました。

    本スレッドはこれにて解決済みとさせて頂きます。
解決み!
違反を報告
引用返信 削除キー/
■33965 / inTopicNo.13)  Re[12]: レンタルサーバからファイルを取得する方法を教えてください。
□投稿者/ 新米 一般人(8回)-(2018/08/17(Fri) 20:24:54)
  • アイコンNo33964に返信(sinmai さんの記事)

    魔界の仮面弁士さん

    Nameがアルファベット表記になっておりました。
    申し訳ありません。
    いろいろとご教授頂き本当にありがとうございました。
解決み!
違反を報告
引用返信 削除キー/



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

このトピックに書きこむ

Mode/  Pass/


- Child Tree -