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

标签 firefox firefox-addon xul

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

这意味着我需要在后台执行此操作,解析页面,提取内容,将其与上次运行进行比较,然后在工具栏或状态栏上显示结果,或者在弹出窗口上显示结果某种 window 。所有这一切都必须在用户处理自己的业务时完成,不能被中断,甚至不能处于开机状态。

我在 Google 和 Mozilla Wiki 上进行了相当彻底的搜索,以寻找某种提示。我什至还下载了一些其他扩展,我认为它们也能起到同样的作用。不幸的是,我没有时间仔细研究所有这些,而且我看过的所有这些都使用数据 API(服务、Web 服务、XML),而不是 html 报废。

旧问题文本

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

我的想法是在状态栏扩展中显示此类抓取的结果,以防上次运行发生任何变化。

是否存在隐藏的叠加层或其他诡计?

最佳答案

对于 XUL/Firefox,您需要的是 nsIIOService 接口(interface),您可以这样获取:

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

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

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; }
    };
}

您必须填写 onStartRequestonStopRequestonDataAvailable 函数中的详细信息,但这应该足以让您继续操作。你可以看看我如何在我的 Firefox 扩展中使用这个界面(它被称为 IdentFavIcon,可以在 mozilla 附加组件网站上找到)。

我不确定的部分是如何时不时地触发此页面请求,不过 set_timeout() 应该可以工作。

编辑:

  1. 参见示例 here (请参阅下载图像部分)有关如何将下载的数据收集到单个变量中的示例;和
  2. 参见this page关于如何将 HTML 源转换为 DOM 树。

HTH。

关于firefox - 如何使用 XUL/Firefox 扩展执行后台加载和抓取页面,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/395157/

相关文章:

javascript - 如何更改 jQuery 默认上下文?

c++ - Firefox 扩展/插件二进制组件向后兼容性

javascript - 在 XULRunner 中禁用 window.onbeforeunload 和 window.onunload

html - 使用 :after pseudo element after anchor element - browser differences

python - 打开带有明确 header 的 Firefox

javascript - XUL 文档与 HTML 文档对象有何不同?

javascript - 在 DOMContentLoaded 之前触发的事件

firefox - 如何在 Firefox Dev Tools 中更改默认值 "Disable Touch Simulation"?

firefox - 双边框 CSS3 - FF !Chrome