top
logo


Секреты автоматизации. Несколько примеров того, как облегчить себе жизнь PDF Печать E-mail
Автор: adm   
24.01.14 15:11

Секреты автоматизации. Несколько примеров того, как облегчить себе жизнь

Степан «Step» Ильин (twitter.com/stepah)


Попробуй посчитать, сколько времени у тебя уходит впустую на выполнение одних и тех же действий. Непростая задача? Зато автоматизировать часть рутинной работы можно запросто. И бьюсь об заклад, такая рутина есть у каждого.

Чтобы не быть голословными, разберем несколько конкретных задач, отыскав для их решения подходящие утилиты. К счастью, под виндой с помощью всего двух-трех утилит можно автоматизировать абсолютно все и легко эмулировать действия пользователя. Итак, первая задачка.

nnCron

Задача: Отслеживать активность работы пользователя и в периоды простоя выполнять ресурсоемкие задачи.

Решение

Нет ничего лучше, чем загрузить компьютер выполнением какой-то ресурсоемкой операции в тот момент, когда это нас никак не побеспокоит, а именно, когда за компьютером никого нет. Такая возможность, кстати, есть у некоторых прогрессивных продуктов: тот же Norton Antivirus имеет функцию Idle Scan и очень четко выполняет полное или частичное сканирование системы в момент отсутствия пользователя. Или вот другой полезный пример - чтобы торрент-клиент не мешал серфингу, предоставлять ему максимальную ширину канала, когда за компьютером никто не работает. Попробуем реализовать это на примере utorrent (www.utorrent.com). Тут надо сказать, что в самом клиенте не так давно появилась такая возможность в виде опции TCP Rate Control, позволяющей подстраивать скорость TCP-соединений клиента так, чтобы его работа не мешала другим приложениям. Мало этого, когда-то давно я устанавливал специальный cFos-драйвер, с помощью которого можно было установить низкий приоритет для торрента, а высокий - для браузера. Однако ценность нашего примера именно в том, чтобы обработать событие, когда компьютер находится в idle-режиме (т.е. ничего не делает), и от этого уже плясать.

Проще всего отслеживать появление в памяти процесса скринсейвера и в этот момент запускать utorrent и, наоборот, когда его процесс выгружается из памяти, закрывать utorrent. В нашем давнишнем материале про автоматизацию мы уже рассказывали тебе о замечательной программе nnCron (www.nncron.ru). Этот уникальный планировщик задач не только умеет запускать процессы по расписанию, но и способен отслеживать файлы, флаги, окна, процессы, движения мыши, время простоя компьютера, клавиатурные шорткаты, выход в онлайн/оффлайн, появление диска в драйве, наличие хоста в сети (пинг), изменение удаленного ресурса по http-протоколу, количество свободного места на диске, загруженность оперативной памяти и многое другое. Вводную часть по использованию программы мы опустим (но обязательно положим на диск PDF статьи «Пусть он все делает сам!» со всеми подробностями) и сразу приступим к делу.

Главный наш помощник - функция WatchProc, которая отслеживает состояние процесса в памяти. Как только в памяти появится scrnsave.scr (наш скринсейвер), с помощью START-APP мы запустим приложение:

#( Torrent_start
AsLoggedUser
LoadProfile
User: «username» SecPassword: «passhash» Domain: «DOMAIN» LogonInteractive
WatchProc: «scrnsave.scr»
Rule: PROC-EXIST: «uTorrent.exe» NOT
Action:
StartIn: «C:\Program Files\uTorrent»
ShowNormal NormalPriority
START-APP: C:\Program Files\uTorrent\uTorrent.exe
)#

И напротив, когда процесс выгрузится из памяти, то закрываем и окно utorrent'а:

#( Torrent_stop
AsLoggedUser
WatchProcStop: «scrnsave.scr»
Action:
WIN-TERMINATE: "uTorrent.exe"
)#

Надо учитывать, что некоторые программы блокируют запуск скринсейвера (например, медиа-проигрыватели), поэтому для чистоты эксперимента необходимо мониторить и эти процессы. В качестве альтернативы можно отслеживать именно простой компьютера: в nnCron для этого есть событие IDLE. При этом процесс utorrent'а можно не закрывать, а изменять для него параметры максимально полосы пропускания. Для последнего понадобится включить в настройках клиента веб-интерфейс и, поэкспериментировав с нужными параметрами, понять, как составить нужный HTTP-запрос для управления скоростью загрузки.

