Как выполнить фоновую загрузку и очистку страницы с помощью расширения XUL / Firefox

Я хочу очистить пользовательские страницы SO, чтобы предоставить владельцам моей панели инструментов обновленную информацию по их вопросам / ответам / и т. д.

Это означает, что мне нужно сделать это в фоновом режиме, проанализировать страницы, извлечь содержимое, сравнить его с последним запуском, а затем представить результаты либо на панели инструментов, либо в строке состояния, либо, альтернативно, во всплывающем окне некоторых своего рода. И все это нужно делать, пока пользователь занимается своими делами, не прерываясь и даже не находясь на SO.

Я довольно тщательно искал какие-то подсказки как в Google, так и в Mozilla Wiki. Я даже дошел до загрузки нескольких других расширений, которые, как мне кажется, делают то же самое. К сожалению, у меня не было времени пройти через все из них, и те, на которые я смотрел, все используют API данных (Services, WebServices, XML), а не удаление html.

Текст старого вопроса

Я ищу хорошее место, чтобы узнать, как я могу загрузить страницу внутри функции, называемой buy печально известной set_timeout (), для обработки очистки экрана в фоновом режиме.

Моя идея состоит в том, чтобы представить результаты такого парсинга в расширении строки состояния, на всякий случай, если что-то изменилось с последнего запуска.

Есть ли скрытый оверлей или еще какая-то уловка?

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
6
0
1 939
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Из привилегированного JavaScript, то есть JS в расширении, вы можете создавать скрытые iframe; загрузка указанной страницы так же проста, как установка местоположения на этом фрейме.

Если вы открываете простую статическую страницу, которой владеете, set_timeout подойдет. Но в таком случае почему бы не использовать XHR?

Если вы просматриваете произвольные страницы с динамическими элементами или большим количеством контента, я бы рекомендовал запускать очистку страницы с помощью обработчиков событий Document.onload. Это намного надежнее, и вы можете сообразить, как очистить страницу как можно раньше, но когда вы знаете, что необходимый контент есть.

Я не думаю, что есть специальный учебник по этому поводу, но Центр разработчиков Mozilla, который, я уверен, вы уже нашли, абсолютно превосходен - на мой взгляд, лучшая онлайн-техническая документация!

Разрешает ли XHR на расширении доступ к другим доменам? Могу ли я использовать возможности Firefox DOM для HTML, извлеченного из XHR.

Gustavo Carreno 28.12.2008 00:07

Я не уверен, полностью ли понял вопрос, но постараюсь ответить на несколько очевидных альтернативных вопросов:

Если вы ищете парсинг статических веб-страниц, BeautifulSoup (Python) - один из лучших и самых простых.

Если вы ищете изменения на странице на основе Ajax, которые со временем меняются, вам придется продолжать запускать код в бесконечном цикле. Но не опрашивайте сайт слишком часто, он обнаружит потребление полосы пропускания и может заблокировать ваш IP, поэтому опрашивайте через некоторый интервал.

Если вы хотите очистить некоторые отрисованные javascript тикеры или что-то в этом роде, это невозможно сделать, пока страница не будет отрисована, следовательно, это невозможно с одним BeautifulSoup. вам придется использовать безголовый браузер, такой как Лом - Similie (использует XULRunner), который отображает содержимое javascript в безголовом браузере, и вывод этого визуализированного содержимого может использоваться в качестве входных данных для парсера BeautifulSoup.

Я должен сделать это на панели инструментов, являющейся расширением Firefox. Обратитесь к моему разъяснению.

Gustavo Carreno 28.12.2008 00:08

Взгляните на 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(), вероятно, должен работать.

Редактировать:

  1. См. Пример здесь (см. Раздел Загрузка изображений) для примера того, как собрать загруженные данные в одну переменную; а также
  2. См. эта страница о том, как преобразовать источник HTML в дерево DOM.

HTH.

можно ли было бы использовать получившуюся «страницу» как объект DOM?

Gustavo Carreno 15.01.2009 03:22

Другие вопросы по теме