Что нового

[Данные, строки] Парсинг из защищенной паролем HTML страницы в xml файл.

antotor

Новичок
Сообщения
10
Репутация
0
Наверно у меня не совсем стандартный вопрос, и решить его я хотел силами php, но к сожалению не удалось. Потому обращаюсь к Вам - гуру autoIt.

Итак, имеется некая веб страница защищенная паролем (страница на внутрисетевом ресурсе, потому недоступна извне, адрес предположим: http://stat.localserver.ru/adminion/index.py?action=main), код страницы:

Код:
<html>
<head>
	<meta http-equiv="Content-type" content="text/html; charset=utf-8" />
	<meta http-equiv="Content-language" content="ru" />
	<link href="rfnet.css" rel="stylesheet" type="text/css">
	<style type="text/css"/></style>
	<script type="text/javascript" src="../datetimepicker_css.js"></script>
</head>
<body>
	<table border="0">

		<tr>
		<td width="150" valign="top">Главная
<a href="index.py?action=acc">Статистика</a>
<a href="index.py?action=acc2">Статистика 2</a>
<a href="index.py?action=acc3">Статистика 3</a>
<a href="index.py?action=acc4">Статистика 4</a>
<a href="index.py?action=acc5">Статистика 5</a>
<a href="index.py?action=acc6">Статистика 6</a>
<a href="index.py?action=acc7">Статистика 7</a>


























</td>
		<td>Главная статистика

<table border="1">
<tr><td>Всего</td><td>149935</td></tr>

<tr><td>Онлайн</td><td>398</td></tr>
<tr><td>Суммарно</td><td>7892113</td></tr>
<tr><td>История</td><td>265596</td></tr>

</table>
</td>
		</tr>
	</table>
</body>

</html>

В строку
Код:
<tr><td>Онлайн</td><td>398</td></tr>
некая функция возвращает число. Мне нужно средствами AutoIt получать это число и сохранять его в определенную строку, определенного текстового файла. Причем перед числом и после числа должен располагаться текст, вот такой:
Код:
	<set value='398' />
После вставки числа, файл должен сохраняться.

Итого, алгоритм должен быть следующий:

1. Заходим на страницу (браузером по идее)
2. Вводим логин и пароль
3. Получаем искомое число
4. Закрываем браузер
5. Открываем нужный TxT файл с названием "Sales.xml"
6. Отсчитываем 20 строку и устанавливаем туда курсор.
7. Пишем в строке "<set value='"
8. Вставляем сохраненное число
9. Пишем в строке "' />"
10. Сохраняем и закрываем файл

Помогите, пожалуйста, уже неделю бьюсь пока даже просто толком извлекать число не удалось...
 

axlwor

Скриптер
Сообщения
657
Репутация
147
1.
Код:
#include <ie.au3>
$url = '' ;адрес
$oIE = _IECreate($url) ; по хелпу почитаешь другие параметры

2. Тут думать нужно. Идентификация бывает разная
может быть такая
Код:
$oForm = _IEFormGetObjByName ($oIE, "Имя Формы")
$oLogin = _IEFormElementGetObjByName ($oForm, "Поле Логина")
$oPassword = _IEFormElementGetObjByName ($oForm, "Поле Пароля")
$oSubmit = _IEFormElementGetObjByName ($oForm, "Кнопка отправки формы")
_IEFormElementSetValue ($oLogin, "Твой логин")
_IEFormElementSetValue ($oPassword, "Твой пароль")
_IEFormSubmit ($oForm) ; Может так
;~_IEAction ($oSubmit, "click") ; а может так
_IELoadWait ($oIE)

3. Тоже несколько вариантов RegExp/Table
Код:
$pattern = '<tr><td>Онлайн</td><td>(/d*)</td></tr>'
$sHTML = _IEBodyReadHTML ($oIE)
$aArr = StringRegExp ($sHTML, $pattern, 3)

искомое число должно быть $aArr[0]
Код:
$oTable = _IETableGetCollection ($oIE, 1)
$aTableData = _IETableWriteToArray ($oTable)

Искомое где то $aTableData[1][1]
4.
Код:
_IEQuit($oIE)

А вот дальше хитрее. Или xml пользовать как текстовый файл или как xml
 
Автор
A

antotor

Новичок
Сообщения
10
Репутация
0
Спасибо) Начало положено!

Только я не понял как же это искомое число сохранить в буфер обмена?
 

axlwor

Скриптер
Сообщения
657
Репутация
147
Код:
ClipPut ( "value" )

