• ベストアンサー

ホームページのダウンロードがしたい。2

こんにちは。 前回の質問↓ http://oshiete1.goo.ne.jp/kotaeru.php3?q=1134132 の続きなのですが、 先回の回答者様のアドバイスのおかけで、winsockコンポーネントを使ってサイトに接続することができました。 しかし、そこからどのようなコマンドで対象のhtmlファイルを取得するか?で詰まってしまいました。 また、?Winsock1.Stateで確認すると7(接続完了)となっているのですが、Connectイベントが発生しないのは何故なんでしょうか? ここまでの過程として、前回のアドバイスにあるWinInet.dllを使用した方法で、htmlの取得という処理はできたのですが、最終的な対象となるURLがhttps://の為、ユーザ認証をクリアしていませんでした。 当初、IEでユーザ認証を済ませ、その後、HTML取得プログラムを実行すれば問題ないかな!?と思っていましたが甘かったようです。 いろいろ調べていくうち、ソケット(winsock)を使った通信ができれば、ブラウザが行っている処理は全て行えるというような事が書いてあったので、何とかモノにして実現したいと思っています。 どうぞよろしくお願い致します。

質問者が選んだベストアンサー

  • ベストアンサー
  • piyo2000
  • ベストアンサー率49% (144/293)
回答No.3

