Я хочу очистить пользовательские страницы SO, чтобы предоставить владельцам моей панели инструментов обновленную информацию по их вопросам / ответам / и т. д.
Это означает, что мне нужно сделать это в фоновом режиме, проанализировать страницы, извлечь содержимое, сравнить его с последним запуском, а затем представить результаты либо на панели инструментов, либо в строке состояния, либо, альтернативно, во всплывающем окне некоторых своего рода. И все это нужно делать, пока пользователь занимается своими делами, не прерываясь и даже не находясь на SO.
Я довольно тщательно искал какие-то подсказки как в Google, так и в Mozilla Wiki. Я даже дошел до загрузки нескольких других расширений, которые, как мне кажется, делают то же самое. К сожалению, у меня не было времени пройти через все из них, и те, на которые я смотрел, все используют API данных (Services, WebServices, XML), а не удаление html.
Текст старого вопроса
Я ищу хорошее место, чтобы узнать, как я могу загрузить страницу внутри функции, называемой buy печально известной set_timeout (), для обработки очистки экрана в фоновом режиме.
Моя идея состоит в том, чтобы представить результаты такого парсинга в расширении строки состояния, на всякий случай, если что-то изменилось с последнего запуска.
Есть ли скрытый оверлей или еще какая-то уловка?





Из привилегированного JavaScript, то есть JS в расширении, вы можете создавать скрытые iframe; загрузка указанной страницы так же проста, как установка местоположения на этом фрейме.
Если вы открываете простую статическую страницу, которой владеете, set_timeout подойдет. Но в таком случае почему бы не использовать XHR?
Если вы просматриваете произвольные страницы с динамическими элементами или большим количеством контента, я бы рекомендовал запускать очистку страницы с помощью обработчиков событий Document.onload. Это намного надежнее, и вы можете сообразить, как очистить страницу как можно раньше, но когда вы знаете, что необходимый контент есть.
Я не думаю, что есть специальный учебник по этому поводу, но Центр разработчиков Mozilla, который, я уверен, вы уже нашли, абсолютно превосходен - на мой взгляд, лучшая онлайн-техническая документация!
Я не уверен, полностью ли понял вопрос, но постараюсь ответить на несколько очевидных альтернативных вопросов:
Если вы ищете парсинг статических веб-страниц, BeautifulSoup (Python) - один из лучших и самых простых.
Если вы ищете изменения на странице на основе Ajax, которые со временем меняются, вам придется продолжать запускать код в бесконечном цикле. Но не опрашивайте сайт слишком часто, он обнаружит потребление полосы пропускания и может заблокировать ваш IP, поэтому опрашивайте через некоторый интервал.
Если вы хотите очистить некоторые отрисованные javascript тикеры или что-то в этом роде, это невозможно сделать, пока страница не будет отрисована, следовательно, это невозможно с одним BeautifulSoup. вам придется использовать безголовый браузер, такой как Лом - Similie (использует XULRunner), который отображает содержимое javascript в безголовом браузере, и вывод этого визуализированного содержимого может использоваться в качестве входных данных для парсера BeautifulSoup.
Я должен сделать это на панели инструментов, являющейся расширением Firefox. Обратитесь к моему разъяснению.
Взгляните на XMLHttpRequest, должно вас начать.
В случае 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(), вероятно, должен работать.
Редактировать:
HTH.
можно ли было бы использовать получившуюся «страницу» как объект DOM?
Разрешает ли XHR на расширении доступ к другим доменам? Могу ли я использовать возможности Firefox DOM для HTML, извлеченного из XHR.