- ベストアンサー
ホームページのダウンロードがしたい。2
こんにちは。 前回の質問↓ http://oshiete1.goo.ne.jp/kotaeru.php3?q=1134132 の続きなのですが、 先回の回答者様のアドバイスのおかけで、winsockコンポーネントを使ってサイトに接続することができました。 しかし、そこからどのようなコマンドで対象のhtmlファイルを取得するか?で詰まってしまいました。 また、?Winsock1.Stateで確認すると7(接続完了)となっているのですが、Connectイベントが発生しないのは何故なんでしょうか? ここまでの過程として、前回のアドバイスにあるWinInet.dllを使用した方法で、htmlの取得という処理はできたのですが、最終的な対象となるURLがhttps://の為、ユーザ認証をクリアしていませんでした。 当初、IEでユーザ認証を済ませ、その後、HTML取得プログラムを実行すれば問題ないかな!?と思っていましたが甘かったようです。 いろいろ調べていくうち、ソケット(winsock)を使った通信ができれば、ブラウザが行っている処理は全て行えるというような事が書いてあったので、何とかモノにして実現したいと思っています。 どうぞよろしくお願い致します。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
>HttpOpenRequestのPOST処理時や、HttpSendRequest処理時の場合、同期処理になっているのでしょうか? 普通はそうだと思うんですが(^^; InternetOpen()のときにINTERNET_FLAG_ASYNCをセットしてないですか? NULL(=0)で構わないはずです。 もちろん非同期でもCallBack関数を設定してやれば処理できないわけでは無さそうですが(試したわけではないのであくまで予想です)。 http://nienie.com/~masapico/api_InternetOpen.html
その他の回答 (2)
- todo36
- ベストアンサー率58% (728/1234)
>InternetOpen → InternetOpenUrl → InternetReadFile はGETしかできませんが、 > InternetOpen → InternetConnect → HttpOpenRequest はPOSTもできます。 >そこにユーザIDとパスワードを入力し、submitされた時内部のロジックで処理されているものなのですが、これもクリアできるのでしょうか? はい。 回答1の参考URLの「POSTメソッドを送信する」参照。 例えば、教えてgooに自動ログインしてマイページの保存とかも可能でしょう。
お礼
回答ありがとうございます。 >例えば、教えてgooに自動ログインしてマイページの保存とかも可能でしょう。 あまりにうまくいかなかったので、本当に実現できるのか??という不安があったのですが、この回答のおかげで実現できるっ。という確信が持てました。 また、いろいろ思考錯誤してみます。(^人^)
- piyo2000
- ベストアンサー率49% (144/293)
前回でも回答しましたが(^^; >ソケット(winsock)を使った通信ができれば、ブラウザが行っている処理は全て行える そのとおりです。ただし、Socketから実装する場合は対応するプロトコルの実装が必要です。 http://www.int21.co.jp/pcdn/vb/noriolib/vbmag/9807/db_solu/ を読んで頂くと分かると思いますが、例えばHTTPでhtmlなどのファイルをダウンロードするにはGETメソッドを使います。その他にも色々あるので本当はRFCという公式ドキュメント(英語です)を読まないといけないのですが、ただ単にHTMLをダウンロードするだけであれば上記URLで事足りると思います。 また前回私がオススメしたWinInet.dllですが、HttpOpenRequest()でINTERNET_FLAG_SECUREなどの適切なフラグを設定していますか? http://www.cisnet.or.jp/home/tsuneoka/win32tech/4.html が参考になるかもしれません。
お礼
またまた回答ありがとうございます。 先回頂いたアドバイスをもとにいろいろ試行錯誤しております。それにしてもなかなかサクッっといきませんね~。。。(笑) 今回のオススメサイト、ちょっと拝見しました。 そこでまず気になりましたのが、 前回のサイトの接続手順 InternetOpen → InternetOpenUrl → InternetReadFile 今回のサイトの接続手順 InternetOpen → InternetConnect → HttpOpenRequest となっていましたが、これはどちらでも問題ないのでしょうか? また、ユーザ認証といっても、コード401を受信したときのものではなく、通常のテキストボックスが2つあり、そこにユーザIDとパスワードを入力し、submitされた時内部のロジックで処理されているものなのですが、これもクリアできるのでしょうか? いろいろ注文が多くなって申し訳ありませんが、またお時間できましたらご教授くださいませ。 よろしくお願いします。
補足
こんばんは。 おかげさまで、期待していたプログラムを作ることができました。しかし、コードは同じなのにユーザ認証がうまくいったり、いかなかったりで、結構迷宮入りな時がありました。 そこで1つ気になったのが、 HttpOpenRequestのPOST処理時や、HttpSendRequest処理時の場合、同期処理になっているのでしょうか? ユーザ認証をHttpOpenRequestのPOST発行後、次にHttpSendRequestで認証情報を送信し、欲しいHTMLをInternetReadFileで取得するという手順を組んでいるのですが、HttpSendRequest発行後、サーバ側で認証処理が終了する前にInternetReadFileしているような気がしてなりません。 起票の問題の解決策として、HttpOpenRequestやHttpSendRequestの後にsleep関数を置くことで解決できたつもりでいるのですが。。。 もうかなり時間が経っておりますが、お気づきになられたら是非ご回答下さい。お願いします。
お礼
参考サイト、拝見しました。 文面からすると、デフォルトでは同期処理となっているようですね。 INTERNET_FLAG_ASYNCパラメータも確認しましたが、ちゃんと「null」となっていました。 いろいろ???な部分はありますが、とりあえず期待した動きができていますので良しとします。。f^^; 今回のプログラミングは大変勉強になりました。 本当にありがとうございました。