Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   AutoIt (http://forum.oszone.net/forumdisplay.php?f=103)
-   -   [решено] Работа с html-кодом страницы, поиск и копирование нужных строк (http://forum.oszone.net/showthread.php?t=135800)

Sestrichka 25-03-2009 11:30 1074158

Работа с html-кодом страницы, поиск и копирование нужных строк
 
Здравствуйте!
Пишу программку, которая заходит на сайт Одноклассники, загружает мой логин и пароль, а затем анализирует мой форум, нет ли там новых сообщений.
1. Подскажите, как получить html-код страницы после загрузки моего аккаунта? Не знаю, можно ли тут использовать _INetGetSourse(), ведь при каждой загрузке страницы моего пользователя адрес страницы меняется.
2. Я хочу найти в html-коде страницы текст между тегами <div id="hook_SmilizeContent_id" class="msg-area"> и </div></div> и записать его в переменную, как это лучше сделать? Что использовать StringregExpReplace или StringregExp - я с ними совсем запуталась.

proxy 25-03-2009 13:14 1074258

1. к примеру то же самое для вконтакте:
Код:

$sPage = _INetGetSource('www.vkontakte.ru/login.php?email=' & $sCfgEmail & '&pass=' & $sCfgPass)
If StringInStr($sPage, '<div id=''error''>') Then
    $aNewMsg = StringRegExp($sPage, '<div id=''error''>(.+)</div>', 1)
;~  ...ошибка входа: неверный логин или пароль
EndIf
$sPage = _INetGetSource('www.vkontakte.ru/mail.php?out=0&st=1')

при этом самое интересное, что авторизация на сайте - на куках, и последовательный вызов _INetGetSource прокатывает! :)
(т.е. _INetGetSource возможно всетаки как то использует Internet Explorer)

Цитата:

Цитата Sestrichka
как получить html-код страницы после загрузки моего аккаунта »

тут главное выявить адрес как залогиниться, на подобии:
Код:

'www.vkontakte.ru/login.php?email=' & $sCfgEmail & '&pass=' & $sCfgPass
тогда в ответ, уже не важно какой адрес будет у Вашей страницы, результат уже бедет её содержать.

2. вариант:
Код:

#include <Array.au3
$aResult = StringRegExp($aPage, '<div id="hook_SmilizeContent_id" class="msg-area">((?s).+?)</div></div>', 3)
_ArrayDisplay($aResult, '$aResult')


beve 25-03-2009 15:06 1074365

_INetGetSource можна было б использовать, но тут ведь нужно после запуска страницы еще на ссылку МОИ СООБЩЕНИЯ перейти... Вот я предлагаю такое решение, при котором в переменную заносится последнее сообщение:
Код:

#include <IE.au3>
$oIE =
_IECreate (" http://odnoklassniki.ru/",0,0)
_IELoadWait ($oIE)

$oUser =
_IEGetObjByName($oIE,"st.email")
$oPass =
_IEGetObjByName($oIE,"st.password")
$oSabmit =
_IEGetObjByName($oIE,"button_go")

_IEFormElementSetValue ($oUser, 'тут пишем логин')
_IEFormElementSetValue ($oPass, 'Тут пароль пишем')


; Дальше идет нажатие на кнопку Войти
_IEAction ($oSabmit,"click")
_IELoadWait ($oIE)

;Дальше клик на кнопку Мои сообщения
_IELinkClickByText ($oIE, "Мои сообщения")

$KodHtml=
_IEDocReadHTML ( $oIE )
_IEQuit($oIE)
$pattern="(?s).*?</TABLE></DIV><A href=.*?tkn=.*?>(.*?)</A>.*?id=hook_SmilizeContent_id>(.*?)</P></DIV>.*"
;там где  \1 - имя написавшего, а где \2 - текст сообщения
$sRezultat=StringregExpReplace($KodHtml,$pattern, "\1 \2")
;отсеивание ненужного мусора.
$sRezultat2=StringregExpReplace($sRezultat,"(?s)(<.*?>)", " ")
MsgBox(0,"Последнее сообщение",$sRezultat2)

При такой раскладке, одно но, что в зависимости от скорости инета, процес займет некоторое время...

proxy 25-03-2009 15:41 1074401

Цитата:

Цитата beve
$oIE = _IECreate (" http://odnoklassniki.ru/",0,0) »

+ можно его в HIDE
+ попробовать может через _IECreateEmbedded - еще лучше будет, если получится?

Sestrichka 25-03-2009 16:03 1074421

Цитата:

Цитата proxy
$sPage = _INetGetSource('www.vkontakte.ru/login.php?email=' & $sCfgEmail & '&pass=' & $sCfgPass) If StringInStr($sPage, '<div id=''error''>') Then $aNewMsg = StringRegExp($sPage, '<div id=''error''>(.+)</div>', 1) ;~ ...ошибка входа: неверный логин или пароль EndIf $sPage = _INetGetSource('www.vkontakte.ru/mail.php?out=0&st=1') »

Очень жаль, proxy, но у меня не работает этот код
ругается на строку:
$sPage = _INetGetSource('www.vkontakte.ru/mail.php?out=0&st=1')
пишет:"Unknown function name"
Не знаю в чем дело, я пока в Autoit туповата. Может я где-то ошиблась?

Код:

#include <IE.au3>
#include <Array.au3>
$sCfgEmail = 'логин'
$sCfgPass = 'пароль'
$sPage = _INetGetSource('www.vkontakte.ru/login.php?email=' & $sCfgEmail & '&pass=' & $sCfgPass)
If StringInStr($sPage, '<div id=''error''>') Then 
$aNewMsg = StringRegExp($sPage, '<div id=''error''>(.+)</div>', 1)
;~  ...ошибка входа: неверный логин или пароль
EndIf $sPage = _INetGetSource('www.vkontakte.ru/mail.php?out=0&st=1')
$aResult = StringRegExp($aPage, '<div id="hook_SmilizeContent_id" class="msg-area">((?s).+?)</div></div>', 3)
_ArrayDisplay($aResult, '$aResult')


Sestrichka 25-03-2009 16:17 1074441

Цитата:

Цитата beve
_INetGetSource можна было б использовать, но тут ведь нужно после запуска страницы еще на ссылку МОИ СООБЩЕНИЯ перейти... Вот я предлагаю такое решение, при котором в переменную заносится последнее сообщение: »

Нет, beve, мне нужен именно форум: внизу страницы пользователя отображаются последнии сообщеня на его форуме.
Вот тут я что-то туплю:
Цитата:

Цитата beve
там где \1 - имя написавшего, а где \2 - текст сообщения $sRezultat=StringregExpReplace($KodHtml,$pattern, "\1 \2") »

Тут оно, как я понимаю, выводить должно имя написавшего и текст сообщения. Или ты имел в виду, что я должна тут что-то дописать?
Потому, что если без изменений беру твой код, то выводит весь код страницы :cry:

proxy 25-03-2009 17:06 1074502

вариант от beve, тут самый правильный.
хз, как, но отловить php или какой другой cgi скрипт авторизация не знаю как ))
а то было бы легкче :)

