[решено] Работа с html-кодом страницы, поиск и копирование нужных строк
-
Sestrichka
[решено] Работа с html-кодом страницы, поиск и копирование нужных строк
Здравствуйте!
Пишу программку, которая заходит на сайт Одноклассники, загружает мой логин и пароль, а затем анализирует мой форум, нет ли там новых сообщений.
1. Подскажите, как получить html-код страницы после загрузки моего аккаунта? Не знаю, можно ли тут использовать _INetGetSourse(), ведь при каждой загрузке страницы моего пользователя адрес страницы меняется.
2. Я хочу найти в html-коде страницы текст между тегами и и записать его в переменную, как это лучше сделать? Что использовать StringregExpReplace или StringregExp - я с ними совсем запуталась.
Пишу программку, которая заходит на сайт Одноклассники, загружает мой логин и пароль, а затем анализирует мой форум, нет ли там новых сообщений.
1. Подскажите, как получить html-код страницы после загрузки моего аккаунта? Не знаю, можно ли тут использовать _INetGetSourse(), ведь при каждой загрузке страницы моего пользователя адрес страницы меняется.
2. Я хочу найти в html-коде страницы текст между тегами и и записать его в переменную, как это лучше сделать? Что использовать StringregExpReplace или StringregExp - я с ними совсем запуталась.
-
Sestrichka
Re: [решено] Работа с html-кодом страницы, поиск и копирование нужных строк
1. к примеру то же самое для вконтакте:
Код:
при этом самое интересное, что авторизация на сайте - на куках, и последовательный вызов _INetGetSource прокатывает!
(т.е. _INetGetSource возможно всетаки как то использует Internet Explorer)
Цитата Sestrichka:
как получить html-код страницы после загрузки моего аккаунта
тут главное выявить адрес как залогиниться, на подобии:
Код:
тогда в ответ, уже не важно какой адрес будет у Вашей страницы, результат уже бедет её содержать.
2. вариант:
Код:
Код:
Код: Выделить всё
$sPage = _INetGetSource('www.vkontakte.ru/login.php?email=' & $sCfgEmail & '&pass=' & $sCfgPass)
If StringInStr($sPage, '') Then
$aNewMsg = StringRegExp($sPage, '(.+)', 1)
;~ ...ошибка входа: неверный логин или пароль
EndIf
$sPage = _INetGetSource('www.vkontakte.ru/mail.php?out=0&st=1')при этом самое интересное, что авторизация на сайте - на куках, и последовательный вызов _INetGetSource прокатывает!