iMacro

Задача: Автоматизировать любые действия в браузере, которые обычно приходится выполнять вручную.

Решение

У каждого есть набор онлайн-сервисов или просто информационных ресурсов, которые он посещает. Создание закладок или объединение их в группы для одновременного открытия - самый простой способ облегчить себе жизнь. Увы, он не решает проблемы с необходимостью ручной авторизацией, а также вводом некоторых нужных параметров (скажем, для локального поиска на сайте). К тому же, далеко не любую страницу можно добавить в закладки из-за особенностей сайта.

В итоге, мы раз за разом выполняем одни и те же действия, чтобы добраться до нужной части сайта или одним и тем же способом воспользоваться онлайн-сервисом. Приведу пример из жизни. Мне достаточно часто приходится ездить на поездах в двух-трех направлениях, и, чтобы сэкономить время, я покупаю билеты онлайн на сайте rzd.ru (тут хочется прокричать трижды «Ура» по поводу того, что у нас вообще есть такая возможность). Но чтобы перейти к покупке билета, необходимо сначала зайти на недавно обновленный сайт РЖД, выбрать пункт «Купить билет», после чего попасть на старый сайт компании, откуда в свою очередь нажать на «Вход для зарегистрированных пользователей», ввести на отдельной странице логин и пароль (сессия не сохраняется в целях безопасности). После авторизации опять подтвердить, что хочешь купить билет, выбрав в меню пункт «Покупка билета», проскроллить страницу с регламентом работы онлайн-сервиса, подтвердить согласие установкой галочки - и только затем попасть на страницу для ввода станции отправления и назначения, количества пассажиров и даты поездки. Причем все, кроме даты, у меня, как правило, неизменно, поэтому и эти данные я ввожу на автомате. Клик-клик-клик - каждый раз одно и то же. Ждать, пока РЖД наймет специалистов по юзебилити, можно до пенсии, поэтому все описанные действия я поручил специальному плагину для Firefox/IE - iMacros (www.iopus.com/imacros).

Как заставить выполнять его нужные действия? Просто показать, что нужно делать. В браузере после установки появится специальная панель со списком существующих сценариев, а также тремя вкладками, с помощью которых осуществляется создание и редактирование макросов. Все, что потребовалось для решения моей задачи, перейти на вкладку «Запись», выбрать пункт «Записать», проделать все действия, которые я ранее описал, нажать на «Стоп» и далее добавить свой макрос в систему кнопкой «Сохранение». При этом сам плагин записывает каждое действие на своем псевдоязыке:

VERSION BUILD=6251204 RECORDER=FX
TAB T=1
URL GOTO=http://rzd.ru/
TAG POS=1 TYPE=A ATTR=TXT:Купить<SP>билет
TAG POS=1 TYPE=A ATTR=TXT:Вход<SP>для<SP>зарегистрированных<SP>пользователей<SP>»
TAG POS=1 TYPE=INPUT:SUBMIT FORM=NAME:LoginForm

Это лишь первые несколько строчек получившегося скрипта. Теперь я просто выбираю макрос «Билет Москва-Питер» и сразу перехожу к выбору даты и оплате :). Какие возможности это предоставляет? Огромные! Меня недавно спросили, как автоматически собирать Webmoney-бонусы - небольшие поощрения в WMR/WMZ, которыми различные ресурсы стимулируют пользователей для регистрации и как можно более частого посещения (как правило, это онлайн-казино).

Для получения бонуса необходимо зарегистрироваться и авторизироваться, после чего найти нужный раздел и попросить бонус, кликнув на ссылку - варианты разнятся, но макрос реально сделать для любого из них. Если WM-поощрения выдаются каждый день, то можно без проблем собирать их ежедневно, лишь однажды написав нужные сценарии. Тут-то и начинаешь ощущать всю прелесть iMacros: скажем, для сайта на Flash'е уже не получится написать в скрипте «на этой странице перейти по такому-то линку». AutoIt ничего не знает о структуре интерфейса на Flash, но зато умеет распознавать конкретные участки сайта по их изображению с помощью плагина Image Recognition. А, значит, все, что ты можешь сделать вручную через Firefox, можно автоматизировать через макросы с помощью этого замечательного плагина.

