Отслеживание изменений на сайтах

Обсуждение программ nnCron и nnCron LITE

Отслеживание изменений на сайтах

Postby Morituruz » Sat, 07 Jan 2012, 17:32

Задача читает настройки из ini файла check.ini, который вы должны создать в каталоге nncron.
Суть задачи: каждые два часа скачиваем html страничку по заданному адресу, проверяем с помощью регулярных выражений нужный нам текст и сравниваем его с тем, что у нас сохранено. Если не совпадает, то выводим вот такое сообщение:
Image

Для работы задачи необходимы плагины уважаемого VoidVolker: Автостроки и lists.spf
а также плагин ini.spf.
Code: Select all
#( get_updates
NoLog
Time: ? */2 * * * *
SingleInstance
Rule: ONLINE? ;
VARIABLE found?
0 VALUE zhtml
CREATE brwsr 256 ALLOT
\ 300 кБ на страничку должно хватить:
300000 ALLOCATE THROW TO zhtml
STRING-LIST: gup

: SITEONLYNAME 2DUP
" /[\w0-9\-]+\.\w+(\/)?=/i" RE-MATCH
IF
   2DROP
   $0
ELSE
THEN
;

: default? " default value" COMPARE 0= ;

: iUrl " url" INI-GET-VALUE ;
: iRegExp " re" INI-GET-VALUE ;
: iGroup " gr" INI-GET-VALUE ;
: iText " text" INI-GET-VALUE ;
: iNotRequired " nr" INI-GET-VALUE ;
: iDisabled " dis" INI-GET-VALUE ;
Action:
\ путь до браузера:
" c:\Program Files (x86)\Opera\opera.exe" brwsr PLACE

\ ищем секции в ini-файле и заносим их названия в список:
" .\check.ini" FILE " /(\r\n\[)?#3\w+(\]\r\n)?=/i" RE-ALL
   $0 gup!
;RE-ALL

" .\check.ini" INI-FILENAME
gup(
   \ определяем раздел ини-файла:
   NODE@ INI-SECTION
   \ нужно ли проверять этот раздел?
   iDisabled default?
   IF
      \ проверка на наличие необходимых параметров:
      iUrl default? NOT
      iRegExp default? NOT
      AND
      IF
         iUrl HTTP-GET 0=
         IF
            2DUP zhtml ZPLACE
            found? OFF
            \ регулярное выражение
            iRegExp RE-ALL
               \ включаем флаг, что на страничке это есть:
               found? ON
               \ сравниваем найденное (если нашлось конечно) с сохранённой строчкой
               iGroup default?
               IF
                                                     \ проверяется $0
                  $0 iText COMPARE 0<>
                  IF
                     \ если не совпадает, спрашиваем
                     4164 NODE@ DROP " %iUrl%|n|nБыло:|n%iText%|nСтало:|n%$0%|n|nСохранить?" DROP 0 MessageBoxA 6 =
                     IF
                        \ если нажимаем да, то новый текст сохраняем
                        " text" $0 INI-SET-VALUE
                        4164 NODE@ DROP " %iUrl%|nОткрыть?" DROP 0 MessageBoxA 6 =
                        IF
                           StartIn: "%brwsr COUNT ONLYDIR%"
                           " %brwsr COUNT% %iUrl%" START-APP
                        THEN
                     THEN
                  ELSE
                     \ искомый текст не изменился
                     \ MSG: "Без изменений"
                  THEN
               ELSE
                  \ проверяется указанная группа
                  iGroup EVALUATE iText COMPARE 0<>
                  IF
                     \ если не совпадает, спрашиваем
                     4164 NODE@ DROP " %iUrl%|n|nБыло:|n%iText%|nСтало:|n%iGroup EVALUATE%|n|nСохранить?" DROP 0 MessageBoxA 6 =
                     IF
                        \ если нажимаем да, то новый текст сохраняем
                        " text" iGroup EVALUATE INI-SET-VALUE
                        4164 NODE@ DROP " %iUrl%|nОткрыть?" DROP 0 MessageBoxA 6 =
                        IF
                           StartIn: "%brwsr COUNT ONLYDIR%"
                           " %brwsr COUNT% %iUrl%" START-APP
                        THEN
                     THEN
                  ELSE
                     \ искомый текст не изменился
                     \ MSG: "Без изменений"
                  THEN
               THEN
            ;RE-ALL
            found? @ NOT
            \ и должно ли там вообще находиться что-то:
            iNotRequired default?
            ONLINE?
            AND
            AND
            IF
               \ значит на скачанной страничке вообще ничего не нашлось, а должно бы
               4148 NODE@ DROP " Вот здесь:|n%iUrl%|nвообще ничего не нашлось. Открыть?" DROP 0 MessageBoxA 6 =
               IF
                  \ открываем адрес
                  StartIn: "%brwsr COUNT ONLYDIR%"
                  " %brwsr COUNT% %iUrl%" START-APP
               THEN
            THEN
         ELSE
            2DROP
            ONLINE?
            IF
               \ что-то не получилось скачать
               16 NODE@ DROP " Ошибка загрузки страницы:|n%iUrl%" DROP 0 MessageBoxA DROP
            THEN
         THEN
      ELSE
         \ не все параметры в секции указаны
         48 NODE@ DROP " В разделе|n%NODE@%|nотсутствуют необходимые параметры." DROP 0 MessageBoxA DROP
      THEN
      \ MSG: "end"
   THEN
)gup

\ убираем за собой:
gup LIST-FREE
)#


