Vinni Опубликовано 7 мая, 2008 Автор Поделиться Опубликовано 7 мая, 2008 Букмарк - это "Закладка". Та строчка, которая, собственно, и мониторится на предмет изменений. А вот "как написать скрипт" - это, я боюсь, очень сложный вопрос. но послушаем Vinni, конечно. Итак, начинаем :smile7: Задача 1. Сохранить не только последнюю и предпоследнюю версии контролируемой веб-страницы (закладки, букмарка, bookmark :smile1: ), но и все предыдущие в отдельных файлах. Формат хранения информации в архиве -для каждой закладки создается отдельная директория с именем, соответствующим имени закладки в WSW, в которой для каждой версии веб-страницы хранится два файла со следующими именами, основанными на дате-времени создания данной версии веб-страницы (например, 200805061645 - 2008 год, месяц - 05, день - 06, час - 16, минуты - 45) -дата_время_создания-версии.html - HTML-версия страницы -дата_время_создания-версииchg.html - HTML-версия страницы, в которой желтым цветом выделены изменения в данной версии по сравнению с предыдущей -для получения информации о том, какой директории какой URL соответствует, создается конфигурационный текстовый файл следующего формата (одна строка - одна закладка) - имя (из свойств закладки в WSW) (например, Yandex) - это имя поддиректории в архиве! - URL (например, http://www.yandex.ru) -дата-время последнего обновления страницы в том же формате (например, 200805061645) Для поиска информации по рубрикам предлагаю использовать Yandex Desktop Search - можно запланировать разработку другого скрипта для автоматизации создания списка страниц по той или иной рубрике, заданной поисковым запросом в YDS. :smile3: ЧАСТЬ 1. Решение: 1) установить интерпретатор языка Perl и указать при установке, чтобы была создана файловая ассоциация для расширения .pl (чтобы при открытии такого файла запускался интерпретатор Perl и выполнял скрипт в этом файле) 2) поместить все закладки, для которых нужно сохранять историю в специально созданную для этого папку (folder) в WSW (в моем случае - WebSite-Watcher) 3) создать специальную директорию на диске, где будут размещены скрипты и результаты их работы (в моем случае - d:\wsw) и поддиректории arc - для хранения веб-страниц (в ней создать пустой файл url.info для хранения конфигурационной информации) rep - для хранения созданных отчетов WSW 4) так как информация об изменениях в страницах будет получаться от WSW с помощью встроенных в него отчетов(report), то нужно в этой директории создать файл с отчетом следующего содержания (важно, чтобы он имел ровно три строки, так как скрипт рассчитывает на это!) {wsw_dateformat(yyyymmddhhnn)}{wsw_report_date} {wsw_begin_url}"{wsw_url_name}","{wsw_url_url}","{wsw_url_date_changed}","{wsw_url_path_filename}","{wsw_url_path_filename_chg}" {wsw_end_url} Директива {wsw_dateformat(yyyymmddhhnn)} задает форматы даты в отчете (значение в этом формате служит основой при формировании имени файла с версией веб-страницы! ), а {wsw_report_date} выводит в отчет текущую дату время. Далее между {wsw_begin_url} и {wsw_end_url} помещено описание формата, в котором будет выведена информация о каждой измененной закладке (каждое поле заключается в кавычки и разделяется запятыми) {wsw_url_name} - имя закладки из ее свойств в WSW {wsw_url_url} - URL закладки (или поисковый запрос) {wsw_url_date_changed} - дата-время последнего изменения страницы {wsw_url_path_filename} - полный путь к файлу с последней версией страницы в хранилище страниц WSW {wsw_url_path_filename_chg} - полный путь к файлу с последней версией страницы с подсвеченными изменениями в хранилище страниц WSW 5) создать следующий скрипт WSW и поместить его в файл с именем save_history.wws CheckFolder "WebSite-Watcher" /subfolder if GetUpdatedBookmarkCount=0 then goto NoUpdates $filename = GetDateTime("yyyymmddhhnn") $filename = "d:\wsw\rep\" + $filename CreateReport /template="d:\wsw\report.template" /output="{$filename}" /bookmarks=changed RunProgram "d:\wsw\save.pl" /parameter="{$filename}" Label NoUpdates Quit >CheckFolder "WebSite-Watcher" /subfolder проверить закладки в папке WebSite-Watcher со всеми ее подпапками (/subfolder ) >if GetUpdatedBookmarkCount=0 then goto NoUpdates если изменений в закладках нет - прекратить работу > $filename = GetDateTime("yyyymmddhhnn") > $filename = "d:\wsw\rep\" + $filename иначе сформировать имя файла, в котором будет храниться отчет об изменениях в страницах >CreateReport /template="d:\wsw\report.template" /output="{$filename}" /bookmarks=changed создать отчет по шаблону в "d:\wsw\report.template", вывести в него информацию только об изменившихся закладках (/bookmarks=changed) >RunProgram "d:\wsw\save.pl" /parameter="{$filename}" запустить внешнюю программу на Perl для анализа отчета и переноса текущих версий закладок в новый архив >Label NoUpdates >Quit прекратить работу WSW Запускать этот скрипта нужно командой "C:\Program Files\WebSite-Watcher\wswatch.exe" /SCRIPT="d:\wsw\save_history.wws" Ссылка на комментарий Поделиться на другие сайты More sharing options...
Vinni Опубликовано 7 мая, 2008 Автор Поделиться Опубликовано 7 мая, 2008 ЧАСТЬ 2 Для удобства я собрал все файлы в архиве, приложенном к сообщению - надо распаковать его в директорию d:\wsw Скрипт на Perl #!/usr/bin/perl -w use strict; my $ARC_DIR='d:/wsw/arc/'; my $urlfile=$ARC_DIR."url.info"; my %uinfo=(); my %uchanged=(); if ($ARGV[0] ne "") { my $fname=$ARGV[0]; &load_urls($urlfile); &load_report($fname); &save_urls($urlfile); } exit(0); sub load_urls { my ($uname)=@_; open(U,$uname); while (<U>) { chomp; my @ulist=split(/\t/); next if $ulist[0] eq "" || $ulist[1] eq ""; $uinfo{$ulist[1]}=$ulist[0]; $uchanged{$ulist[1]}=$ulist[2]; } close(U); } sub save_urls { my ($uname)=@_; open(U,">$uname"); for my $url (keys %uinfo) { next if $url eq ""; print U $uinfo{$url},"\t",$url,"\t",$uchanged{$url},"\n"; } close(U); } sub load_report { my ($repname)=@_; open(R,$repname); my $rdatetime=<R>; while (<R>) { chomp; my $rstr=$_; if ($rstr=~/^\"(.*)\",\"(.*)\",\"(.*)\",\"(.*)\",\"(.*)\"$/) { my $urlname=$1;my $url=$2;my $urlchg=$3; my $fpname=$4; my $fpchgname=$5; next if $uchanged{$url} eq $urlchg; $uinfo{$url}=$urlname; $uchanged{$url}=$urlchg; my $save_dir=$ARC_DIR.$urlname; if (!(-e $save_dir)) { mkdir($save_dir); } $fpname=~/^file:\/\/(.+)$/;$fpname=$1; open(F,$fpname);my @newpage=<F>;close(F); my $foutname=$save_dir."/".$urlchg.".html"; open(P,">$foutname");print P @newpage;close(P); $fpchgname=~/^file:\/\/(.+)$/;$fpchgname=$1; open(F,$fpchgname);my @newchgpage=<F>;close(F); my $foutchgname=$save_dir."/".$urlchg."chg.html"; open(P,">$foutchgname");print P @newchgpage;close(P); } } close ®; } и комментарии к нему >my $ARC_DIR='d:/wsw/arc/'; имя директории, где хранится архив >my $urlfile=$ARC_DIR."url.info"; имя файла, где хранится соответствие между именами закладок и их URL >my %uinfo=(); my %uchanged=(); инициализация хэш-массивов >if ($ARGV[0] ne "") { > my $fname=$ARGV[0]; имя файла с отчетом WSW передается первым параметром командной строки >&load_urls($urlfile); вызов процедуры загрузки конфиг. файла >&load_report($fname); анализ файла с отчетом и добавление новых версий страниц в архив >&save_urls($urlfile); сохранение новой версии конфиг. файла >} >exit(0); конец программы >sub load_urls { > my ($uname)=@_; имя конфиг. файла передается параметром процедуре > open(U,$uname); открываем файл > while (<U>) { в цикле читаем все строки > chomp; удаляем символ переноса строки > my @ulist=split(/\t/); разбиваем строку на части с помощью разделителя (символа табуляции - \t) формат строки -название закладки -URL -дата-время последнего изменения > next if $ulist[0] eq "" || $ulist[1] eq ""; проверка на корректность данных в строке > $uinfo{$ulist[1]}=$ulist[0]; сохраняем информацию в хэш-массивах. uinfo - хранит соответствие между URL и именем закладки > $uchanged{$ulist[1]}=$ulist[2]; uchanged - хранит соответствие между URL и датой-временем последнего обновления закладки > } > close(U); закрываем файл и выходим из процедуры >} >sub save_urls { > my ($uname)=@_; имя конфиг. файла передается параметром процедуре > open(U,">$uname"); открываем файл для записи (старое содержимое уничтожается) > for my $url (keys %uinfo) { > next if $url eq ""; > print U $uinfo{$url},"\t",$url,"\t",$uchanged{$url},"\n"; сохраняем в цикле информациб о каждой закладке в отдельной строке конфиг. файла > } > close(U); закрываем файл и выходим из процедуры >} >sub load_report { > my ($repname)=@_; имя файла с отчетом передается параметром процедуре > open(R,$repname); открываем файл > my $rdatetime=<R>; читаем первую строку - там дат-время создания отчета (пока не нужно - может быть пригодится в будущем) > while (<R>) { в цикле читаем все строки отчета. каждая строка содержит информацию об отдельной закладке > chomp; > my $rstr=$_; сохраняем строку в переменной $rstr > if ($rstr=~/^\"(.*)\",\"(.*)\",\"(.*)\",\"(.*)\",\"(.*)\"$/) { выделяем с помощью регулярного выражения отдельные поля строки (сохраняются как переменные $1..$5) > my $urlname=$1;my $url=$2;my $urlchg=$3; my $fpname=$4; my $fpchgname=$5; сохраняем поля строки отчета в рабочих переменных > next if $uchanged{$url} eq $urlchg; если закладка не обновлялась (время последнего изменения из конфиг. файла совпадает со временем обновления из отчета) больше ничего не делаем и переходим на обработку следующей строки отчета > $uinfo{$url}=$urlname; $uchanged{$url}=$urlchg; сохраняем информацию о закладке в хэш-массивах > my $save_dir=$ARC_DIR.$urlname; формируем имя поддиректории, куда будут сохраняться веб-страницы > if (!(-e $save_dir)) { > mkdir($save_dir); если ее нет, создаем ее > } > $fpname=~/^file:\/\/(.+)$/;$fpname=$1; получаем с помощью регулярного выражения имя файла (WSW указывает имена в формате URL с префиксом file://) > open(F,$fpname);my @newpage=<F>;close(F); читаем содержимое страницы в список @newpage > my $foutname=$save_dir."/".$urlchg.".html"; формируем имя файла в архиве, куда будет сохранено содержимое веб-страницы > open(P,">$foutname");print P @newpage;close(P); сохраняем содержимое веб-страницы в этот файл > $fpchgname=~/^file:\/\/(.+)$/;$fpchgname=$1; получаем с помощью регулярного выражения имя файла для страницы с показом изменений(WSW указывает имена в формате URL с префиксом file://) > open(F,$fpchgname);my @newchgpage=<F>;close(F); читаем содержимое страницы в список @newchgpage > my $foutchgname=$save_dir."/".$urlchg."chg.html"; формируем имя файла в архиве, куда будет сохранено содержимое веб-страницы > open(P,">$foutchgname");print P @newchgpage;close(P); сохраняем содержимое веб-страницы в этот файл > } > } > close®; >} wsw.zip Ссылка на комментарий Поделиться на другие сайты More sharing options...
CI-KP Опубликовано 7 мая, 2008 Поделиться Опубликовано 7 мая, 2008 М-да... Сначала я хотел просто констатировать свою неспособность использовать прочитанное. А потом подумал, что, возможно, со скриншотами и будет понятнее. Можно попросить, уважаемый Vinni, сделать скриншоты и прислать их мне по электронной почте? Я на своем сайте из их и ваших двух постов сделаю страницу, гда оформлю этот текст с картинками в виде понятной для неопытных пользователей инструкции. Потом уточню непонятные вопросы и после этого возможно, будет понятнее, что с этим делать . Куда, скажем так, конкретно втыкать написанное. Такой вариант приемлем? Конечно, может быть, это просто я такой непонятливый, но боюсь, что многие, как и я, в скриптах вообще ничего не понимают. Ссылка на комментарий Поделиться на другие сайты More sharing options...
Vinni Опубликовано 7 мая, 2008 Автор Поделиться Опубликовано 7 мая, 2008 М-да... Сначала я хотел просто констатировать свою неспособность использовать прочитанное. А потом подумал, что, возможно, со скриншотами и будет понятнее. Можно попросить, уважаемый Vinni, сделать скриншоты и прислать их мне по электронной почте? Я на своем сайте из их и ваших двух постов сделаю страницу, гда оформлю этот текст с картинками в виде понятной для неопытных пользователей инструкции. Потом уточню непонятные вопросы и после этого возможно, будет понятнее, что с этим делать . Куда, скажем так, конкретно втыкать написанное. Такой вариант приемлем? Конечно, может быть, это просто я такой непонятливый, но боюсь, что многие, как и я, в скриптах вообще ничего не понимают. Господи, а как же питона прикармливать собирались все? :smile2: Скриншоты сделаю завтра, а пока попробую в армейском :smile5: стиле, а вы говорите, на каком шаге пошли проблемы. 1. Скачать и установить Perl c http://www.activestate.com/Products/activeperl/ 2. Скачать и установить WebSiteWatcher 2. Скачать архив из предыдущего поста и развернуть его содержимое в директорию d:\wsw 3. Запустить WSW и создать в нем папку(folder) с именем WebSite-Watcher (если ее нет) 4. Добавить в папку закладку с именем Yandex и URL http://www.yandex.ru 5. Добавить в папку закладку с именем RBC и URL http://www.rbc.ru 6. Завершить WSW 7. Запустить файл d:\wsw\wsw.bat 8. Посмотреть содержимое поддиректорий в d:\wsw\arc - там появятся новые файлы с веб-страницами Повторять шаги 7 и 8 несколько раз с интервалом не менее минуты. Про автоматизацию запуска wsw.bat рассказать? :smile19: Ссылка на комментарий Поделиться на другие сайты More sharing options...
Игорь Нежданов Опубликовано 8 мая, 2008 Поделиться Опубликовано 8 мая, 2008 Господи, а как же питона прикармливать собирались все? :smile2: Скриншоты сделаю завтра, а пока попробую в армейском :smile5: стиле, а вы говорите, на каком шаге пошли проблемы. ..... Про автоматизацию запуска wsw.bat рассказать? :smile19: :smile12: Он еще и издевается.... - не прикрмился Питон. Вообще дикие звери плохо поддаются одомашниванию :smile6: Особенно когда опыта нет. Ссылка на комментарий Поделиться на другие сайты More sharing options...
Рекомендуемые сообщения
Заархивировано
Эта тема находится в архиве и закрыта для дальнейших ответов.