Цитата:

Цитата Sestrichka
Очень жаль, proxy, но у меня не работает этот код »

в целом для контакта есть:
1. классная полезная штука
2. и мой пробный вариант сообщения о новых сообщениях )

Цитата:

Цитата proxy
Очень жаль, proxy, но у меня не работает этот код »

тот пример для сайта в-контакте: www.vkontakte.ru
показал для разбора: по аналогии ))

beve 25-03-2009 17:26 1074538

Может так? Хотя конечно, если бы можно было через _INetGetSource как то войти...было бы быстрее:
Код:

#include <IE.au3>
$oIE =
_IECreate (" http://odnoklassniki.ru/",0,0)
_IELoadWait ($oIE)

$oUser =
_IEGetObjByName($oIE,"st.email")
$oPass =
_IEGetObjByName($oIE,"st.password")
$oSabmit =
_IEGetObjByName($oIE,"button_go")

_IEFormElementSetValue ($oUser, 'Тут логин пишем')
_IEFormElementSetValue ($oPass, 'Тут пароль пишем')


; Дальше идет нажатие на кнопку Войти
_IEAction ($oSabmit,"click")
_IELoadWait ($oIE)

$KodHtml=
_IEDocReadHTML ( $oIE )

;Дальше клик на кнопку Выход
_IELinkClickByText ($oIE, "Выход") ;тут после нажатия на кнопку выход, можно сразу убить процесс, предварительно установив в функции  --  IELinkClickByText ( ByRef $o_object, $s_linkText [, $i_index = 0], $f_wait = 1]] )  параметр $f_wait = 0. Так будет на несколько секунд быстрее, но я написал стандартный способ
_IEQuit($oIE)
$pattern="(?s).*?hook_SmilizeContent_id.*?>(.*?)</DIV>.*"
$sRezultat=
StringregExpReplace($KodHtml,$pattern, "\1")
;отсеивание ненужного мусора.
$sRezultat2=StringregExpReplace($sRezultat,"(?s)(<.*?>)", " ")
;тут дальше, просто как одно из решений, производится поиск слова, это я к тому,что если сообщений нету, то вернется весь код страницы..., и следовательно если это слово DIV отсуствует в обработанной переменной $sRezultat2, то сообщение есть.
$result = StringInStr($sRezultat2, "DIV")
if $result=0 then
MsgBox(0,"Последнее сообщение",$sRezultat2)
Else
   
MsgBox(0,"Последнее сообщение","Новых сообщений нету!")
endif
Exit

И еще одна непонятка, ты пишеш, чтоб начиналось с hook_SmilizeContent_id" а у меня на сайте так hook_SmilizeContent_id> , поэтому я делал как у меня...но если ты не ошиблась то можеш в $pattern записать hook_SmilizeContent_id.*?>
Сам исправил...

Sestrichka 26-03-2009 16:37 1075403

Цитата:

Цитата beve
$sRezultat=StringregExpReplace($KodHtml,$pattern, "\1") »