Еще большей гибкости можно добиться, объединив возможности iMacros и какого-нибудь языка программирования, который будет управлять логикой выполнения макроса. К счастью, программные интерфейсы iMacros могут быть вызваны из многих языков программирования. Когда передо мной стояла задача оперативно написать накрутчик для непутевого голосования, то я написал для iMacros сценарий для быстрой смены прокси «SwitchProxy» и без проблем вызывал его из кода на Python:

import win32com.client
def Hello():
import win32com.client
w=win32com.client.Dispatch("imacros")
w.iimInit("", 1)
w.iimPlay("SwitchProxy")
if __name__=='__main__':
Hello()

Но как ни приятно упростить себе жизнь в Сети, гораздо полезнее может оказаться автоматизация действий просто в системе. И для этого нужен уже совершенно другой инструмент.

AutoIt

Задача: Эмулировать любую активность пользователя в системе.

Решение

В одном из номеров ][ мы демонстрировали простую схему, как может работать троян, способный уводить деньги с электронного кошелька Webmoney (хочу напомнить, что использование подобного софта - самый простой способ угодить в лапы компетентных органов). Фокус заключался в использовании API-функций, с помощью которых эмулировались последовательность кликов и нажатий пользователя. В результате, после запуска кипера автоматически открывалось окно для перевода денег, в поле с номером кошелька вводился номер злоумышленника, а после распознавания капчи нажималась кнопка, одобряющая перевод. В общем, точно так же, как если бы пользователь сам перевел все деньги на чужой счет. Использование C++ вкупе с API-функциями - это, безусловно, мощнейший механизм для подобных дел, однако, для эмуляции работы пользователя есть решение гораздо проще и подчас даже эффективнее. Я говорю об AutoIt (www.autoitscript.com/autoit3) - специальном языке, созданном для простой автоматизации задач под виндой.

В ранних версиях программа преимущественно использовалась для создания макросов, полезных для выполнения часто повторяющихся задач, таких как инсталляция идентичных наборов программ на большое количество компьютеров. Позже AutoIt серьезно преобразилась, предоставив возможность создавать полноценные GUI-интерфейсы, а сами скрипты компилировать в исполняемые EXE-файлы, которые запускаются на любой системе, даже без установленной AutoIt. Для эмуляции работы пользователя особенно важен перехват и эмуляция клавиатурных нажатий и кликов мышки. При этом скрипты обладают всей той мощью, которая нужна для автоматизации. Макросы могут работать с протоколами UDP и TCP, изменять значения реестра, работать с файлами и буфером обмена, а также запускать консольные приложения, имея доступ к стандартным потокам ввода/вывода. Есть и функциональность, частично дублирующая iMacros, позволяя автоматизировать работу в браузерах (IE, Opera, Firefox). Более того, как из обычных языков программирования, можно обращаться к COM-объектам, запускать функции из динамических библиотек (в том числе, API Windows), а также работать с базами данных MySQL и SQLite. Короче, прога превратилась в настоящий язык программирования с упором на автоматизацию различных процессов.

Простой вопрос: что можно автоматизировать через AutoIt? Абсолютно все. Для примера составим скрипт, который будет запускать оснастку Computer Management и через нее создавать локального пользователя. Конечно, то же самое можно (и даже лучше) провернуть средствами PowerShell, но пример важен с точки зрения демонстрации возможностей AutoIt. Для комфортной работы с макросами в комплект AutoIt входит классный редактор кода, в котором реализованы подсветка синтаксиса, автодополнение команд и даже отладчик. Весь ряд действий макроса задается в виде вполне понятных команд, опирающихся на название окон и элементов интерфейса (скрипт для английской Windows XP), плюс эмуляции клавиатурного ввода юзера:

$treeitem = "Computer Management (Local)|System Tools|Local Users and Groups"
$username = "usertocreate"

Run ('cmd /c "compmgmt.msc"', @SystemDir, @SW_HIDE)
WinWaitActive("Computer Management")

ControlTreeView ("Computer Management", "", 12785, "Expand", $treeitem)
$treeitem = $treeitem & "|Users"
ControlTreeView ("Computer Management", "", 12785, "Select", $treeitem)

Send ("{AppsKey}{Down}{Enter}")
ControlSend("New User", "", "Edit1", $username)
ControlClick("New User","", 1170)
ControlClick("New User","", 2)

Sleep(3000)
Send ("{Tab}")

С помощью функции Run() запускается оснастка, WinWainActive() дожидается появления окна, ControlTreeView() используется для навигации по дереву, а Send() эмулирует ввод с клавиатуры. Теперь дополним скрипт проверкой, создался пользователь или нет:

$result = ControlListView ("Computer Management", "", "SysListView321", "FindItem", $username)
WinClose ("Computer Management")

If $result <> -1 Then
MsgBox (0, "Test result", "Success")
Else
MsgBox (0, "Test result", "Failed")
EndIf

После чтения списка локальных пользователей закрываем окно с помощью функции WinClose() и выдаем результат проверки на экран. В целях упрощения написания скриптов для эмуляции активности пользователя в комплекте с программой идет тулза AutoIt v3 Window Info, которая отображает множество полезных данных о выбранном окне. Есть и еще более полезные инструменты. Чтобы не писать макросы вручную, а просто записать свои действия и получить готовый макрос, можно воспользоваться дополнительными утилитами: AutoItMacroGenerator или ScriptWriter. Обе выполняют одни и те же действия и в реальном времени преобразуют все твои клики и набор на клавиатуре в код для AutoIt. Для упрощения разработки графических интерфейсов существует визуальный редактор форм Koda FormDesigner (koda.darkhost.ru) с интерфейсом аналогичным Delphi IDE. Если ты использовал программу Vistumbler (www.vistumbler.net) - первый стамблер под Vista/W7, сканирующий Wi-Fi эфир и отображающий информацию о найденных точках доступа с привязкой по GPS - то знай: она как раз полностью написана на AutoIt и преобразовывает консольный вывод стандартной утилиты винды в графический вид! К числу слабых мест AutoIt можно было бы отнести необходимость изучения нового языка, но и здесь есть выход: функции AutoIt интегрируются в более мощные языки программирования.

AutoHotkey

Задача: Назначить на одну «горячую клавишу» последовательность действий.

Решение

Несмотря на название AutoHotkey, программа представляет собой намного большее, чем просто инструмент работы с «горячими клавишами». Эмулируя ввод с клавиатуры, движения мышкой и опираясь на события Windows, можно с помощью произвольной «горячей клавиши» автоматизировать последовательность из десятка различных действий. Настройка хоткеев осуществляется с помощью текстового конфига, для работы с которым разработчики предлагают работать с помощью текстового редактора SciTE4AutoHotkey (скачай с официального сайта). Идея хорошая: с подсвеченным синтаксисом и автодополнением команд и констант задача упрощается в разы. Общий синтаксис для обозначения «горячей клавиши» - "хоткей::действие". Например, чтобы запускать программу WinSCP с помощью <Windows-I>, необходимо добавить в конфиг строку:

#i::Run,%A_ProgramFiles%\WinSCP\WinSCP.exe

Символ # в данном случае обозначает клавишу <Windows>, а запуск программы осуществляется с помощью функции Run. Если на хоткей ты хочешь назначить несколько действий (а именно это нам и нужно), следует использовать более сложный синтаксис:

hotkey::
действие1
действие2
return

Перед конструкцией можно также обозначить условия, с которыми будет выполняться хоткей. Скажем, если ты хочешь, чтобы «горячая клавиша» работала только в конкретном приложении, то для этого с помощью директивы #IfWinActive необходимо указать тип и названия окна (оба параметра можно узнать с помощью утилиты Active Windows Info). Наш следующий хоткей работает только в Firefox'е, вызывает меню «Tools» (с помощью встроенной «горячей клавиши» Firefox <alt-t>) и затем открывает окно «Options».

#IfWinActive ahk_class MozillaUIWindowClass
#o::
Send {Alt}t
Sleep 100
Send o
return
#IfWinActive

В некоторых случаях, чтобы не писать весь код скрипта вручную, выручит специальный macro recorder - аналогичный AutoScriptWriter для AutoIt. С помощью Recorder by Titan (www.autohotkey.com/forum/topic23671.html) можно записать операции с окнами, действия с клавиатуры, движения мышью, паузы - словом, полностью записать все свои действия на скриптовом языке. Скрипты обычно оформляются в файлы с расширением .ahk, но, благодаря встроенной тулзе, их можно преобразовать в самостоятельный exe-файл и запускать на любом компе.

INFO

Последний официальный релиз nnCron некорректно работает под Vista/W7. Поддержка этих операционных систем добавилась в версии 1.93b3.

WWW

Последнее обновление 30.01.14 10:15
 
Интересная статья? Поделись ей с другими:

bottom

 

Unreal Commander PfSense по русски Яндекс.Метрика