(т.е. _INetGetSource возможно всетаки как то использует Internet Explorer)
Цитата Sestrichka:
как получить html-код страницы после загрузки моего аккаунта
[решено] Работа с html-кодом страницы, поиск и копирование нужных строк
тут главное выявить адрес как залогиниться, на подобии:
Код:
Код: Выделить всё
'www.vkontakte.ru/login.php?email=' & $sCfgEmail & '&pass=' & $sCfgPassтогда в ответ, уже не важно какой адрес будет у Вашей страницы, результат уже бедет её содержать.
2. вариант:
Код:
Код: Выделить всё
#include -
proxy
Re: [решено] Работа с html-кодом страницы, поиск и копирование нужных строк
_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)При такой раскладке, одно но, что в зависимости от скорости инета, процес займет некоторое время...
-
beve
Re: [решено] Работа с html-кодом страницы, поиск и копирование нужных строк
Цитата beve:
$oIE = _IECreate ("
+ можно его в HIDE
+ попробовать может через _IECreateEmbedded - еще лучше будет, если получится?
$oIE = _IECreate ("
http://odnoklassniki.ru/",0,0
) [решено] Работа с html-кодом страницы, поиск и копирование нужных строк
+ можно его в HIDE
+ попробовать может через _IECreateEmbedded - еще лучше будет, если получится?
-
proxy
Re: [решено] Работа с html-кодом страницы, поиск и копирование нужных строк
Цитата proxy:
$sPage = _INetGetSource('
Очень жаль, proxy, но у меня не работает этот код
ругается на строку:
$sPage = _INetGetSource('
пишет:"Unknown function name"
Не знаю в чем дело, я пока в Autoit туповата. Может я где-то ошиблась?
$sPage = _INetGetSource('
www.vkontakte.ru/login.php?email=
' & $sCfgEmail & '&pass=' & $sCfgPass) If StringInStr($sPage, '') Then $aNewMsg = StringRegExp($sPage, '(.+)', 1) ;~ ...ошибка входа: неверный логин или пароль EndIf $sPage = _INetGetSource('www.vkontakte.ru/mail.php?out=0&st=1
') [решено] Работа с html-кодом страницы, поиск и копирование нужных строк
Очень жаль, 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
Re: [решено] Работа с html-кодом страницы, поиск и копирование нужных строк
Цитата beve:
_INetGetSource можна было б использовать, но тут ведь нужно после запуска страницы еще на ссылку МОИ СООБЩЕНИЯ перейти... Вот я предлагаю такое решение, при котором в переменную заносится последнее сообщение:
Нет, beve, мне нужен именно форум: внизу страницы пользователя отображаются последнии сообщеня на его форуме.
Вот тут я что-то туплю:
Цитата beve:
там где \1 - имя написавшего, а где \2 - текст сообщения $sRezultat=StringregExpReplace($KodHtml,$pattern, "\1 \2")
Тут оно, как я понимаю, выводить должно имя написавшего и текст сообщения. Или ты имел в виду, что я должна тут что-то дописать?
Потому, что если без изменений беру твой код, то выводит весь код страницы
_INetGetSource можна было б использовать, но тут ведь нужно после запуска страницы еще на ссылку МОИ СООБЩЕНИЯ перейти... Вот я предлагаю такое решение, при котором в переменную заносится последнее сообщение:
[решено] Работа с html-кодом страницы, поиск и копирование нужных строк
Нет, beve, мне нужен именно форум: внизу страницы пользователя отображаются последнии сообщеня на его форуме.
Вот тут я что-то туплю:
Цитата beve:
там где \1 - имя написавшего, а где \2 - текст сообщения $sRezultat=StringregExpReplace($KodHtml,$pattern, "\1 \2")
[решено] Работа с html-кодом страницы, поиск и копирование нужных строк
Тут оно, как я понимаю, выводить должно имя написавшего и текст сообщения. Или ты имел в виду, что я должна тут что-то дописать?
Потому, что если без изменений беру твой код, то выводит весь код страницы

-
Sestrichka
Re: [решено] Работа с html-кодом страницы, поиск и копирование нужных строк
вариант от beve, тут самый правильный.
хз, как, но отловить php или какой другой cgi скрипт авторизация не знаю как ))
а то было бы легкче
Цитата Sestrichka:
Очень жаль, proxy, но у меня не работает этот код
в целом для контакта есть:
1. классная
2. и мой пробный вариант
Цитата proxy:
Очень жаль, proxy, но у меня не работает этот код
тот пример для сайта в-контакте:
показал для разбора: по аналогии ))
хз, как, но отловить php или какой другой cgi скрипт авторизация не знаю как ))
а то было бы легкче

