7

バックグラウンド:

私は、サード パーティのサイトに「サービス注文」を送信し、それらのリクエストの進行状況を監視する目的で、そのサイトを「自動化」する権限を持っています。

通常の「スクレイピング」アプローチ (Perl の 、 などを使用) を試みWWW::Mechanizeましたが、さまざまな状況下でサイト内の JavaScript が何をするかを予測する際に多くHTML::Queryの問題に遭遇しました。サード パーティのサイトを運営している製品のベンダーからサポートを受けたり、製品のビジネス ルールに関してより優れたドキュメントを手に入れることができれば、このアプローチに戻るつもりです。

JavaScript コードを再推測することを避け、多くの時間を節約するために、専用の VM で Firefox にサード パーティのサイトをロードし、「特権」コード (つまり、nsI*) を実行するというアプローチを取ることになりました。サイトを「ドライブ」および「スクレイピング」するためのサイトのコンテキスト。

私は現在nsIWebProgressListener/ DOMContentLoaded(すでに ChromeWindow への参照を持っている場合) を使用しており、新しいウィンドウとタブを見つけるためにnsIWindowMediator呼び出されたウィンドウ + タブの列挙setInterval(それらが開くことを予測する方法も、それらの DOMWindow オブジェクトへの参照を取得する方法もない場合)サードパーティの JavaScript のスコープによるものです)。

質問: サードパーティ サイトの JavaScript によって現在 (および将来) 開かれる各ウィンドウ/タブに「フック」を自動的にインストールするにはどうすればよいですか? nsI~この場合、Firefox UI 全体の「ウィンドウ ウォッチャー」インターフェイスのようなものが非常に便利です。

4

1 に答える 1

1

これを行うには非常に多くの方法があるため、正しい選択は、他のすべてのことをどのように行っているかによって異なります。

ポーリングではなく、リッスンするいくつかの方法を次に示します。

  1. 新しい Chrome ウィンドウ

    function ChromeWindowObserver() {
        this.observe = function(subject, topic, data) {
           // subject is a ChromeWindow
        }
    }
    Components.classes["@mozilla.org/embedcomp/window-watcher;1"]
          .getService(Components.interfaces.nsIWindowWatcher)
          .registerNotification(new ChromeWindowObserver());
    
  2. 新しいタブ

    function tabListener(event) {
        var browser = gBrowser.getBrowserForTab(event.target):
    }
    gBrowser.tabContainer.addEventListener("TabOpen", tabListener, false);
    
  3. オブザーバー通知(私のお気に入り)

    const dumpObserver = {
        observe: function(subject, topic, data) { dump(topic + "\n"); }
    }
    const domObserver = {
        observe: function(subject, topic, data) { dump(subject.location + "\n"); }
    }
    const ObserverService = Components.classes["@mozilla.org/observer-service;1"]
          .getService(Components.interfaces.nsIObserverService);
    
    /* debug log notifications */
    ObserverService.addObserver(dumpObserver, "*", false);
    /* debug log all new content locations */
    ObserverService.addObserver(domObserver, "content-document-global-created", false);
    

補足として、JavaScript コード モジュールを確認してください。Chrome ウィンドウ間でデータを共有する場合に役立つと思います。

于 2013-01-09T21:10:46.603 に答える