我想刮掉SO的用户页面,给我的工具栏的所有者提供关于他们的问题/答案/等的更新信息......
这意味着我需要在后台执行此操作,解析页面,提取内容,将其与上次运行进行比较,然后在工具栏或状态栏上显示结果,或者在某些弹出窗口中显示结果类.所有这一切都必须在用户处理他的业务时不要被打断甚至是在SO上.
我在谷歌和Mozilla Wiki上都进行了相当彻底的搜索,以获得某种暗示.我甚至已经下载了一些我想做同样的其他扩展程序.不幸的是,我没有时间浏览所有这些和我看过的,都使用数据API(服务,Web服务,XML),而不是html报废.
老问题文本
我正在寻找一个好地方来学习如何在一个名为buy臭名昭着的set_timeout()的函数中加载页面来处理后台的屏幕抓取.
我的想法是在状态栏扩展中显示这种抓取的结果,以防万一从上次运行中发生任何变化.
是否有隐藏的叠加或其他一些诡计?
对于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.