IE以外のブラウザでweb上のデータを取得するには?

解決


eku  2008-01-09 16:43:54  No: 138565  IP: 192.*.*.*

はじめまして。質問をお願いします。
http://madia.world.coocan.jp/vb/vb_bbs/200601/200601_06010071.html
こちらの過去ログを参考にWEBサイトのソースや画像を取得するプログラムを作っていたのですが、学校で実行したところ403エラーになってしまい、調べたところこれらはIEを使った機能であることを知りました。学校のブラウザはMozilla FirefoxでIEは使えません。
もう1つの手段として考えていたWebBrowserコントロールもどうやらIEでしか使えないようなので(こちらは学校のPCの設定ではコンポネートの追加が出来ないので試してはいません)、他の方法を自分なりに調べてみましたが方法は見つかりませんでした。
どなたかIE以外のブラウザでWEB上のデータを取得する方法を教えてください。よろしくお願いします。

編集 削除
eku  2008-01-09 16:45:29  No: 138566  IP: 192.*.*.*

すみません言い忘れてました。VB6.0です。よろしくお願いします。

編集 削除
魔界の仮面弁士  2008-01-09 17:00:44  No: 138567  IP: 192.*.*.*

> 403エラーになってしまい
403 という事は、「アクセス拒否」ですね。

そのサイトへのアクセスが、ファイアウォールで制限されていたり、
あるいは、認証を必要とするサイトだったりはしませんか?
(ブラウザからであれば、その URL にアクセスできるのでしょうか?)

> 学校のブラウザはMozilla FirefoxでIEは使えません。
標準のブラウザが何であれ、IE は既定でインストールされているかと。

それに、元のコードは MSXML4 を使った方法ですので、
IE は直接的には関係無いような気がします。
実行環境には、どのバージョンの MSXML が導入されているのでしょうか?

編集 削除
eku  2008-01-09 17:58:42  No: 138568  IP: 192.*.*.*

早速の返信ありがとうございます。説明が足りずすみませんでした。

IEはインストールされているのですが、学校側が制限していて
学内のHPしか見れないようになっています。ブラウザからでも見えません。

MSXML4は、responseStreamプロパティがIE専用という記事を見て、それと混ざっていました。
.responseTextでソースを取得してそれを解析して画像のアドレスを求め、
その画像.responseStreamで取得するというプログラムなのですが、
実際に動かすとSendした後のStatusが403になってしまいソース部分には
エラー画面のソースが入ってしまいます。responseStreamはまだ関係ありませんでした。

MSXMLのバージョンですが、参考にした記事のまま4.0だと動かなく
"Msxml2.XMLHTTP"としていたのですが、今調べたところ3.0で動いたので
3.0だと思います。

編集 削除
魔界の仮面弁士  2008-01-09 18:08:11  No: 138569  IP: 192.*.*.*

> 学内のHPしか見れないようになっています。ブラウザからでも見えません。

IE だけでなく、Mozilla Firefox でも見えないのでしょうか?

学内のプロキシサーバ側で、URL ごとに接続制限をかけているのだとしたら、
別の通信手段(モデムでの接続など)を使わない限り、無理かと思います。

# ユーザエージェントで判断しているのなら、抜け道はありそうですけれども。

編集 削除
eku  2008-01-09 18:19:54  No: 138570  IP: 192.*.*.*

また言葉が足りずすみませんでした。

Mozilla Firefox では見ることが出来ます。
制限の方法はわかりませんが、IE のみ、許可したドメイン(おそらく学内HPだけ)
にしか接続できない、という風にしてあるのだと思います。

おそらく URL ごとに制限しているわけではないと思うのですが、何か方法は
ありますでしょうか?

編集 削除
魔界の仮面弁士  2008-01-09 18:32:16  No: 138571  IP: 192.*.*.*

ブラウザのプロキシ設定はどうなっているのか、が気になりますが、
もし、アプリ別の対応ではなく、ユーザエージェントによる判断であれば、
  .SetRequestHeader "User-Agent", Text1.Text
などのようにして、ブラウザを偽装できる可能性があります。

編集 削除
ぼうい  2008-01-10 02:29:46  No: 138572  IP: 192.*.*.*

>許可したドメイン(おそらく学内HPだけ)
>にしか接続できない、という風にしてあるのだと思います。

学校(大学?)というまともな団体が規制しているのだからそれなりの理由があると思う。
それにもかかわらず情報がほしいのなら情報の提供者であるHP管理者に問い合わせるべきでは?

>ブラウザを偽装できる可能性があります。

このような手段を使って情報を取得することを管理者は許可しているのでしょうか?

編集 削除
eku  2008-01-17 17:35:34  No: 138573  IP: 192.*.*.*

魔界の仮面弁士様、ぼうい様、返信ありがとうございます。
時間が空いてしまいすみませんでした。

>   .SetRequestHeader "User-Agent", Text1.Text
> などのようにして、ブラウザを偽装できる可能性があります。
その方法で見事できました!  IE専用と聞いていた .responseStream の方も
偽装することができました。

