Время прочтения: 6 мин.

Autoit — это BASIC’овидный язык программирования, на котором можно создавать боты (имитация действия пользователя) для автоматизации таких работ, т.е управлять другими приложениями (запускать их, нажимать в них кнопки, менюшки…). 

AutoIt умеет:

— Симулировать нажатия комбинаций клавиатуры (поддерживается основная масса раскладок клавиатуры);

— Симулировать перемещения указателя мыши и нажатия на ее кнопки;

— Перемещать, менять размер и управлять параметрами отображения окон;

— Непосредственно взаимодействовать с «управляющими элементами» (controls) окна (получать/менять надпись, перемещать, отключать, и т.п. действия);

— Работать с буфером обмена для пересылки его текстового содержания;

— Читать, менять и создавать ключи и значения реестра.

Новая версия AutoIt3 распознает общепринятые конструкции и имеет стандартный синтаксис, напоминающий синтаксис VBScript и BASIC, и поддерживает обработку сложных выражений, выполнение собственных функций, проводит циклические и условные вычисления.

И самым знаменательным является тот факт, что AutoIt остается бесплатным.

Какой софт нужен для работы с AutoIt ?

Нужный софт можно скачать с оффициального сайта AutoIt. Мне поступило задание выгрузить полный пакет документов по заданному пулу клиентов из автоматизированной системы (АС). Данная выгрузка была очень трудозатратной для пользователя, т.к. приходилось обрабатывать каждого клиента, т.е. проделывать множество раз одни и те же операции. Для написания и редактирования скриптов (расширение au3) я использовал специальный редактор SciTE, который входит в пакет Autoit. В Редакторе удобно проверять правильность синтаксиса и кодировку au3-файла, осуществлять отладку по шагам, компиляцию (Ctrl+F5 — проверка синтаксиса, F4 — переход к следующей ошибке, Ctrl+F7 – компиляция и др..). Так же в состав пакета входят уже готовые функции для работы с определенными объектами (Excel, Word, Массивы, файлы, окна и др.) Подключить необходимые функции можно с помощью #include …, например, какие я использовал в своем скрипте:

  #include <Excel.au3>
  #include <MsgBoxConstants.au3>
  #include <File.au3>
  #include <Array.au3>
  #include <WinAPISys.au3>
  #include <WinAPIEx.au3>

Большой выбор функций конечно же можно найти в интернете.

Т.к. работа по выгрузке документов могла выполняться на мониторах с разным типом разрешения, то необходимо было занести данные по разрешениям мониторов, которые используются в организации, в специальный настроечный файл. Для этого я использовал INI-файл. Autoit работет с данным типом файлов и для этих целей есть пять функций:

IniDelete(«filename»,»section»[,»key»]) — удалить секцию или значение из ini-файла.
            IniRead(«filename»,»section»,»key»,»default») — считать значение из ini-файла.
            IniReadSection(«filename»,»section») — считать все пары секция/значение из ini-файла.
            IniReadSectionNames(«filename») — считать имена всех секций из ini-файла.
            IniWrite(«filename»,»section»,»key»,»value») — записать значение в ini-файл.