Объясни, пожалуйста, что эта строчка означает? Особенно меня смущает "\1", вообще не понимаю что это.
Мне нужен просто текст последнего сообщения - это текст между первыми найденными тегами
<div id="hook_SmilizeContent_id" class="msg-area"> и </div>, который будет служить эталоном для сравнения. Например, <div id="hook_SmilizeContent_id" class="msg-area"></div>
тут текст,который должен занестись в $sRezultat = <p>Привет! &nbsp;:-D</p>
Вот это у меня и не получается.
Твоя прога выводит: "Новых сообщений нету!" даже, если новое сообщение есть.
Может как-то зациклить надо, чтоб проверка происходила периодически после изменения странички? Только я не знаю, как изменение на странице отследить.

beve 26-03-2009 21:32 1075696

Цитата:

Цитата Sestrichka
Объясни, пожалуйста, что эта строчка означает? »

У меня тот пример, что я привел работает... В переменной $pattern, которую я назвал так чтоб тебе было легче сравнить со справкой, у меня (?s).*?hook_SmilizeContent_id.*?>(.*?)</DIV>.* поэтому \1 возвращает 1 групировку, тоесть то что у меня первое по счету слева направо заключено в скобки ( (?s) не учитывается, ибо означает искать во всем тексте, а не только в первой строчке), а это (.*?), если б еще дальше я поставил что то в скобки, то это была бы 2 групировка, и соответственно для возвращение её нужно было бы в функции StringRegExpReplace ( "test", "pattern", "replace", [ count ] ) на место "replace" поставить \2. Это можно прочитать в справке к данной функции. Поэтому моя идея така, что (.*?) возвратит именно текст нового сообщения, который находится между теми указателями, что ты указала, и по-моему так и должно быть, и не понятно почему у тебя не работает, я ж только идею дал, поэтому ты можеш подстроить под себя...

Дальше: после того как в переменную $sRezultat будет занесен текст сообщения, он будет с "мусором", которым может быль например ссылка на смайлик заключенный в <> поэтому я и остсеиваю такой мусор при помощи $sRezultat2=StringregExpReplace($sRezultat,"(?s)(<.*?>)", " "), и при этом тот текст который хранится в переменной $sRezultat будет проанализирован, и все нахождения любого текста, заключенного в <>, будут заменены просто на пробел.

Sestrichka 27-03-2009 17:52 1076450

Спасибо большое за объяснения!
beve, а у тебя, когда ты запускал свой вариант, были сообщения в форуме? В смесле:программа реагирует на появление сообщения в пустом форуме? Может разница в начальных условиях запуска скрипта. Думаю, страницы на odnoklassniki.ru у всех одинаковые и твоя прога просто обязана работать и у меня.
На момент запуска сообщения у меня в форуме уже есть - но увы, все равно пишет "Новых сообщений нету!"
Иначе я просто не понимаю, почему,просматривая исходный код страницы, я вижу сообщение между этими тегами, а скрипт не может его найти :dont-know

beve 27-03-2009 18:56 1076524

Я у себя пробовал когда было сообщение, То скрипт показал сообщение, потом я сообщение удалил, и после запуска скрипта, выскочило окошко что сообщений нету. Попробуй поставить в конце кода Msgbox(0,"",$sRezultat) и посмотреть, если будет код всей странички, и при этом сообщение есть...значит код выходит не совпадает. Еще одно, вот на этой страничке этого форума http://forum.oszone.net/thread-132437.html есть простенький код, который нужно скомпелировать в EXE, по етой проге я проверяю наглядно работу созданного Шаблона для поиска. Так вот, в поле текст, вставь код из твоей страници, только не весь ибо от там не поместится, а кусок, этак строк 10 выше нового сообщения и 10 ниже, а в поле Pattern вставь это (?s).*?hook_SmilizeContent_id.*?>(.*?)</DIV>.* Должен вернуться только кусок кода который тебе нужен, если вернется весь текст, поэксперементируй тут с регулярными выражениями...

Sestrichka 30-03-2009 11:41 1078774

Спасибо, попробую :yes:

Sestrichka 01-04-2009 17:28 1081232

Цитата:

Цитата proxy
в целом для контакта есть:
1. классная полезная штука
2. и мой пробный вариант сообщения о новых сообщениях ) »

proxy, я чего-то не пойму, но при переходе по каждой из этих ссылок загружается страница www.vkontakte.ru и ничего не происходит (естественно потому, что пароль и логин не введены) Вообще,это ссылка на исполнение какого-то кода или на сам код?
Что я должна сделать, чтоб твой пример заработал?
Интересно увидеть хотя бы
Цитата:

Цитата proxy
1. классная полезная штука »


proxy 02-04-2009 16:51 1082071

Sestrichka, это для любитилий контакта (имхо, я нет :)).
ссылка номер 1: там переделанная миранда для контакта - эдакий icq для этого сайта.
ссылка номер 2: там пробная прога на AutoIt для контакта, выполняет те же действия, что ты делаешь для одноклассников - проверяет сообщения.

Для перехода по этим ссылкам - необходима регистрация на сайте контакта.


Время: 02:21.

Время: 02:21.
© OSzone.net 2001-