ダウンロードツールの制作で質問

タグの編集
投稿者 piyo  (社会人) 投稿日時 2011/3/30 21:52:59
サイト丸ごとダウンロードしたいときや、掲示板で投稿されている画像を一括で
ダウンロードしたいときのために、ダウンロードツールを制作しました。
多くの場合、問題なくダウンロードできるのですが、時々REFERERやクッキー情報
が適切でないと403になってしまうときがあります。
が、その都度InetSpyという下記ツールを使用してリクエスト情報を調べて、
WebRequest、WebResponseに設定してあげることでダウンロードできていました。
http://hide.maruo.co.jp/software/inetspy.html

先日、一括でダウンロードしたいサイトがあったので、制作したツールで
ダウンロードしようとしたのですがどうもうまくいきませんでした。
IEではダウンロードできているファイルがWebRequest、WebResponseだと
ダウンロードできません。
リクエスト情報はInetSpyを使用して同じに設定したつもりなのですが、下記のように違った応答が返ってきます。

●IEなどのブラウザでダウンロードした場合
HTTP/1.1 200 OK
Date: Wed, 30 Mar 2011 11:59:30 GMT
Server: Apache/2
X-Powered-By: PHP/5.2.12
Cache-Control: no-cache, must-revalidate
Cache-Control: post-check=0, pre-check=0
Pragma: no-cache
Expires: Thu, 01 Dec 1994 16:00:00 GMT
Last-Modified: Wed, 30 Mar 2011 11:59:30 GMT
Vary: Accept-Encoding,User-Agent
Content-Encoding: gzip
Keep-Alive: timeout=2, max=100
Proxy-Connection: Keep-Alive
Connection: Keep-Alive
Transfer-Encoding: chunked
Content-Type: image/jpeg

●WebRequest、WebResponseを使用した場合
HTTP/1.1 200 OK
Date: Wed, 30 Mar 2011 12:15:18 GMT
Server: Apache/2
X-Powered-By: PHP/5.2.14
Vary: Accept-Encoding,User-Agent
Content-Encoding: gzip
Content-Length: 20
Content-Type: text/html

ダウンロード部のコードは、下記URLとほぼ同じものです。
これに必要に応じてREFERER等の設定を追加して使っています。
http://dobon.net/vb/dotnet/internet/webrequest.html


VBの質問とは少し離れているとは思うのですが、詳しい方がいらっしゃいましたら
ヒント頂けると助かります。
ご不明点ありましたら返答ください。
よろしくお願いします。

(具体的なサイトのURL掲載は控えさせてください。)
投稿者 るきお  (社会人) 投稿日時 2011/3/30 22:19:51
HTTPのリクエストはまったく同じ(になっているはず)なのに、HTTPレスポンスが異なるということですね?

リクエストしているパソコンやOSなどの環境もまったく同じなのですよね?

とすると、サーバー側で稼働しているアプリケーションがステートレスな構造になっていなくて、
その直前のリクエストや、もっと前のリクエストによって処理を切り分けている可能性があります。

たとえば、ログインしてから何か操作するサイトの場合、
何かの操作に関してまったく同じリクエストを送っても、その前にログインのリクエストをしているかどうかで反応が変わります。
ログインは例であって、意識していないようなクリックや遷移がサーバー側では重要なファクターとして扱われ、それを経たリクエストと経ていないリクエストを区別しているかもしれません。
クッキーを受け取っている場合にも差が出る可能性があります。(同じようにリクエストにクッキーを含めたとしても)

ところで、自作プログラムからアクセスした場合のレスポンスでhtmlが帰ってきているようですが、
そのhtml内にこのことのヒントになるようなエラーメッセージのようなものが載っていることはありませんか?
投稿者 piyo  (社会人) 投稿日時 2011/3/30 22:46:41
ご回答ありがとうございます。

>HTTPのリクエストはまったく同じ(になっているはず)なのに、HTTPレスポンスが異なるということですね?

その通りです。

>リクエストしているパソコンやOSなどの環境もまったく同じなのですよね?

同じです。
IEもソフトも同一の環境から実行しました。

>ところで、自作プログラムからアクセスした場合のレスポンスでhtmlが帰ってきているようですが、
>そのhtml内にこのことのヒントになるようなエラーメッセージのようなものが載っていることはありませんか? 

エラーメッセージ等は載っていないようでした。

>とすると、サーバー側で稼働しているアプリケーションがステートレスな構造になっていなくて、
>その直前のリクエストや、もっと前のリクエストによって処理を切り分けている可能性があります。

ステートレスという考え方は知りませんでしたが、その可能性もある思い、IEで直前にダウンロードしているファイルを、
ソフトでもダウンロードするようにしてみましがダメでした。
ですが、直前ではなくもっと前の遷移も見られている可能性もあるとのことですので試してみたいと思います。
ありがとうございました。
また後日結果書き込みます。
投稿者 YuO  (社会人) 投稿日時 2011/3/30 23:29:33
本当に同じサーバーにアクセスしていますか。
X-Powered-Byに書かれているPHPのバージョンが異なるので,疑っているのですが……。
投稿者 piyo  (社会人) 投稿日時 2011/3/30 23:40:24
書き込みありがとうございます。

質問で書き込んだ例は、確かに下記のように異なるサーバーのものでした。
http://**01.*****.**/
http://**02.*****.**/
※いろんなファイルでテストしていたため、書き込むときに誤ってしまったようです。すみません。

上記IEの例、と同じファイルで試したところ、下記のような応答となり、PHPの
バージョンは同じのようです。

HTTP/1.1 200 OK
Date: Wed, 30 Mar 2011 15:32:52 GMT
Server: Apache/2
X-Powered-By: PHP/5.2.12
Vary: Accept-Encoding,User-Agent
Content-Encoding: gzip
Content-Length: 20
Content-Type: text/html
投稿者 piyo  (社会人) 投稿日時 2011/4/1 00:32:21
おかげさまで無事ダウンロードすることができました。
ありがとうございます。

るきおさんのご指摘通り、前にアクセスしているファイルがポイントでした。
厳密に言うと少し違ったのですが、いずれにせよ目的のものより
前にアクセスしているファイルが解決の糸口となりました。

また質問させていただくかもしれませんが、よろしくお願いたします。