>HttpOpenRequestのPOST処理時や、HttpSendRequest処理時の場合、同期処理になっているのでしょうか? 普通はそうだと思うんですが(^^; InternetOpen()のときにINTERNET_FLAG_ASYNCをセットしてないですか? NULL(=0)で構わないはずです。 もちろん非同期でもCallBack関数を設定してやれば処理できないわけでは無さそうですが(試したわけではないのであくまで予想です)。 http://nienie.com/~masapico/api_InternetOpen.html

参考URL:
http://otoe.kashiko.com/xoops/modules/weblog/details.php?blog_id=254
ssssssssss
質問者

お礼

参考サイト、拝見しました。 文面からすると、デフォルトでは同期処理となっているようですね。 INTERNET_FLAG_ASYNCパラメータも確認しましたが、ちゃんと「null」となっていました。 いろいろ???な部分はありますが、とりあえず期待した動きができていますので良しとします。。f^^; 今回のプログラミングは大変勉強になりました。 本当にありがとうございました。

その他の回答 (2)

  • todo36
  • ベストアンサー率58% (728/1234)
回答No.2

>InternetOpen → InternetOpenUrl → InternetReadFile はGETしかできませんが、 > InternetOpen → InternetConnect → HttpOpenRequest はPOSTもできます。 >そこにユーザIDとパスワードを入力し、submitされた時内部のロジックで処理されているものなのですが、これもクリアできるのでしょうか? はい。 回答1の参考URLの「POSTメソッドを送信する」参照。 例えば、教えてgooに自動ログインしてマイページの保存とかも可能でしょう。

ssssssssss
質問者

お礼

回答ありがとうございます。 >例えば、教えてgooに自動ログインしてマイページの保存とかも可能でしょう。 あまりにうまくいかなかったので、本当に実現できるのか??という不安があったのですが、この回答のおかげで実現できるっ。という確信が持てました。 また、いろいろ思考錯誤してみます。(^人^)

  • piyo2000
  • ベストアンサー率49% (144/293)
回答No.1

前回でも回答しましたが(^^; >ソケット(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 が参考になるかもしれません。

参考URL:
http://www.cisnet.or.jp/home/tsuneoka/win32tech/4.html
ssssssssss
質問者

お礼

またまた回答ありがとうございます。 先回頂いたアドバイスをもとにいろいろ試行錯誤しております。それにしてもなかなかサクッっといきませんね~。。。(笑) 今回のオススメサイト、ちょっと拝見しました。 そこでまず気になりましたのが、 前回のサイトの接続手順 InternetOpen → InternetOpenUrl → InternetReadFile 今回のサイトの接続手順 InternetOpen → InternetConnect → HttpOpenRequest となっていましたが、これはどちらでも問題ないのでしょうか? また、ユーザ認証といっても、コード401を受信したときのものではなく、通常のテキストボックスが2つあり、そこにユーザIDとパスワードを入力し、submitされた時内部のロジックで処理されているものなのですが、これもクリアできるのでしょうか? いろいろ注文が多くなって申し訳ありませんが、またお時間できましたらご教授くださいませ。 よろしくお願いします。

ssssssssss
質問者

補足

こんばんは。 おかげさまで、期待していたプログラムを作ることができました。しかし、コードは同じなのにユーザ認証がうまくいったり、いかなかったりで、結構迷宮入りな時がありました。 そこで1つ気になったのが、 HttpOpenRequestのPOST処理時や、HttpSendRequest処理時の場合、同期処理になっているのでしょうか? ユーザ認証をHttpOpenRequestのPOST発行後、次にHttpSendRequestで認証情報を送信し、欲しいHTMLをInternetReadFileで取得するという手順を組んでいるのですが、HttpSendRequest発行後、サーバ側で認証処理が終了する前にInternetReadFileしているような気がしてなりません。 起票の問題の解決策として、HttpOpenRequestやHttpSendRequestの後にsleep関数を置くことで解決できたつもりでいるのですが。。。 もうかなり時間が経っておりますが、お気づきになられたら是非ご回答下さい。お願いします。

関連するQ&A

  • WinINet関数について質問です。

    WinINet関数を使いVCプログラムしています。 HTMLをダウンロードしてきて、情報を解析しているのですが。 InternetOpen InternetOpenUrl ↓ InternetReadFile 手順で、HTMLの所得はできるのですが、 ユーザー認証がいるサイトの情報を取る方法がわかりません。 (例えば:mixi,facebookなど) WinINet関数を使用してサイトにログインしてから、 指定のURLのHTMLを取得する様な感じだと思っているのですが、やり方がわかりません。 参考になる、サイト等知っている方がいましたら、教えて頂けると嬉しいです。

  • 現在の接続先の取得方法

    SQL*Plus を使用して、作業した後、 接続先は同じままユーザを変える時 connect ユーザ/パスワード@接続先 と入力しますが、この接続先を毎回入力するのが煩わしいので、 なんとか省略できないものかと思ってます。 ユーザ名を引数として受け取り、現在の接続先を自動的に取得して、 同じ接続先に connect するSQLファイルを作成しようとしているのですが、 現在の接続先を取得するにはどうしたらよいのでしょうか?

  • 認証画面を作成したいのですが・・・。

    ASPでユーザー認証認証画面を作成したのですが、 (ユーザIDとパスワードを入れて次画面に移動する画面) 認証後表示された画面で『ブックマーク』に追加されてしまうと ユーザ認証の意味が無くなってしまいます。何かいい方法はないでしょうか?? 出来れば、ユーザ認証画面は、対象者をデーターベースから取得して判断しているのでASPで作成したいのですが・・・。 回答を宜しくお願い致します。

  • postgresのことで質問があります。

    質問させて下さい。 PostgreSQLに接続してデータを取得しそのデータを 別テキストファイルに記述する処理(test.php)を作成しました。 このtest.phpをWEB(ブラウザ)からアクセスすると 別テキストファイルが正常に作成されますが、 LINUXのコマンドラインから php /home/httpd/test.phpと 実行するとpg_connectが出来ません。 恐らくそのファイルを実行するユーザと DBに接続するユーザの関係だと考えたのですが どうもうまくわかりません。 アドバイスを下さい。 ※質問自体わかりにくいのですが、質問していただければすぐに回答しますので宜しくお願いいたします。

    • 締切済み
    • PHP
  • AccessとMSDEの接続が端末によって出来ない

    現在MSDEをデータベースにAccess2000(ADP)にて開発をしています。 開発環境では接続できますが、クライアント環境にファイルを持って行ったら接続テストが通りませんでした。 混合認証モードにし、接続設定にSQLServer認証のID,PASSを保存 サーバー側のユーザー(Admin)グループに対象ユーザーを追加しました。 ただ、他の端末(本プログラム開発にかかわっていない開発端末)では接続できました。 何を確認したら宜しいでしょうか。 何かアドバイスいただけたら嬉しいです!

  • wsock32を利用したFTPクライアントプログラム

    VBAでwsock32を利用したFTPクライアントプログラムを作成中です。 ソケット作成後FTPサーバーにポート21で接続まではできました。 接続後にrecv関数をステップインで実行すると 「220 myserver FTP server (Version ***) ready.」 が返ってきます。 しかし、接続してrecv関数を実行する処理を実行すると 何もrecv関数で返り値を取得できません。 どうすればステップイン実行をしない場合でも正しく返り値を取得できますか? その後「USER username」をsend関数で送ろうとしていますが、うまくいきません。send関数で送る文字列やタイミングを教えてください。 FTPサーバーに接続->認証->ファイル取得を行いたいのですがまず認証までを解決したいです。よろしくお願いします。 以下コード抜粋---------------------------------------------- 'WinSock初期化 ret = WSAStartup(&H101, mwsad) 'ポート指定 port = 21 'ホスト名解決 phostent = gethostbyname("myserver") 'Socket準備 msocket = socket(AF_INET, SOCK_STREAM, 0) 'ポインタからHostEnt構造体設定 Call MoveMemory(lhostent, ByVal phostent, Len(lhostent)) Call MoveMemory(lAddrList, ByVal lhostent.h_addr_list, 4) Call MoveMemory(lSinAddr, ByVal lAddrList, lhostent.h_length) 'sockaddr構造体設定 msockaddr.sin_family = AF_INET msockaddr.sin_port = htons(port) msockaddr.sin_addr = lSinAddr msockaddr.sin_zero = String$(8, 0) 'Connect ret = connect(msocket, msockaddr, Len(msockaddr)) 'WSAAsyncSelect ret = WSAAsyncSelect(msocket, hwnd, WM_USER, FD_READ Or FD_CLOSE Or FD_CONNECT Or FD_WRITE Or FD_ACCEPT) 'recv ret = recv(msocket, buf, Len(buf), 0) bufはString * 1024で定義しています 'send lenbuf = Len("USER username") buf() as byte = StrConv(strCommand, vbFromUnicode) ret = send(msocket, buf(0), lenbuf, 0)

  • TTSSH(Tera Term)でマクロによるSSH自動ログインの仕方

    マクロによるSSH接続での自動ログインが出来なくて困っています。 googleで色々検索した結果、以下のconnect文が載っている参考サイトを見つけたのですが、ログインが出来ませんでした。 参考サイトに載っていた内容 connect 'myserver /ssh /1 /auth=password /user=username /passwd=password' ※ /auth=passwordはパスワード認証 上記を参考にマクロを組んでいるのですが、ユーザー名とパスフレーズが上手く引き渡されません。 どなたか、マクロによるSSH接続の自動ログインの仕方が分かる人がいらっしゃいましたら、教えて頂けませんか?

  • php +MS SQL server

    phpでMSSQLサーバへ接続しようとしています。 WINDOWS/system32にはntwdblib.dll を、 php.iniにはextension=php_mssql.dll のコメントを外してあります。 ですが、phpinfo()を見ても、mssqlの記述がなく、 mssql_connect('database','user','password')を記述すると、undefined function となってしまいます。 何か接続に必要な処理が足りないのでしょうか。 どなたかアドバイスお願いします。

    • ベストアンサー
    • PHP
  • SQL Server 2008とPHPの連携

    $DBHost = '\SQLEXPRESS'; $DBUser = 'sa'; $DBPass = 'password'; $DB = 'database'; $r = mssql_connect($DBHost, $DBUser, $DBPass); として接続しようとしているのですがうまくいきません Management Studioでは サーバー名 OWNER-PC\SQLEXPRESS 認証 SQL Server認証 ユーザー sa パスワード password でちゃんと接続出来ます 環境は Windows 7 32bit XAMPP(apache2.2 + PHP5.3) でやっています 上記のソースで実行すると Fatal error: Call to undefined function mssql_connect() in C:\public_html\conf\config.php on line 7 というエラーが出て7行目は $r = mssql_connect($DBHost, $DBUser, $DBPass); これになっています $DBHostをlocalhost\SQLEXPRESSなどにしてもうまくいきません php.iniのextension=php_mssql.dllもちゃんとセミコロンははずしてあります 何か間違っているでしょうか? アドバイスよろしくお願いします

    • 締切済み
    • PHP
  • WinSockを使ってのプリンタ接続・データ送信

    現在LANで接続されたプリンタに文字列を印字させるプログラムを作成しているのですが、プリンタ側のIPアドレス、使用するポート(今回は1024という指定があったのでそれに設定)を設定し、印字処理をはしらせたのですが、そこでエラーが発生してしまいます。簡略化していますが、プログラムは Private sckWinsock As Winsock Set sckWinsock = Winsock1 sckWinsock.Protocol = sckTCPProtocol sckWinsock.RemoteHost = "192.168.0.***" sckWinsock.RemotePort = 1024 sckWinsock.LocalPort = 0 sckWinsock.Connect strData = "テスト印字" sckWinsock.SendData strData sckWinsock.Close エラーは sckWinsock.SendData strData ここで発生し、『指定したトランザクションまたは要求のプロトコルまたは接続状態に問題があります。』とでます。 PINGはちゃんと通りますし、プリンタ設定にあるテスト印字は問題なく機能するので、プリンタとの接続がまずいとは思えないのですが・・・ WinSockを使うのは初めてなので勝手がわからなく苦戦中です どなたかわかる方、お返事お待ちしています

専門家に質問してみよう