Только зачем его в буфер обмена сувать?
 
Автор
A

antotor

Новичок
Сообщения
10
Репутация
0
Для дальнейших действий:

4. Закрываем браузер
5. Открываем нужный TxT файл с названием "Sales.xml"
6. Отсчитываем 20 строку и устанавливаем туда курсор.
7. Пишем в строке "<set value='"
8. Вставляем сохраненное число
9. Пишем в строке "' />"
10. Сохраняем и закрываем файл

Я похоже клинический тупак, но вместо value при первом варианте выбора числа что нужно указывать? Интутивно вставил "$aArr" но и в буфер копируется $aArr....


Добавлено:
Сообщение автоматически объединено:

А вот дальше хитрее. Или xml пользовать как текстовый файл или как xml

Как текстовый файл.
 

Redline

AutoIT Гуру
Сообщения
506
Репутация
370
axlwor [?]
$pattern = '<tr><td>Онлайн</td><td>(/d*)</td></tr>'
обратный слеш нужен ;)
antotor [?]
5. Открываем нужный TxT файл с названием "Sales.xml"
6. Отсчитываем 20 строку и устанавливаем туда курсор.
7. Пишем в строке "<set value='"
8. Вставляем сохраненное число
9. Пишем в строке "' />"
10. Сохраняем и закрываем файл
Код:
#Include <File.au3>
_FileWriteToLine('c:\file.xml', 20, "<set value='" & $sValue & "' />", 1)
 
Автор
A

antotor

Новичок
Сообщения
10
Репутация
0
Итого, пока обошелся без логина пароля.

получается такой скрипт:

Код:
#include <ie.au3>
$url = 'http://stat.localserver.ru/adminion/index.py?action=main'
$oIE = _IECreate($url)
$pattern = '<tr><td>Онлайн</td><td>(\d*)</td></tr>'
$sHTML = _IEBodyReadHTML ($oIE)
$aArr = StringRegExp ($sHTML, $pattern, 3)
#Include <File.au3>
_FileWriteToLine('L:\home\172.16.11.15\www\Data\SalesCompare.xml', 20, "<set value='" & $aArr & "' />")

Итого при запуске в нужный файл вписывается следующее:

<set value='235' />
<set value='1' />

Текущее значение строчки "онлайн" при этом 463.
Вторая цифра вообще непонятно откуда.

Подскажите в чем проблема? Понимаю что где то адово туплю, но где не пойму)

Блин, теперь только одну строку пишет:

<set value='1' />

Попробовал еще раз, теперь 2 строки пишет:


<set value='1' />
<set value='1' />

Магия какая то.

Черт) Кажется что то начало работать!!!

Вот этот код возвращает корректное число!!

Код:
#include <ie.au3>
$url = 'http://stat.localserver.ru/adminion/index.py?action=main'
$oIE = _IECreate($url)
$pattern = '<tr><td>Онлайн</td><td>(\d*)</td></tr>'
$oTable = _IETableGetCollection ($oIE, 1)
$aTableData = _IETableWriteToArray ($oTable)
#Include <File.au3>
_FileWriteToLine('L:\home\172.16.11.15\www\Data\SalesCompare.xml', 20, "<set value='" & $aTableData[1][1] & "' />")
 

Redline

AutoIT Гуру
Сообщения
506
Репутация
370
antotor [?]
Код:
$aArr = StringRegExp ($sHTML, $pattern, 3)
Возвращиет массив совпавших данных - его можно посмотреть:
Код:
#include <Array.au3>
$pattern = '<tr><td>Онлайн</td><td>(\d*)</td></tr>'
$aArr = StringRegExp ($sHTML, $pattern, 3)
_ArrayDisplay($aArr)

По идее ты должен найти только одно значение(если указанная тобой строка уникальна) и содержится она в массиве под индексом 0 :
Код:
$aArr[0]
вот это и вставляй.
PS: Код обрамляй тегом Autoit.
 

axlwor

