当前位置:  开发笔记 > 前端 > 正文

如何使用XUL/Firefox扩展执行后台加载和页面抓取

如何解决《如何使用XUL/Firefox扩展执行后台加载和页面抓取》经验,为你挑选了1个好方法。

我想刮掉SO的用户页面,给我的工具栏的所有者提供关于他们的问题/答案/等的更新信息......

这意味着我需要在后台执行此操作,解析页面,提取内容,将其与上次运行进行比较,然后在工具栏或状态栏上显示结果,或者在某些弹出窗口中显示结果类.所有这一切都必须在用户处理他的业务时不要被打断甚至是在SO上.

我在谷歌和Mozilla Wiki上都进行了相当彻底的搜索,以获得某种暗示.我甚至已经下载了一些我想做同样的其他扩展程序.不幸的是,我没有时间浏览所有这些和我看过的,都使用数据API(服务,Web服务,XML),而不是html报废.

老问题文本

我正在寻找一个好地方来学习如何在一个名为buy臭名昭着的set_timeout()的函数中加载页面来处理后台的屏幕抓取.

我的想法是在状态栏扩展中显示这种抓取的结果,以防万一从上次运行中发生任何变化.

是否有隐藏的叠加或其他一些诡计?



1> David Hanak..:

对于XUL/Firefox,你需要的是nsIIOService接口,你可以这样得到:

var mIOS = Components.classes["@mozilla.org/network/io-service;1"].
   getService(Components.interfaces.nsIIOService);

然后你需要创建一个频道,并打开一个异步链接:

var channel = mIOS.newChannel(urlToOpen, 0, null);
channel.asyncOpen(new StreamListener(), channel);

这里的关键是StreamListener对象:

var StreamListener = function() {
    return {
        QueryInterface: function(aIID) {
            if (aIID.equals(Components.interfaces.nsIStreamListener) ||
                aIID.equals(Components.interfaces.nsISupportsWeakReference) ||
                aIID.equals(Components.interfaces.nsISupports))
                return this;
            throw Components.results.NS_NOINTERFACE;

        onStartRequest: function(aRequest, aContext)
           { return 0; },

        onStopRequest: function(aRequest, aChannel /* aContext */, aStatusCode)
           { return 9; },

        onDataAvailable: function(aRequest, aContext, aStream, aOffset, aCount)
           { return 0; }
    };
}

你必须填写在细节onStartRequest,onStopRequest,onDataAvailable功能,但这应该足以让你去.你可以看看我在Firefox扩展中如何使用这个界面(它叫做IdentFavIcon,它可以在mozilla附加组件网站上找到).

我不确定的部分是如何不时触发此页面请求, set_timeout()应该可能有效.

编辑:

    有关如何将下载的数据收集到单个变量中的示例,请参阅此处的示例(请参阅下载图像部分); 和

    请参阅此页面,了解如何将HTML源转换为DOM树.

HTH.

推荐阅读
LEEstarmmmmm
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有