Javascript-форум (https://javascript.ru/forum/)
-   Firefox/Mozilla (https://javascript.ru/forum/css-html-firefox-mizilla/)
-   -   Аддон для Firefox как парсить конкретную страницу ? (https://javascript.ru/forum/css-html-firefox-mizilla/41445-addon-dlya-firefox-kak-parsit-konkretnuyu-stranicu.html)

Torero 23.09.2013 22:54

Вообщем замучался я с авторизацией и решил пойти другим путем. Решил пусть скрипт работает только на странице нужного мне сайта когда я авторизирован. Но мне надо выводить на любой странице инфу, которая находится по определенной ссылке. Сделал так:

onClick: function(event) {

        var link = window.content.document.getElementsByTagName('a')[1];
        window.content.document.getElementsByClassName("row2")[1].innerHTML='<iframe id="iframe_1" name="iframe_1"  style="margin:0;width:100%;" frameborder="0"  height="30" src="'+link+'"></iframe>';
        var frame = document.getElementById("iframe_1");
        console.log(frame.contentDocument.body.innerHTML);

        }


Мне нужно со страницы, которая находится по адресу "линк", спарсить некоторую инфу. Но таким образом во фрейм я вывожу всю страницу целиком. И еще она ведь загружается не сразу. Пытаюсь ее искать, но скрипт выполняется сразу, а ведь она еще не успела загрузиться. Или возможно есть способ загрузить не всю ссылку, а только часть ее во фрейм?

З.Ы.

Решил сделать немного иначе:

window.content.document.getElementsByClassName("row2")[1].innerHTML='<iframe id="iframe_1" name="iframe_1"  style="margin:0;width:100%;" frameborder="0"  height="30" src="'+link+'" onload="this.src=\'javascript: {alert(1);}\'"></iframe>';

Тоесть я скрипт обработки встраиваю прямо в создаваемый мною фрейм. Алерт срабатывает. Но тут я сталкиваюсь с другой проблемой. Когда я пытаюсь работать работать со страницей, меня начинают парить скобки!!

window.content.document.getElementsByClassName("row2")[1].innerHTML='<iframe id="iframe_1" name="iframe_1"  style="margin:0;width:100%;" frameborder="0"  height="30" src="'+link+'" onload="this.src=\'javascript: {alert(document.getElementsByTagName("li").length);}\'"></iframe>';

Получается что перед li скобка как бы закрывается. Экранирование обратным слешем в данном случае не подходит, выдает ошибку. Точно так же не получилось у меня ничего с комбинированием одинарных и двойных скобок(

Яростный Меч 24.09.2013 20:56

Torero,

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

Torero 26.09.2013 00:07

Да, но мне надо чтобы данные на странице оставались те же. Вот сижу я на сайте и делами занимаюсь. Надо чтобы скрипт не мешал мне работать, но при этом при появлении нового сообщения я сразу же о нем узнавал. Но я этот вопрос уже решил методом тыка.
var Widget = require("widget").Widget;
var tabs = require('tabs');
var wuntils = require('sdk/window/utils');
var window = wuntils.getMostRecentBrowserWindow();
var document = window.document;

exports.main = function() {

    // Widget documentation: [url]https://addons.mozilla.org/en-US/developers/docs/sdk/latest/modules/sdk/widget.html[/url]

    new Widget({

        id: "my-widget-1",
        label: "My Mozilla Widget",
        contentURL: "http://www.mozilla.org/favicon.ico",

       // Add a function to trigger when the Widget is clicked.

        onClick: function(event) {

        window.alert("Work");
        var link = window.content.document.getElementsByTagName('a')[1];
        window.content.document.getElementsByClassName("row2")[1].innerHTML='\
        <iframe id="iframe_1" name="iframe_1" \
        style="margin:0;width:100%;" frameborder="0"  height="0" src="'+link+'" onload=" \
        var text = window.content.document.getElementById(\'iframe_1\').contentDocument.body.innerHTML;\
         re = /поступило <b>+[0-9]*/im; \
         var buff = text.match(re);\
         re = /[0-9]/; \
         var ans = buff[0].match(re);\
         alert(\'поступило \'+ans+\' сообщений!\');\
         "\
        </iframe>';
        }        
    });
};


Теперь по клику на иконку виджета у меня выскакивает алерт с количеством непрочитанных сообщений. Правда регулярка заработала только в таком виде, так что если количество сообщений будет больше 10ти то выдаст только цифру 1 и т.д. Но ладно, дело не в том. Как теперь сделать, чтобы функция загрузки фрейма и проверки его содержимого запускалась сама, без нажатия на иконку виджета, раз в n секунд?? Весь вечер промучился с таймерами, так ничего и не получилось((

Яростный Меч 26.09.2013 17:22

Цитата:

Сообщение от Torero
Да, но мне надо чтобы данные на странице оставались те же.

я не понимаю твоих затруднений. данные на странице никуда не денутся, если с помощью Request загрузить некий хтмл - он будет как строка у тебя в коде, и больше нигде.

с регексами элементарно:
var ans = (/поступило\s+<b>(\d*)/.test(text) ? RegExp.$1 : "0");


с таймерами тоже просто:
// таймер с интервалом в 1 мин (60000 мкс)
setInterval(function() {
   // тут все действия - загрузка html через Request и добыча числа регексом.
}, 60000);

Torero 26.09.2013 19:48

За регулярку спасибо. А с Request действительно затруднения. На залогиненном сайте (тот же ВК) действительно все загружается без проблем. А на этом вот все время вместо любой страницы я получаю страницу авторизации. К тому же, кириллица не отображается при таком подходе, что серьезно затрудняет поиск нужного числа. А таймеры я так и пробовал делать. Если запилить вот так:

var Widget = require("widget").Widget;
var tabs = require('tabs');
var wuntils = require('sdk/window/utils');
var window = wuntils.getMostRecentBrowserWindow();
var document = window.document;

exports.main = function() {

    // Widget documentation: [url]https://addons.mozilla.org/en-US/developers/docs/sdk/latest/modules/sdk/widget.html[/url]

    new Widget({

        id: "my-widget-1",
        label: "My Mozilla Widget",
        contentURL: "http://www.mozilla.org/favicon.ico",

       // Add a function to trigger when the Widget is clicked.

        setInterval( function(event) {

        window.alert("Work");
        var link = window.content.document.getElementsByTagName('a')[1];
        window.content.document.getElementsByClassName("row2")[1].innerHTML='\
        <iframe id="iframe_1" name="iframe_1" \
        style="margin:0;width:100%;" frameborder="0"  height="0" src="'+link+'" onload=" \
        var text = window.content.document.getElementById(\'iframe_1\').contentDocument.body.innerHTML;\
         re = /поступило <b>+[0-9]*/im; \
         var buff = text.match(re);\
         re = /[0-9]/; \
         var ans = buff[0].match(re);\
         alert(\'поступило \'+ans+\' сообщений!\');\
         "\
        </iframe>';
        }, 1000);        
    });
};


То в логе ошибок я вижу "missing : after property id". Пытался обьявление функции вывести в самый первый блок, потом сразу за скобки нью виджета, потом вообще в самый конец.. Работает только вариант с предыдущего поста, срабатывающий по клику на виджет(

Яростный Меч 26.09.2013 20:31

попробуй так

var Widget = require("widget").Widget;
var tabs = require('tabs');
var wuntils = require('sdk/window/utils');
var window = wuntils.getMostRecentBrowserWindow();
var document = window.document;
 
exports.main = function() {
 
    // Widget documentation: [url]https://addons.mozilla.org/en-US/developers/docs/sdk/latest/modules/sdk/widget.html[/url]
 
    new Widget({
 
        id: "my-widget-1",
        label: "My Mozilla Widget",
        contentURL: "http://www.mozilla.org/favicon.ico"
    });
 
    setInterval( function() {
 
        window.alert("Work");
        var link = window.content.document.getElementsByTagName('a')[1];
        window.content.document.getElementsByClassName("row2")[1].innerHTML='\
        <iframe id="iframe_1" name="iframe_1" \
        style="margin:0;width:100%;" frameborder="0"  height="0" src="'+link+'" onload=" \
        var text = window.content.document.getElementById(\'iframe_1\').contentDocument.body.innerHTML;\
         re = /поступило <b>+[0-9]*/im; \
         var buff = text.match(re);\
         re = /[0-9]/; \
         var ans = buff[0].match(re);\
         alert(\'поступило \'+ans+\' сообщений!\');\
         "\
        </iframe>';
    }, 10000);
};

Torero 26.09.2013 21:02

var Widget = require("widget").Widget;
var tabs = require('tabs');
var wuntils = require('sdk/window/utils');
var window = wuntils.getMostRecentBrowserWindow();
var document = window.document;
exports.main = function() {
new Widget({

id:  "my-widget-1",
label: "My Mozilla Widget",
contentURL: "http://www.mozilla.org/favicon.ico",
});
setInterval( function() {
window.alert("Work");
}, 10000);
};

Выдает ошибку set interval is not defined

При этом
var Widget = require("widget").Widget;
var tabs = require('tabs');
var wuntils = require('sdk/window/utils');
var window = wuntils.getMostRecentBrowserWindow();
var document = window.document;
exports.main = function() {
new Widget({
id:  "my-widget-1",
label: "My Mozilla Widget",
contentURL: "http://www.mozilla.org/favicon.ico",
onClick: function() {
window.alert("Work");
}
});
};

Работает нормально.


Часовой пояс GMT +3, время: 06:06.