Dav*_*esh 7 javascript firefox screen-scraping xul
背景:
我被授权 "自动化"第三方网站,目的是将"服务订单"推入其中并监控这些请求的进度.
我尝试采用正常的"抓取"方法(使用WWW::Mechanize,HTML::Query等等来自Perl)但遇到了很多问题,预测网站中的JavaScript在各种情况下会做什么.如果我得到运行第三方网站的产品的供应商的支持,或者可以获得一些更好的文档以及产品的业务规则,我打算回到这种方法.
为了避免第二次猜测JavaScript代码,并节省大量时间,我最终采取了一种方法,我在专用VM上加载Firefox中的第三方网站,然后执行"特权"代码(即:nsI*)该网站的上下文"驱动"和"刮"该网站.
我目前正在使用nsIWebProgressListener/ DOMContentLoaded(当我已经有一个ChromeWindow的引用时),并且nsIWindowMediator调用window + tab枚举setInterval来查找新的窗口和标签(当我无法预测它们打开时,也没有获得对它们的DOMWindow对象的引用由于第三方JavaScript的范围).
问题:
如何通过第三方网站的JavaScript现在(以及将来)打开的每个窗口/标签中自动安装"钩子"?nsI~在这种情况下,像整个Firefox UI 的"窗口观察器" 界面之类的东西将非常有用.
有很多方法可以做到这一点,因此正确的选择取决于您如何处理其他事情。
这里只是一些倾听的方式,而不是轮询。
新的 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());
Run Code Online (Sandbox Code Playgroud)新标签
function tabListener(event) {
var browser = gBrowser.getBrowserForTab(event.target):
}
gBrowser.tabContainer.addEventListener("TabOpen", tabListener, false);
Run Code Online (Sandbox Code Playgroud)观察者通知(我最喜欢的)
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);
Run Code Online (Sandbox Code Playgroud)旁注,请查看JavaScript 代码模块。我认为这可能对您在 Chrome 窗口之间共享数据时有所帮助。