Как и в предыдущем примере загрузка справочника превратилась в рутину и возникла необходимость в разработке простого скрипта для обновления этого справочника без участия человека. При этом скрипт будет извещать человека о проделанной работе через SMS коротким сообщением.
Для реализации программы необходимо продумать алгоритм загрузок. Справочник появляется на сайте 3 раза в месяц и отображается там как файл на первое, десятое и двадцатое число месяца.
Распишу все действия для создание скрипта по порядку:
- После запуска он начинает проверить версию текущего справочника (Будет использована библиотека _sql.au3).
- Далее проверяем версию на сайте(IE.au3,StringRegExp и StringRegExpReplace).
- Загрузка будет происходить только в том случае если версии отличаются.
- Успешно загруженный файл распаковывается.
- Для загрузки новых справочников можно использовать как уже готовую утилиту для загрузки справочников в базу(«RLoader»), так и попробовать напрямую загрузить силами скрипта. Какой способ выбрать необходимо решить позже.
- При успешном завершении скрипта отправляется смс с результатами. Если скрипт получил ошибку, смс также отправляется администратору и записывается в лог.
Скрипт можно добавить в расписание «Планировщика заданий» для запуска ежедневно в 11:00.
0. Объявление переменных
1 2 3 4 5 6 7 |
$Vita_Server = '127.0.0.1' $Vita_DB = 'DB' $Vita_Login = 'login' $Vita_Pass = 'pass' $sUrl = 'http://127.0.0.1' $sPathRloader = 'C:\RLoader\' $sPathFedRloader = 'C:\RLoader\Федеральный регистр льготников\' |
1.Проверка текущего справочника
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 |
#include <_sql.au3> #include <array.au3> ;----------------------- ; Подключаемся к Серверу ;----------------------- $oADODB = _SQL_Startup() If $oADODB = $SQL_ERROR then Msgbox(0 + 16 +262144,"Error",_SQL_GetErrMsg()) If _sql_Connect(-1,$Vita_Server,$Vita_DB,$Vita_Login,$Vita_Pass) = $SQL_ERROR then Msgbox(0 + 16 +262144,"Error",_SQL_GetErrMsg()) _SQL_Close() Exit EndIf ;--------------------------- ;Ищем справочник федеральный ;--------------------------- $sMSSqlStatement = "SELECT TOP 1 [FederalRegisterLoadID]"& _ " ,[Users]"& _ ",[Version]"& _ ",[UpdateDate]"& _ " FROM [AKUZDB].[AKUZ].[T_FEDERAL_REGISTER_LOAD]"& _ " ORDER BY [Version] DESC;" Local $aData,$iRows,$iColumns;Variables to store the array data in to and the row count and the column count $iRval = _SQL_GetTable2D(-1,$sMSSqlStatement,$aData,$iRows,$iColumns) If $iRval = $SQL_OK Then ;_ArrayDisplay($aData) ConsoleWrite ('ФР |' & ' ' &$aData[1][2] & '|' & ' ' &_DateRemake($aData[1][3],1)) EndIf ;-----------------------; ; Откючаемся от сервера ; ;-----------------------; _SQL_Close() |
2. Функция проверки свежего справочника.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 |
#include <IE.au3> ;------------------------------------; ; Парсим данные о свежем справочнике ; ;------------------------------------; $aFedBenefitParse = _ParsingBenefit(sUrl & '/FED_RG/_pr_fedr.htm') $iDateFormat Определяет в каком формате возвращать дату ; 0 - Возвращает Массив с датами (По Умолчанию) ; 1 - Возвращает Дату в Формате "DD.MM.YYYY ; 2 - Возвращает Дату в Формате "YYYY/MM/DD Func _DateRemake($iDate, $iDateFormat = 0) If Not $iDate Then Return 0 $NewDotDate = StringRegExpReplace($iDate, "^(\d{4})(\d{2})(\d{2}).*", "\3.\2.\1") $NewSlashDate = StringRegExpReplace($iDate, "^(\d{4})(\d{2})(\d{2}).*", "\1/\2/\3") Dim $aDate[3] = [2, $NewDotDate, $NewSlashDate] If $iDateFormat = 0 Then Return $aDate If $iDateFormat = 1 Then Return $aDate[1] If $iDateFormat = 2 Then Return $aDate[2] EndFunc ;==>_DateRemake ; _ParsingBenefit - Парсинг сайта для поиска последней версии справочника ; Возвращает Массив с датами ; $aArray[1] - Дата самого нового справочника ; $aArray[2] - Версия справочника Func _ParsingBenefit($sUrl) Local $aArray = [] $oIE=_IECreate($sUrl,0,0) $sHTML = _IEBodyReadHTML ($oIE) ; Читает код между тегов <body> и </body> ;Ищем дату последнего актуального справочника $sSearch = StringRegExp($sHTML, '(?si)<P class=MsoNormal style="TEXT-ALIGN: center; MARGIN-TOP: 3pt" align=center><B style="mso-bidi-font-weight: normal">(.*?)</P>', 3) ;Дата самого нового справочника $sOutput1 = StringRegExpReplace($sSearch[1], "[A-Za-zа-яё[:punct:]]", "") ;Полученный результат форматируем в дату и добавляем в массив $sInput = StringStripWS($sOutput1,8) $sOutput = StringRegExpReplace($sInput, "^(\d{2})(\d{2})(\d{4}).*", "\1.\2.\3") _ArrayAdd($aArray, $sOutput) ;Версия справочника $sOutput2 = StringRegExpReplace($sSearch[4], "[A-Za-zа-яё[:punct:]]", "") $sInput = StringStripWS($sOutput2,8) $sOutput = StringRegExpReplace($sInput, "^(\d{2})(\d{2})(\d{4}).*", "\1.\2.\3") _ArrayAdd($aArray, $sOutput) _IEQuit ($oIE) Return $aArray EndFunc ;==>_ParsingBenefit |
3. Загрузка
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
;--------------------------------; ; Сравниваем версии и загружаем ; ;--------------------------------; If $aFedBenefitSQL[1][2] <> $aFedBenefitParse[2] Then MsgBox(0+64,"Уведомление","Начинаю скачивать обновление",2) Local $sFileZip = $sPathFedRloader & "filename.zip" _LoadBenefit(sUrl & "/FED_RG/_pr_fedr.htm",$sFileZip) Else MsgBox(0+64,"Уведомление","Новых справочников нет",2) Exit EndIf ; _LoadBenefit - Загрузка справочника Func _LoadBenefit($sUrl, $sNameFile) Local $oIE = _IECreate($sUrl,0,0,1,1) $oDivs = _IETagNameGetCollection($oIE, 'a') $i = 0 For $oDiv In $oDivs $i += 1 If $i == 2 Then ConsoleWrite($oDiv.href&@LF) Local $sHref = $oDiv.href ExitLoop EndIf Next _IEQuit ($oIE) InetGet($sHref, $sNameFile) EndFunc ;==>_LoadLink |
4. Распаковка
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
;-----------------------------; ; Распаковка arj и zip архивы ; ;-----------------------------; MsgBox(0+64,"Уведомление","Начинаю распаковывать скачаный файл",2) ConsoleWrite($sPathFedRloader&@LF) _Unpacking($sPathFedRloader&"*.zip",$sPathFedRloader) Sleep(2000) MsgBox(0+64,"Уведомление","Начинаю распаковывать еще один файл",2) _Unpacking($sPathFedRloader& "*.ZIP",$sPathFedRloader) Sleep(5000) ; _Unpacking - Распаковка ;$sFilePacth - файл для распаковки ;$sDirDestPacth - куда распаковывать Func _Unpacking($sFilePacth,$sDirDestPacth) Run('C:\Program Files (x86)\WinRAR\WinRAR.exe e "' & $sFilePacth & '" -aoa -y"' & $sDirDestPacth & '"',$sDirDestPacth, @SW_HIDE) EndFunc;==>_Unpacking |
5. Запуск утилиты загрузки в БД
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
;------------------------------------; ; Загружаем справочник через RLoader ; ;------------------------------------; Run($sPathRloader&'\Rloader.exe') Do sleep(2000) Until WinExists('Загрузчик регистров') WinActivate('Загрузчик регистров') WinWaitActive('Загрузчик регистров') WinMove("Загрузчик регистров","",0,0,650,500,20) Send ("{DOWN}") Send ("{NUMPADADD}") Send ("{DOWN}") Sleep(1000) Send ("{TAB 4}") Send ("{ENTER}") Sleep(2000) While WinClose("Загрузчик регистров") Sleep(1000) WinExists("Загрузчик регистров","Старт") WEnd |
6. Отправка отчета
1 2 3 4 5 6 7 8 9 10 |
;-----------------; ; Отправка отчета ; ;-----------------; _SMS($sSmsKey,"У тебя новый справочник. Фед.регистр №"&$aFedBenefitParse[2]) ; _SMS - Отправка SMS Func _SMS($sKey,$sText) $oIE = _IECreate($sKey&$sText, 1, 0, 0) _IEQuit ($oIE) EndFunc |