Что нового

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

snoitaleR

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

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

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

Garrett

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

snoitaleR

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

Garrett

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

snoitaleR

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

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

dwerf

Использует ArchLinux
Сообщения
478
Репутация
218
Набросок, не тестил
Код:
#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 Гуру
Сообщения
854
Репутация
223
dwerf
Вариант рабочий... :smile:
Единственное, я подумал, что можно сохранять только текст между начальной и конечной ограничивающей строкой, вместо сохранения всей страницы...
По замыслу, этот текст должен быть небольшим...
 

dwerf

Использует ArchLinux
Сообщения
478
Репутация
218
Код:
#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 319
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 Гуру
Сообщения
854
Репутация
223
dwerf
Во второй версии скрипта есть небольшая ошибка, но я понял, как скрипт работает, так что смогу исправить...
Спасибо за помощь... :smile:


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

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