Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » AutoIt » [решено] Работа с html-кодом страницы, поиск и копирование нужных строк

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

Новый участник


Сообщения: 14
Благодарности: 0

Профиль | Отправить PM | Цитировать


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

Отправлено: 11:30, 25-03-2009

 

Аватара для proxy

Старожил


Сообщения: 460
Благодарности: 152

Профиль | Отправить PM | Цитировать


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')

-------
Мысли-читатель сломался, может подробней расскажите?
А где исходный код? Или мы стихи обсуждаем?! )) Настройки темы > Решено ?


Отправлено: 13:14, 25-03-2009 | #2



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

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


Аватара для beve

Старожил


Сообщения: 307
Благодарности: 137

Профиль | Отправить PM | Цитировать


_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)
При такой раскладке, одно но, что в зависимости от скорости инета, процес займет некоторое время...

-------
Не в кількості знань полягає освіта, а в повному розумінні і вмілому використанні того, що знаєш.

Это сообщение посчитали полезным следующие участники:

Отправлено: 15:06, 25-03-2009 | #3


Аватара для proxy

Старожил


Сообщения: 460
Благодарности: 152

Профиль | Отправить PM | Цитировать


Цитата beve:
$oIE = _IECreate (" http://odnoklassniki.ru/",0,0) »
+ можно его в HIDE
+ попробовать может через _IECreateEmbedded - еще лучше будет, если получится?

-------
Мысли-читатель сломался, может подробней расскажите?
А где исходный код? Или мы стихи обсуждаем?! )) Настройки темы > Решено ?


Отправлено: 15:41, 25-03-2009 | #4


Новый участник


Сообщения: 14
Благодарности: 0

Профиль | Отправить PM | Цитировать


Цитата 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:22.


Отправлено: 16:03, 25-03-2009 | #5


Новый участник


Сообщения: 14
Благодарности: 0

Профиль | Отправить PM | Цитировать


Цитата beve:
_INetGetSource можна было б использовать, но тут ведь нужно после запуска страницы еще на ссылку МОИ СООБЩЕНИЯ перейти... Вот я предлагаю такое решение, при котором в переменную заносится последнее сообщение: »
Нет, beve, мне нужен именно форум: внизу страницы пользователя отображаются последнии сообщеня на его форуме.
Вот тут я что-то туплю:
Цитата beve:
там где \1 - имя написавшего, а где \2 - текст сообщения $sRezultat=StringregExpReplace($KodHtml,$pattern, "\1 \2") »
Тут оно, как я понимаю, выводить должно имя написавшего и текст сообщения. Или ты имел в виду, что я должна тут что-то дописать?
Потому, что если без изменений беру твой код, то выводит весь код страницы

Отправлено: 16:17, 25-03-2009 | #6


Аватара для proxy

Старожил


Сообщения: 460
Благодарности: 152

Профиль | Отправить PM | Цитировать


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

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

Цитата proxy:
Очень жаль, proxy, но у меня не работает этот код »
тот пример для сайта в-контакте: www.vkontakte.ru
показал для разбора: по аналогии ))

-------
Мысли-читатель сломался, может подробней расскажите?
А где исходный код? Или мы стихи обсуждаем?! )) Настройки темы > Решено ?


Отправлено: 17:06, 25-03-2009 | #7


Аватара для beve

Старожил


Сообщения: 307
Благодарности: 137

Профиль | Отправить PM | Цитировать


Может так? Хотя конечно, если бы можно было через _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, 25-03-2009 в 20:56.


Отправлено: 17:26, 25-03-2009 | #8


Новый участник


Сообщения: 14
Благодарности: 0

Профиль | Отправить PM | Цитировать


Цитата 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>Привет!  :-D</p>
Вот это у меня и не получается.
Твоя прога выводит: "Новых сообщений нету!" даже, если новое сообщение есть.
Может как-то зациклить надо, чтоб проверка происходила периодически после изменения странички? Только я не знаю, как изменение на странице отследить.

Отправлено: 16:37, 26-03-2009 | #9


Аватара для beve

Старожил


Сообщения: 307
Благодарности: 137

Профиль | Отправить PM | Цитировать


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

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

-------
Не в кількості знань полягає освіта, а в повному розумінні і вмілому використанні того, що знаєш.


Последний раз редактировалось beve, 26-03-2009 в 21:54.


Отправлено: 21:32, 26-03-2009 | #10



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » AutoIt » [решено] Работа с html-кодом страницы, поиск и копирование нужных строк

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
[решено] Сохранение загруженной html-страницы Sestrichka AutoIt 12 12-11-2009 18:50
[решено] Копирование текста из веб страницы r35TnX AutoIt 9 02-03-2009 18:58
[решено] Поиск нужного текста в html коде страницы ph0en1x AutoIt 8 16-02-2009 02:38
[решено] Поиск файлов в подпапках и их последующее копирование D_Master AutoIt 4 10-02-2009 07:32
Select с HTML кодом vadimiron Вебмастеру 10 19-02-2007 11:34




 
Переход