;---------------------------------------------------
;----- координаты по разрешениям экрана-------------
;---------------------------------------------------
[1920x1080]
x1=40
y1=40
x2_1=770
y2_1=561
x2_2=770
y2_2=561
[1600x900]
x1=46
y1=36
x2_1=609
y2_1=472
x2_2=609
y2_2=472
[1680x1050
x1=44
y1=37
x2_1=649
y2_1=546
x2_2=649
y2_2=546

В начале работы определяется разрешение монитора:

Global $_Widtw=@DesktopWidth, $_Height=@DesktopHeight, 

И в зависимости от разрешения считываются координаты из настроечного INI-файла.

$_x1=IniRead($f_ini,$_ekran, "x1", "Значение по умолчанию")
$_y1=IniRead($f_ini,$_ekran, "y1", "Значение по умолчанию")

В настроечный файл записываются данные, необходимые в дальнейшей работе, например, адрес сервера, логин (без пароля), пути выгрузки, которые вы вводите в начале работы, далее чтение и запросы на ввод/изменение данных:

$iServer=IniRead($f_ini,"Server", "Key", "Значение по умолчанию");
$iLogin=IniRead($f_ini,"Login", "Key", "Значение по умолчанию")
$iPassword="" ;;IniRead($f_ini,"Password", "Key", "Значение по умолчанию")
$iURL=IniRead($f_ini,"Path_out", "Key", @ScriptDir)
$ipath_inn = IniRead($f_ini,"xls_inn", "Key", "Значение по умолчанию")
$_tipDOC = IniRead($f_ini,"TipDoc", "Key", "")
;--
;if $iServer="Значение по умолчанию" then
  $iServer=InputBox("Запрос", "Введите httP сервер АС:", $iServer)                         ;'http://10.67.251.16/eks/api'
;EndIf
  if $iServer="" or $iServer="Значение по умолчанию"   Then
    MsgBox(4096, "Внимание","Вы не ввели Сервер! Выходим.",30)
    Exit
  EndIf
$Login=InputBox("Запрос", "Введите ЛОГИН пользователя АС:", StringUpper(StringRegExpReplace($ilogin," ",""))) ;

if $Login="" Then
   MsgBox(4096, "Внимание","Вы не ввели Логин! Выходим.",30)
   Exit
  EndIf
$Login=StringUpper(StringRegExpReplace($Login," ",""))

$URL = FileSelectFolder("Выберите\Создайте Папку для выгрузки документов KSB ):", '', 3, $iURL)
$URL = $URL & "\"
 if $URL = "\" Then
  MsgBox(4096, "Внимание","Вы не выбрали Папку для выгрузки документов KSB ! Выходим.",30)
  Exit
 EndIf

$_tipDOC=InputBox("Запрос", "Введите ТИП документа (часть наименования) 
которые вы хотите ввыгрузить из AC ( <*> - все документы) :", 
StringUpper($_tipDOC))
  if StringRegExpReplace($_tipDOC," ","")="" Then
   MsgBox(4096, "Внимание","Вы не ввели ТИП документа ! Выходим.",30)
   Exit
  EndIf

И отражение данных в INI-файле:

;---------------------------------------------------------------------------
;- Сервер, логин, пути Выгрузки и расположения XLS файла с Клиентами
;---------------------------------------------------------------------------
[Server]                        ; сервер URL
key=http://99.99.999.99/akva/api
[Login] 			; Логин текущего пользователя AС
key=SIDOROV
[path_out]			; путь для выгружаемых документов
key=C:\Users\SIDOROV\Documents\
[xls_inn]			; где расположен файл с данными по клиентам
key=C:\Users\SIDOROV\Documents\KLIENT.xlsx

 Данные по клиентам считываем из .XLSX файла:

Local $oExcel=_Excel_Open(False)
   If @error Then Exit MsgBox(4096, "Ошибка", "Excel не открылся!")
Local $WorkBook=_Excel_BookOpen($oExcel,$path_inn,False,False)
   If @error Then Exit MsgBox(4096, "Ошибка", "Книга не открыта. 
   Проверь путь. Проверьте наличие файла.",30)
$aRange = _Excel_RangeRead($WorkBook)
 ;DirRemove($URL,1)
_Excel_BookClose($WorkBook,False) ; закрытие
;_Excel_Close($oExcel)

Получив данные для выгрузки, начинаем работать с АС, т.е. организуем цикл по количеству клиентов и непосредственную выгрузку документов. В каждой АС есть определенные пункты меню, к которым можно получим доступ по определенным сочетаниям клавиш, например: Alt+F1, Alt+1, Ctrl+t, Ctrl+n… либо за сочетанием клавиш закреплены определенные действия в АС: проваливание в список, вывод на экран информации, формирование отчетов.

Далее организуем цикл по количеству клиентов, считанных из входного XLSX-файла:

For $Shet=1 to UBound($aRange) -1

  $_inn_ini=IniRead($load_ini,$aRange[$Shet], "Key", "no")

 if $_inn_ini<>'YES' And $aRange[$Shet]<> "" then 
 IniWrite($load_ini,$aRange[$Shet], "Key", "no")
 WinActivate($title)
Send("{ALT}")    ; !!!!!!!!!! ALT !!!!!!!!!!!!!!
	   Sleep(500)
далее множественные операторы обработки …..
……………………………..
Next; конец цикла

Ниже представлен блок на обработку установки фильтра по типу документов:

Send("!3")
$Spisok_PD = WinWait("Полный список","",20)
 If WinActive($Spisok_PD) Then
 ;-----------------------------
Sleep(300)
Send("{PGUP}")
Send("{ENTER}")
$tipD = WinWait('Тип документа',"",30)
Sleep(300)
If WinActivate($tipD) Then
$_ftd=""
if $_tipDOC="*" Then
$_ftd=""
Else
$_ftd="%"&$_tipDOC
EndIf
ControlSetText('Тип документа',"",'[CLASS:Edit; INSTANCE:1]', $_ftd )
ControlClick("Тип документа","",'[CLASS:Button; INSTANCE:2]')
EndIf

Для определения координат окон, кнопок на экране, или их цвета (если это необходимо) используется приложение Autoit  Window Info , которое входит в состав пакета.

 Статистика выгрузки документов заносится в отдельный INI-фал, по каждому клиенту и типу документов, что выручает нас при аварийном завершении (например, зависание АС). Процесс выгрузки начинается с того клиента, на котором произошел сбой.

;---------- запись в INI файл инфы по дог и кол.договоров
 IniWrite($load_ini,$iSection, "INN", $aRange[$Shet])  ;$aRange[$Shet]
 IniWrite($load_ini,$iSection, "Dogovor", $_Dogr)  ;$aRange[$Shet]
IniWrite($load_ini,$iSection, "TipDoc",$_tipDOC)
IniWrite($load_ini,$iSection, "Key1", $Num2)  ;$aRange[$Shet]
IniWrite($load_ini,$iSection, "Key2", $posa-1) ;$aRange[$Shet]
$_DtTm=@MDAY&'.'&@MON&'.'&@YEAR&'-'&@HOUR&':'&@MIN&':'&@SEC
IniWrite($load_ini,$iSection, "DateTime", $_DtTm)  ; запись значения в секцию счета

Если по какой-то причине не прошла выгрузка документа, например, очень долгий ответ от АС или зависание АС, то в INI-файл пишется информация о невыгруженном файле и времени записи в INI-файл :

IniWrite($load_ini,$iSection, "НЕ ВЫГРУЖЕН (" & $_DtTm &") ", ""&$KodDoc&"\"&$_File)  ;

Также интересен блок по обработке (т.е. выгрузке) файлов большого объема (более ~100 МБ), т.к. сохранение файлов такого объема из АС может занимать относительно значительное время. В данном случае работает цикл по считываю объема сохраняемого файла и сравнивается с реальным размером файла:

$_rasm=0
if $_Doubl=0 Then
$_puf=$_Dir&"\"&$_File
;MsgBox(4096,"путь-файл->",$_puf)
$loopwait=0
$loopmax=99
$goot=False
$_razm_new=0
$_razm_old=0
While $goot=False and $loopwait < $loopmax
Sleep(1500)
$_razm_new=FileGetSize($_puf)
MsgBox(4096,"Ждем...","Идет сохранение файла -> "&$_File&" ... "&String($_razm_new),0.5) ; размер в КБ
if $_razm_new = $_razm_old and $_razm_new<>0 and $_razm_old<>0 Then
$goot=True
$loopwait=$loopmax
EndIF
$loopwait=$loopwait+1
$_razm_old=$_razm_new
WEnd
EndIf

Я привел вашему вниманию основные блоки по обработке задачи, которая стояла перед скриптом Autoit.

В завершении, мне удалось автоматизировать процесс выгрузки требуемого пакета документов из АС с использованием AutoIt, что помогло разгрузить пользователя от однообразной и рутинной работы.

Программное обеспечение можно использовать для выполнения аналогичных повторяющихся задач. Спасибо за внимание.