Что нового

Монитор изменения вэб-страницы

snoitaleR

AutoIT Гуру
Сообщения
855
Репутация
223
Версия AutoIt: 3.3.6.1

Описание:
Нужно создать функцию, которой передается адрес вэб-страницы, начальная ограничивающая подстрока, конечная ограничивающая подстрока, и которая возвращает 1, если содержимое (вместе с тэгами) между начальной и конечной ограничивающей подстрокой изменилось, 0 - если не изменилось, и -1 - если начальная или конечная ограничивающая подстрока не найдена...

Примечания:
Я думаю, что функция будет содержать регулярные выражения, и, возможно, функции обработки тэгов, в чем я не очень хорошо разбираюсь, поэтому и пишу в разделе "Стол заказов"...
Прошу откликнуться тех, кому данная тема интересна...
 

Garrett

Модератор
Локальный модератор
Сообщения
3,999
Репутация
967
snoitaleR
Вы хотите отслеживать изменения данных (текстовых) на странице?
 
Автор
snoitaleR

snoitaleR

AutoIT Гуру
Сообщения
855
Репутация
223
Garrett
Да...
И вот еще, о чем подумал: нужен еще один вид ошибки (-2) на случай, если начальная ограничивающая строка не уникальна...
 

Garrett

Модератор
Локальный модератор
Сообщения
3,999
Репутация
967
snoitaleR
Можно ссылку на страницу поиска или код (полный) страницы, и что нужно отслеживать?!
 
Автор
snoitaleR

snoitaleR

AutoIT Гуру
Сообщения
855
Репутация
223
Garrett

Адрес страницы:
http://www.farmanager.com/download.php?l=ru
Начальная ограничивающая строка:
Код:
стабильные сборки
Конечная ограничивающая строка:
Код:
</b>

Определить начальную и конечную ограничивающую строку для страниц, по-моему, для скрипта будет не по силам, поэтому буду делать это вручную...
 

dwerf

Использует ArchLinux
Сообщения
478
Репутация
219
Набросок, не тестил
Код:
#include <String.au3>

Func _CompareWeb($URL, $Start, $End)
	Local $hDownload = InetGet($URL, 'NewSite.html', 1, 1)
	Do
		Sleep(250)
	Until InetGetInfo($hDownload, 2)
	If Not FileExists('OldSite.html') Then
		FileMove('NewSite.html', 'OldSite.html', 1)
		Return 0 ;Не с чем сравнивать, так что прощаем
	EndIf
	Local $between1 = _StringBetween(FileRead('NewSite.html'), $Start, $End, 1)
	If Not IsArray($between1) Then Return -1 ;Не найдено
	If UBound($between1) <> 1 Then Return -2 ;Найдено несколько
	Local $between2 = _StringBetween(FileRead('OldSite.html'), $Start, $End, 1)
	FileMove('NewSite.html', 'OldSite.html', 1) ;Новая страница тест прошла, можно сохранять её
	If Not IsArray($between2) Then Return -1 ;Не найдено
	If UBound($between2) <> 1 Then Return -2 ;Найдено несколько
	If $between1[0] == $between2[0] Then
		Return 0
	Else
		Return 1
	EndIf
EndFunc
 
Автор
snoitaleR

snoitaleR

AutoIT Гуру
Сообщения
855
Репутация
223
dwerf
Вариант рабочий... :smile:
Единственное, я подумал, что можно сохранять только текст между начальной и конечной ограничивающей строкой, вместо сохранения всей страницы...
По замыслу, этот текст должен быть небольшим...
 

dwerf

Использует ArchLinux
Сообщения
478
Репутация
219
Код:
#include <String.au3>

Func _CompareWeb($URL, $Start, $End)
	Local $hDownload = InetGet($URL, 'NewSite.html', 1, 1)
	Do
		Sleep(250)
	Until InetGetInfo($hDownload, 2)
	Local $between1 = _StringBetween(FileRead('NewSite.html'), $Start, $End, 1)
	If Not IsArray($between1) Then Return -1 ;Не найдено
	If UBound($between1) <> 1 Then Return -2 ;Найдено несколько
	If FileExists('OldText.txt') Then ;Если есть сохранение
		Local $between2 = FileRead('OldText.txt') ;Читаем
		FileDelete('OldText.txt')
		FileWrite('OldText.txt', $between1[0]) ;Новая страница тест прошла, старую прочитали, можно перезаписывать
		If $between1[0] == $between2 Then
			Return 0
		Else
			Return 1
		EndIf
	Else
		FileWrite('OldText.txt', $between1[0])
	EndIf
EndFunc
Как то так
А вообще было бы не плохо сделать проверку входных параметров, прав на запись итп. Но думать лень. :-[
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
snoitaleR
Можно еще так попробовать:
Код:
#include <IE.au3>
#include <Array.au3>
;#include <File.au3>

$sURL = "http://www.farmanager.com/download.php?l=ru"
Dim $aNews[1]

$oIE = _IECreate($sURL, 0, 0)
$sTest = _IEBodyReadText($oIE)
_IEQuit($oIE)
$aTest = StringSplit($sTest, @CRLF)
For $i = 1 To UBound($aTest) - 1
	If StringInStr($aTest[$i], "Far Manager") <> 0 Or _
			StringInStr($aTest[$i], "Последнее изменение") <> 0 Then
		_ArrayAdd($aNews, $aTest[$i])
		$aTest[0] += 1
	EndIf
Next
If $aTest[0] <> 0 Then
	_ArrayDisplay($aNews, "Far Manager", UBound($aNews) - 3)
	;_FileWriteFromArray(@ScriptDir & "\Test.txt", $aNews, 1, UBound($aNews) - 3)
Else
	MsgBox(0, "Far Manager", "Error")
EndIf
 
Автор
snoitaleR

snoitaleR

AutoIT Гуру
Сообщения
855
Репутация
223
dwerf
Во второй версии скрипта есть небольшая ошибка, но я понял, как скрипт работает, так что смогу исправить...
Спасибо за помощь... :smile:


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

madmasles
Изучая скрипт, пришла в голову идея о том, что неплохо было бы страницу вычистить от двойных пробелов, @CRLF, табуляций и других "незначащих" символов, количество которых может изменяться без изменения смысла...
Спасибо за помощь... :smile:
 
Верх