Что нового

[Данные, строки] Парсинг из защищенной паролем 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
Репутация
369
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
Репутация
369
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
Репутация
369
antotor [?]
Как стереть содержимое строки, в которую я хочу вставить значение
Дык для начало надо было потестировать функцию _FileWriteToLine и увидеть что она вставляет строчку не до и даже не после указанного номера строки, а вместо!(т.е. стирает все из нее и пишет новые данные)
 
Автор
A

antotor

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

Redline

AutoIT Гуру
Сообщения
506
Репутация
369
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://имяпользователя:пароль@адрес"
 
Верх