Цитата Sestrichka:
Очень жаль, proxy, но у меня не работает этот код
[решено] Работа с html-кодом страницы, поиск и копирование нужных строк
в целом для контакта есть:
1. классная
полезная штука
2. и мой пробный вариант
сообщения о новых сообщениях
)Цитата proxy:
Очень жаль, proxy, но у меня не работает этот код
[решено] Работа с html-кодом страницы, поиск и копирование нужных строк
тот пример для сайта в-контакте:
www.vkontakte.ru
показал для разбора: по аналогии ))
-
proxy
Re: [решено] Работа с html-кодом страницы, поиск и копирование нужных строк
Может так? Хотя конечно, если бы можно было через _INetGetSource как то войти...было бы быстрее:
Код:
И еще одна непонятка, ты пишеш, чтоб начиналось с hook_SmilizeContent_id" а у меня на сайте так hook_SmilizeContent_id> , поэтому я делал как у меня...но если ты не ошиблась то можеш в $pattern записать hook_SmilizeContent_id.*?>
Сам исправил...
Код:
Код: Выделить всё
#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.*?>
Сам исправил...
-
beve
Re: [решено] Работа с html-кодом страницы, поиск и копирование нужных строк
Цитата beve:
$sRezultat=StringregExpReplace($KodHtml,$pattern, "\1")
Объясни, пожалуйста, что эта строчка означает? Особенно меня смущает "\1", вообще не понимаю что это.
Мне нужен просто текст последнего сообщения - это текст между первыми найденными тегами
и , который будет служить эталоном для сравнения. Например,
тут текст,который должен занестись в $sRezultat = Привет! :-D
Вот это у меня и не получается.
Твоя прога выводит: "Новых сообщений нету!" даже, если новое сообщение есть.
Может как-то зациклить надо, чтоб проверка происходила периодически после изменения странички? Только я не знаю, как изменение на странице отследить.
$sRezultat=StringregExpReplace($KodHtml,$pattern, "\1")
[решено] Работа с html-кодом страницы, поиск и копирование нужных строк
Объясни, пожалуйста, что эта строчка означает? Особенно меня смущает "\1", вообще не понимаю что это.
Мне нужен просто текст последнего сообщения - это текст между первыми найденными тегами
и , который будет служить эталоном для сравнения. Например,
тут текст,который должен занестись в $sRezultat = Привет! :-D
Вот это у меня и не получается.
Твоя прога выводит: "Новых сообщений нету!" даже, если новое сообщение есть.
Может как-то зациклить надо, чтоб проверка происходила периодически после изменения странички? Только я не знаю, как изменение на странице отследить.
-
Sestrichka
Re: [решено] Работа с html-кодом страницы, поиск и копирование нужных строк
Цитата Sestrichka:
Объясни, пожалуйста, что эта строчка означает?
У меня тот пример, что я привел работает... В переменной $pattern, которую я назвал так чтоб тебе было легче сравнить со справкой, у меня (?s).*?hook_SmilizeContent_id.*?>(.*?).* поэтому \1 возвращает 1 групировку, тоесть то что у меня первое по счету слева направо заключено в скобки ( (?s) не учитывается, ибо означает искать во всем тексте, а не только в первой строчке), а это (.*?), если б еще дальше я поставил что то в скобки, то это была бы 2 групировка, и соответственно для возвращение её нужно было бы в функции StringRegExpReplace ( "test", "pattern", "replace", [ count ] ) на место "replace" поставить \2. Это можно прочитать в справке к данной функции. Поэтому моя идея така, что (.*?) возвратит именно текст нового сообщения, который находится между теми указателями, что ты указала, и по-моему так и должно быть, и не понятно почему у тебя не работает, я ж только идею дал, поэтому ты можеш подстроить под себя...
Дальше: после того как в переменную $sRezultat будет занесен текст сообщения, он будет с "мусором", которым может быль например ссылка на смайлик заключенный в поэтому я и остсеиваю такой мусор при помощи $sRezultat2=StringregExpReplace($sRezultat,"(?s)()", " "), и при этом тот текст который хранится в переменной $sRezultat будет проанализирован, и все нахождения любого текста, заключенного в , будут заменены просто на пробел.
Объясни, пожалуйста, что эта строчка означает?
[решено] Работа с html-кодом страницы, поиск и копирование нужных строк
У меня тот пример, что я привел работает... В переменной $pattern, которую я назвал так чтоб тебе было легче сравнить со справкой, у меня (?s).*?hook_SmilizeContent_id.*?>(.*?).* поэтому \1 возвращает 1 групировку, тоесть то что у меня первое по счету слева направо заключено в скобки ( (?s) не учитывается, ибо означает искать во всем тексте, а не только в первой строчке), а это (.*?), если б еще дальше я поставил что то в скобки, то это была бы 2 групировка, и соответственно для возвращение её нужно было бы в функции StringRegExpReplace ( "test", "pattern", "replace", [ count ] ) на место "replace" поставить \2. Это можно прочитать в справке к данной функции. Поэтому моя идея така, что (.*?) возвратит именно текст нового сообщения, который находится между теми указателями, что ты указала, и по-моему так и должно быть, и не понятно почему у тебя не работает, я ж только идею дал, поэтому ты можеш подстроить под себя...
Дальше: после того как в переменную $sRezultat будет занесен текст сообщения, он будет с "мусором", которым может быль например ссылка на смайлик заключенный в поэтому я и остсеиваю такой мусор при помощи $sRezultat2=StringregExpReplace($sRezultat,"(?s)()", " "), и при этом тот текст который хранится в переменной $sRezultat будет проанализирован, и все нахождения любого текста, заключенного в , будут заменены просто на пробел.