Скриптер
Сообщения
657
Репутация
147
да. слэши на разных ноутах в разных местах :-[

Код:
_FileWriteToLine('L:\home\172.16.11.15\www\Data\SalesCompare.xml', 20, "<set value='" & $aArr[0] & "' />", 1)

По хелпу последний параметр $fOverWrite делаем 1

А ввод логина/пароля оставим на завтрашнее утро :whistle:

и п.4 не забудь вставить код
 
Автор
A

antotor

Новичок
Сообщения
10
Репутация
0
В общем я добился результата, данный код у меня возвращает корректное число.


Код:
#include <ie.au3>
$url = 'http://stat.localserver.ru/adminion/index.py?action=main'
$oIE = _IECreate($url)
$pattern = '<tr><td>Онлайн</td><td>(\d*)</td></tr>'
$oTable = _IETableGetCollection ($oIE, 1)
$aTableData = _IETableWriteToArray ($oTable)
#Include <File.au3>
_FileWriteToLine('L:\home\172.16.11.15\www\Data\SalesCompare.xml', 20, "<set value='" & $aTableData[1][1] & "' />")


Теперь есть следующая проблема. Как стереть содержимое строки, в которую я хочу вставить значение $aTableData? То есть то есть перед вставкой содержимого нужно сначала очистить конкретную строку.
 

axlwor

Скриптер
Сообщения
657
Репутация
147
:laugh:повторяю
Код:
#include <ie.au3>
#Include <File.au3>
$url = 'http://stat.localserver.ru/adminion/index.py?action=main'
$oIE = _IECreate($url)
; когда точно поймешь что это работает. 
; можно попробовать $oIE = _IECreate($url, 0, 0)
; но нужно быть осторожным. ошибки тут не обрабатывали
; и ИЕ может разрастаться
$pattern = '<tr><td>Онлайн</td><td>(\d*)</td></tr>'
$oTable = _IETableGetCollection ($oIE, 1)
$aTableData = _IETableWriteToArray ($oTable)
_IEQuit($oIE)
_FileWriteToLine('L:\home\172.16.11.15\www\Data\SalesCompare.xml', 20, "<set value='" & $aTableData[1][1] & "' />", 1)
 

Redline

AutoIT Гуру
Сообщения
506
Репутация
370
antotor [?]
Как стереть содержимое строки, в которую я хочу вставить значение
Дык для начало надо было потестировать функцию _FileWriteToLine и увидеть что она вставляет строчку не до и даже не после указанного номера строки, а вместо!(т.е. стирает все из нее и пишет новые данные)
 
Автор
A

antotor

Новичок
Сообщения
10
Репутация
0
У меня содержимое строки почему то не удаляется, а переносится на следующую строку...
 

Redline

AutoIT Гуру
Сообщения
506
Репутация
370
antotor [?]
У меня содержимое строки почему то не удаляется, а переносится на следующую строку...
Код:
_FileWriteToLine('L:\alesCompare.xml', 20, "<set value='" & $aTableData[1][1] & "' />", 1)

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

antotor

Новичок
Сообщения
10
Репутация
0
Спасибо! Действительно заработало.


Добавлено:
Сообщение автоматически объединено:

Осталось собственно залогиниться на сайт.

Код:
$oForm = _IEFormGetObjByName ($oIE, "Имя Формы")
$oLogin = _IEFormElementGetObjByName ($oForm, "Поле Логина")
$oPassword = _IEFormElementGetObjByName ($oForm, "Поле Пароля")
$oSubmit = _IEFormElementGetObjByName ($oForm, "Кнопка отправки формы")
_IEFormElementSetValue ($oLogin, "Твой логин")
_IEFormElementSetValue ($oPassword, "Твой пароль")
_IEFormSubmit ($oForm)
_IELoadWait ($oIE)


При таком коде - ничего не происходит. Открывается стандартное окошко эксплорера с просьбой ввести пароль, но ничего не вводится. Что может быть не так? может неверно задаю имя формы? Имя формы это имя окна?
 

Garrett

Модератор
Локальный модератор
Сообщения
3,999
Репутация
964
antotor [?]
Открывается стандартное окошко эксплорера с просьбой ввести пароль
Этот код вставляет данные в форму на странице! А у вас, по всей видимости, авторизация на уровне сервера, и поэтому выскакивает pop-up окно! Так? Тогда используйте стандартные функции Autoit.
 

axlwor

Скриптер
Сообщения
657
Репутация
147
и не должно. Все что в кавычках русскими буквами - нужно заменить на твои данные
 
Автор
A

antotor

Новичок
Сообщения
10
Репутация
0
Естественно) Я и заменяю все там на свои данные, видимо причина в том что это отдельное окно (о чем было сказано в предыдущем посте) :smile:
 
Автор
A

antotor

Новичок
Сообщения
10
Репутация
0
Подскажите, пожалуйста, как ввести данные о логине и пароле в поп ап окно...
 

SyDr

Сидра
Сообщения
651
Репутация
158
Попробуй лучше так:
"http://имяпользователя:пароль@адрес"
 
Верх