[решено] Работа с html-кодом страницы, поиск и копирование нужных строк

Аватара пользователя
Sestrichka

[решено] Работа с html-кодом страницы, поиск и копирование нужных строк

Сообщение Sestrichka »

Здравствуйте!

Пишу программку, которая заходит на сайт Одноклассники, загружает мой логин и пароль, а затем анализирует мой форум, нет ли там новых сообщений.

1. Подскажите, как получить html-код страницы после загрузки моего аккаунта? Не знаю, можно ли тут использовать _INetGetSourse(), ведь при каждой загрузке страницы моего пользователя адрес страницы меняется.

2. Я хочу найти в html-коде страницы текст между тегами и и записать его в переменную, как это лучше сделать? Что использовать StringregExpReplace или StringregExp - я с ними совсем запуталась.
Аватара пользователя
Sestrichka

Re: [решено] Работа с html-кодом страницы, поиск и копирование нужных строк

Сообщение Sestrichka »

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



Код:

Код: Выделить всё

$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-кодом страницы, поиск и копирование нужных строк

Сообщение proxy »

_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

Re: [решено] Работа с html-кодом страницы, поиск и копирование нужных строк

Сообщение proxy »

Цитата proxy:



$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-кодом страницы, поиск и копирование нужных строк

Сообщение Sestrichka »

Цитата beve:



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




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

Вот тут я что-то туплю:


Цитата beve:



там где \1 - имя написавшего, а где \2 - текст сообщения $sRezultat=StringregExpReplace($KodHtml,$pattern, "\1 \2")
[решено] Работа с html-кодом страницы, поиск и копирование нужных строк




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

Потому, что если без изменений беру твой код, то выводит весь код страницы Изображение
Аватара пользователя
Sestrichka

Re: [решено] Работа с html-кодом страницы, поиск и копирование нужных строк

Сообщение Sestrichka »

вариант от beve, тут самый правильный.

хз, как, но отловить php или какой другой cgi скрипт авторизация не знаю как ))

а то было бы легкче Изображение




Цитата Sestrichka:



Очень жаль, proxy, но у меня не работает этот код
[решено] Работа с html-кодом страницы, поиск и копирование нужных строк




в целом для контакта есть:

1. классная
полезная штука


2. и мой пробный вариант
сообщения о новых сообщениях
)




Цитата proxy:



Очень жаль, proxy, но у меня не работает этот код
[решено] Работа с html-кодом страницы, поиск и копирование нужных строк




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


показал для разбора: по аналогии ))
Аватара пользователя
proxy

Re: [решено] Работа с html-кодом страницы, поиск и копирование нужных строк

Сообщение proxy »

Может так? Хотя конечно, если бы можно было через _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.*?>

Сам исправил...
Аватара пользователя
beve

Re: [решено] Работа с html-кодом страницы, поиск и копирование нужных строк

Сообщение beve »

Цитата beve:



$sRezultat=StringregExpReplace($KodHtml,$pattern, "\1")
[решено] Работа с html-кодом страницы, поиск и копирование нужных строк




Объясни, пожалуйста, что эта строчка означает? Особенно меня смущает "\1", вообще не понимаю что это.

Мне нужен просто текст последнего сообщения - это текст между первыми найденными тегами

и , который будет служить эталоном для сравнения. Например,

тут текст,который должен занестись в $sRezultat = Привет!  :-D


Вот это у меня и не получается.

Твоя прога выводит: "Новых сообщений нету!" даже, если новое сообщение есть.

Может как-то зациклить надо, чтоб проверка происходила периодически после изменения странички? Только я не знаю, как изменение на странице отследить.
Аватара пользователя
Sestrichka

Re: [решено] Работа с html-кодом страницы, поиск и копирование нужных строк

Сообщение Sestrichka »

Цитата Sestrichka:



Объясни, пожалуйста, что эта строчка означает?
[решено] Работа с html-кодом страницы, поиск и копирование нужных строк




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



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

Вернуться в «AutoIt»