Аддон для Firefox как парсить конкретную страницу ?
Вобщем решил написать аддон для Firefox. Потому что надо следить за количеством полученных сообщений и оперативно отвечать на них, но так как количество сообщений видно только на одной странице сайта, то она открывается довольно редко, обновляется вручную когда вспомнишь. Вообщем об оперативности небыло никакой речи. Решил написать аддон, который будет парсить страницу и выдавать количество полученных сообщений. Вот тут builder.addons.mozilla.org/ начал писать аддон.
onClick: function(event) { for (var i = 0; i < window.content.document.getElementsByTagName('li').length; i++){ var text = window.content.document.getElementsByTagName('li')[i].innerHTML; if (text.search('<b>') != -1) { var a = text.search("<b>"); var b = text.search("</b>"); window.alert(text.substring(a+3, b)); } } } Таким образом я получаю количество непрочитанных сообщений, находясь на странице и нажав на кнопку виджета. А как мне получить то же самое, находясь на любой другой странице и нажав кнопку виджета? |
Дополнение ff может загрузить страницу с любого сайта при помощи xmlhttprequest и пропарсить полученный html.
Возможно, на том сайте информацию о непрочитанных сообщениях можно узнать при помощи некоего API (как, например, для яндекс-почты), стоит разведать на эту тему. |
вобщем на этом сайте нет ничего такого. Он вообщем простой, написан на перле. Насчет реквестов почитал, вот нашел доки
https://addons.mozilla.org/en-US/dev...k/request.html Теперь могу получить страницу всю не как DOM а как простой текст. Но в браузере кодировки не совпадают и ромбики вижу вместо текста. Хоть в консоль вывожу хоть в алерт. Как его парсить то теперь? |
Цитата:
|
Регулярку придумал. Столкнулся с другой проблемой. При входе на сайт требуется ввод логина и пароля. При этом запрос авторизации делается с применением рандомной соли и айди юзера. Но я не могу работать со страницей как со страницей со скриптом. Я могу работать только как со страницей в обычном текстовом режиме. Вобщем я парсю соли, айди, делаю хеш, отправляю запрос на сервер, чтобы получить ответ уже для авторизированного пользователя, но почему-то сервер меня обратно выбрасывает на сраницу авторизации( Хотя хеши делаются правильно. И запрос формируется точно так же, как я его вижу в консоли фаерфокса.
var Request = require("request").Request; Request({ url: "https://site/adm.pl", content: {q: "test"}, onComplete: function (response) { window.alert(response.text); var saltbegin = response.text.search('salt value'); var salt = response.text.substr(saltbegin+12, 27); window.alert(salt); var rndbegin = response.text.search('rand_login'); var rand_login = response.text.substr(rndbegin+18, 7); window.alert(rand_login); var pass = 'password'; var username = 'username'; //var hashed = salt+pass; var query = "https://site/adm.pl?salt="+salt+"&a=enter&pp="+hex_md5(salt+" "+pass)+"&rand_login="+rand_login+"&uu"+rand_login+"="+username+"&pp"+rand_login+"=&trusted=1"; window.alert(query); Request({ url: query, content: {q: "test"}, onComplete: function (response) { window.alert(response.text); var a = response.text.search("lft"); window.alert(response.text.substr(a+59, 5).match(/\d*/)); } }).post(); } }).post(); возможно, я неверным способом отправляю запрос уже сформированный? Request({ url: query, |
Цитата:
скорее всего, это должен быть запрос POST, и все значения (логин, пароль, хэш и т.д.) должны передаваться в содержимом запроса (параметр content?), а не в урле. Этот момент надо отследить в браузерном дебаггере или в фидлере. |
на сайте вот такой скрипт авторизации:
</head><body onload="javascript: timer=setInterval('a()',1000); document.getElementById('uu9307551').focus();"><div align=center id=maindiv><div class=infomess><table class=table10><tr><td align=center valign=top><br><br><img src='/i/keyb.gif'><br><span class=error>Авторизация<br />Биллинг</span></td><td width=6> </td><td valign=middle align=left><div id=divsubmit><form method=get action='/cgi-bin/auth/adm.pl' onsubmit='pp.value=hex_md5(salt.value+" "+pp9307551.value); pp9307551.value=""; return true'><input type=hidden name=salt value='17494yHI0utDyp!mwov8I6U7nDA'><input type=hidden name=a value='enter'><input type=hidden name=pp value='error'><input type=hidden name=rand_login value='9307551'><table cellpadding=8 cellspacing=1><tr><td align=center colspan=2><div id=countdiv>Включите javascript</div></td></tr><tr class='row2'><td align=right>Логин:</td><td><input type=text name=uu9307551 size=30 maxlength=32 value='' autocomplete='off' id=uu9307551></td></tr><tr class='row2'><td align=right>Пароль:</td><td><input type=password name=pp9307551 size=30></td></tr><tr><td align=center colspan=2><input type=checkbox name=trusted value=1 style='border:1px;' checked> доверенный компьютер</td></tr><tr><td align=center colspan=2><input type=submit value=' Вход '></td></tr></table></form></div></td></tr></table></div></div></body></html> я могу подставить необходимые значения переменных, но как мне создать функцию? Вариант с function auth() = {get action='/cgi-bin/auth/adm.pl' onsubmit='pp.value=hex_md5(salt.value+" "+pp9307551.value); ....} не прокатывает. Мог бы сделать прямо на странице все, но надо чтобы страница открытой во вкладке не держалась... УРЛ запроса верный, но вместе с тем, это GET запрос, имеющий в себе соответствующие поля salt.value, pp9307551.value и т.д. |
да, загадко..
запрос действительно должен быть GET. могу посоветовать так: 1) убери content: {q: "test"} из запроса, все равно это не нужно. 2) значения, которые передаются в урл, на всякий случай надо эскейпить, либо функцией encodeURIComponent, либо escape 3) Request отправляется как .post(), может, надо .get()? я просто не в курсе 4) ну и реферер добавить в заголовки запроса, вдруг его проверяют. |
просто видел в отладчике что отправляется get();
первый пунк совета выполнил, второй тоже. Заголовки еще помучаю. Пока сдвигов нет ( |
Torero,
ещё раз отследи дебаггером запрос от формы (со страницы) и твой запрос. Сравни их, найди различия (они точно есть), пробуй устранить. |
Вообщем замучался я с авторизацией и решил пойти другим путем. Решил пусть скрипт работает только на странице нужного мне сайта когда я авторизирован. Но мне надо выводить на любой странице инфу, которая находится по определенной ссылке. Сделал так:
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 скобка как бы закрывается. Экранирование обратным слешем в данном случае не подходит, выдает ошибку. Точно так же не получилось у меня ничего с комбинированием одинарных и двойных скобок( |
Torero,
если ты авторизован на сайте, то можешь просто загружать строку через Request, безо всяких iframe. по идее, 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. 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 секунд?? Весь вечер промучился с таймерами, так ничего и не получилось(( |
Цитата:
с регексами элементарно: var ans = (/поступило\s+<b>(\d*)/.test(text) ? RegExp.$1 : "0"); с таймерами тоже просто: // таймер с интервалом в 1 мин (60000 мкс) setInterval(function() { // тут все действия - загрузка html через Request и добыча числа регексом. }, 60000); |
За регулярку спасибо. А с 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". Пытался обьявление функции вывести в самый первый блок, потом сразу за скобки нью виджета, потом вообще в самый конец.. Работает только вариант с предыдущего поста, срабатывающий по клику на виджет( |
попробуй так
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); }; |
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, время: 14:57. |