check.ini-файл с двумя примерами:
Code: Select all
; Обязательные параметры:
; url — скачиваемая страничка
; re — регулярное выражение, с помощью которого ищем. Может содержать %слова из крона%.
; Необязательные параметры:
; dis — вкл/выкл для данной секции. Если хотим пропускать эту секцию, параметр должен быть.
; gr — какая группа из регулярного выражения отслеживается (от $1 до $15). Если не параметр отсутствует, отслеживается $0.
; text — сохранённый результат последнего поиска. Сам заполнится при первом поиске.
; nr — обязательно ли на странице должно что-то находиться. Если параметр есть в секции, то регулярное выражение не обязано что-то находить.
[cfosspeed]
re=/(cfosspeed_release_x86_version\x22>)(.+)(<\/span>)?=/i
gr=$2
url=http://www.cfos.de/ru/download/download.htm
text=7.00
[Emelianenko]
url=http://rutracker.org/forum/viewtopic.php?t=690522
re=/(690522\x22\>)?#8.+(<\/a><\/h1>)?=/i
text=Федор Емельяненко [все бои в MMA, 39 боёв] Fedor Emelianenko [MMA career pack, 39 fights] [2011 г., ММА, DVDRip]


Вот эта задача, созданная для удобства, скачивает страничку в папку nncron для последующего подбора нужного регулярного выражения (например в просмотре через total commander):
Code: Select all
#( http_get
NoLog
NoActive
Action:
WIN-INPUT-TEXT: "http_get" "Скачать страничку:" "http://" 0 0=
IF
   HTTP-GET 0=
   IF
      " http_get.html" FWRITE
   ELSE
      2DROP
      MSG: "ошибка загрузки"
   THEN
   MSG: "done"
THEN
)#


Синтаксис регулярных выражений описан тут:
http://www.nncron.ru/help/RU/add_info/regexp.htm

Также чуть ниже середины этой странички есть удобное поле для быстрого подбора нужного выражения (синтаксис несколько отличается от того, что используется в nncron):
http://www.zytrax.com/tech/web/regex.htm
Last edited by Morituruz on Fri, 13 Jan 2012, 01:48, edited 6 times in total.
User avatar
Morituruz
 
Posts: 725
Joined: Sun, 14 Oct 2007, 01:51

Re: Проверка/отслеживание изменений на сайтах

Postby VoidVolker » Sat, 07 Jan 2012, 19:19

Moriturus wrote:
Code: Select all
" %crlf%%crlf%Было:%crlf%"

Code: Select all
" |n|nБыло:|n"

Moriturus wrote:
Code: Select all
" c:\Program Files\Opera\opera.exe" brwsr PLACE

Code: Select all
: brwsr " c:\Program Files\Opera\opera.exe" ;
95% вопросов уже обсуждались на форуме или ответы на них есть в мануале.        nnCron 1.93 b15.exe
Как правильно задавать вопросы.
User avatar
VoidVolker
Site Admin
 
Posts: 2898
Joined: Tue, 25 Apr 2006, 17:56

Re: Проверка/отслеживание изменений на сайтах

Postby Morituruz » Sat, 07 Jan 2012, 19:30

Это конечно да, я просто ещё не привык, а вот эта конструкция нормальна
Code: Select all
" re" INI-GET-VALUE EVAL-SUBST RE-ALL

в том плане, чтобы исполнять возможные %nncron слова% в сохранённом регэкспе?
User avatar
Morituruz
 
Posts: 725
Joined: Sun, 14 Oct 2007, 01:51

Re: Отслеживание изменений на сайтах

Postby VoidVolker » Sat, 07 Jan 2012, 21:48

Можно использовать и автостроки. Например так:
Code: Select all
: ESUBST [ {{ AUTOSTRINGS_MODULE ' sliteral COMPILE,  }} ] ;

Хм, может в австостроках сделать переопределение EVAL-SUBST?
95% вопросов уже обсуждались на форуме или ответы на них есть в мануале.        nnCron 1.93 b15.exe
Как правильно задавать вопросы.
User avatar
VoidVolker
Site Admin
 
Posts: 2898
Joined: Tue, 25 Apr 2006, 17:56

Re: Отслеживание изменений на сайтах

Postby Morituruz » Sat, 07 Jan 2012, 22:34

Я наверное глупость скажу, но если можно неэффективное, медленное слово EVAL-SUBST переопределить в хорошее, годное, может и автостроки не особо нужны? И людям кронтабы переделывать не надо :)
Мне то в моих двух с половиной примитивных задачах со списками и строками это не нужно.
User avatar
Morituruz
 
Posts: 725
Joined: Sun, 14 Oct 2007, 01:51

Re: Отслеживание изменений на сайтах

Postby VoidVolker » Sat, 07 Jan 2012, 23:01

Moriturus wrote:Я наверное глупость скажу, но если можно неэффективное, медленное слово EVAL-SUBST переопределить в хорошее, годное, может и автостроки не особо нужны? И людям кронтабы переделывать не надо

Плагин автостроки как раз именно это и делает. И даже добавляет дополнительный функционал. Если нужна производительность и удобство, то не думаю, что есть какие-то сложности сделать автозамену S" на " , стереть несколько EVAL-SUBST, и заменить вывод числовых переменных на текстовый. Если это слишком сложно, то следует переписать заново весь код в более высоком качестве.
95% вопросов уже обсуждались на форуме или ответы на них есть в мануале.        nnCron 1.93 b15.exe
Как правильно задавать вопросы.
User avatar
VoidVolker
Site Admin
 
Posts: 2898
Joined: Tue, 25 Apr 2006, 17:56

Re: Отслеживание изменений на сайтах

Postby Morituruz » Fri, 13 Jan 2012, 01:49

Обновление!
Добавлены группы в регэкспе.
Улучшена читаемость :)
User avatar
Morituruz
 
Posts: 725
Joined: Sun, 14 Oct 2007, 01:51


Return to nnCron forum (Russian)

Who is online

Users browsing this forum: No registered users and 1 guest

cron