しかしながら、学校の課題のため欲しかった情報だったので仕組み?を
説明する必要があり、
>     G(0) = &H7BF80980
>     G(1) = &H101ABF32
>     G(2) = &HAA00BB8B
>     G(3) = &HAB0C3000
の部分等が理解できなく(16進数というのはわかりましたが)、
WebBrowser を使った方法で行うことにしました。こちらもユーザエージェント
の設定が出来るようなので文法等を調べ実行してみたのですが上手くいかず、
結局「学校では制限されてて出来ない」という仕様のプログラムということで
済ませてしまいました。

時間を割いて助言してくださったのに生かすことがなくて
申し訳ありませんでした m(_ _)m


> このような手段を使って情報を取得することを管理者は許可しているのでしょうか?
授業や勉強のためなら恐らく問題ないと思います。ですが念のため行うのであれば
許可を取った方がいいですね

編集 削除
魔界の仮面弁士  2008-01-17 20:28:57  No: 138574  IP: 192.*.*.*

> IE専用と聞いていた .responseStream の方も
IE専用?
なんだか、Ajax 関連の情報とゴッチャになっているような気がします。

MSXML は、IE による Ajax で使われるオブジェクトですし、
他のブラウザの Ajax で responseStream が使えないのは事実ですが、
先のコードが、Ajax によるコードというわけでは無いですし。


>>     G(0) = &H7BF80980
>>     G(1) = &H101ABF32
>>     G(2) = &HAA00BB8B
>>     G(3) = &HAB0C3000
これは、「IID_Picture インターフェイス」を表す ID です。
GUID 表記では {7BF80980-BF32-101A-8BBB-00AA00300CAB} となります。


> の部分等が理解できなく(16進数というのはわかりましたが)、
これを、OleLoadPicture という API の第4引数に指定しています。
これは、画像データを Picture オブジェクトに変換するために必要でした。

第1引数:画像データを持ったストリーム(IStreamインターフェース)
第2引数:読み込みサイズ
第3引数:KeepOriginalFormatの指定
第4引数:データの返却方式を表すインターフェイスID
第5引数:返却値(生成されたPictureオブジェクトが返される)


なお、データのダウンロードだけなら、この API を使う必要はありません。
responseStream プロパティを使う代わりに、responseBody プロパティを使って、
  Dim b() As Byte
  b = O.responseBody
とすれば、データのバイナリがそのまま返されます。
あとはそれを、Put # ステートメント等でファイルとして保存してやるだけです。
(それが画像であるなら、LoadPicture 関数を使って画面に表示できます)


また、WebBrowser や MSXML といった ActiveX コンポーネントに頼らずとも、
VB6 には標準で、ファイルをダウンロードする機能が標準で用意されていますよ。

-----------
1. [プロジェクト]メニューから、[ユーザーコントロールの追加]を選択。
2. 追加された UserControl1 に、以下のコードを記述。

Option Explicit

Public Sub Download(ByVal URL As String, ByVal FilePath As String)
    UserControl.AsyncRead _
        URL, vbAsyncTypeFile, FilePath, vbAsyncReadSynchronousDownload
End Sub

Private Sub UserControl_AsyncReadComplete(AsyncProp As AsyncProperty)
    Dim saveFile As String
    saveFile = AsyncProp.PropertyName
    
    If Dir(saveFile) <> "" Then
        Kill saveFile
    End If
    
    Name AsyncProp.Value As saveFile
End Sub

3. もし、UserControl1 のデザイナ画面を開いているなら、それを閉じる。

4. Form1 のデザイン画面を開き、UserControl1 と CommandButton を貼る。
  (それぞれ、UserControl11、Command1 という名前になる)

5. Form1 に、以下のコードを記述。

Option Explicit

Private Sub Command1_Click()
    UserControl11.Download _
      "http://www.goo.ne.jp/img/logo/gootop_logo.gif", _
      "C:\sample.gif"

    UserControl11.Download _
      "http://www.ietf.org/rfc/rfc4180.txt", _
      "C:\sample.txt"
End Sub

編集 削除
魔界の仮面弁士  2008-01-17 20:30:19  No: 138575  IP: 192.*.*.*

> これは、「IID_Picture インターフェイス」を表す ID です。

「IPicture インターフェイス」の間違いです。m(_ _)m

編集 削除
eku  2008-01-18 17:55:44  No: 138576  IP: 192.*.*.*

解決後だというのにわざわざ返信ありがとうございます。

> なんだか、Ajax 関連の情報とゴッチャになっているような気がします。
いろいろ検索している途中で見つけたページに書いてあったのを覚えていた
だけなので、恐らく見間違いか記憶違いだと思います。
そもそも VB ではなく java か何かのサイトでしたし。

> これは、「IPicture  インターフェイス」を表す ID です。
> これを、OleLoadPicture という API の第4引数に指定しています。
> これは、画像データを Picture オブジェクトに変換するために必要でした。
ID の部分は何か計算をして導き出したわけではなく、ただ知っているかどうか
だったわけですね。引数の説明も勉強になりました。

> なお、データのダウンロードだけなら、この API を使う必要はありません。
> また、WebBrowser や MSXML といった ActiveX コンポーネントに頼らずとも、
> VB6 には標準で、ファイルをダウンロードする機能が標準で用意されていますよ。
有力な情報どうもありがとうございます!  初心者なのでサンプルコードから
考えるのがわかりやすく、大変参考になります。
もう期限はないのでじっくり勉強していきたいと思います。
どうもありがとうございました!

編集 削除