AutoIt — решение нерешаемых задач


AutoIt v3 — это бесплатный язык сценариев, подобный BASIC, разработанный для автоматизации графического интерфейса Windows и общих сценариев. Он использует комбинацию смоделированных нажатий клавиш, движения мыши и манипуляций с окном / элементами управления, чтобы автоматизировать задачи способом, невозможным или надежным с другими языками (например, VBScript и SendKeys). AutoIt также очень маленький, самодостаточный и будет работать на всех версиях Windows «из коробки» без раздражающих «сред выполнения»!

Пожалуй лучшего описания не стоит искать или придумывать.
Эта статья будет дополняться по мере моего познания этого языка.
У меня возникла идея управлять Windows программой с помощью веб-сайта. Чтение информации в интернете приводило к ступору, а точнее моя неправильная формулировка запроса поиска. Но вот спустя пару дней я нашел этот язык и решил попробовать автоматизировать процесс.

Часть 1

Теперь обрисую полную задачу и нужные компоненты:
Веб-форма (php) отправляет запрос на сервер (Windows или Linux), сервер обрабатывает полученную информацию и записывает ее в текстовый файл и запускает AutoIt. AutoIt в свою очередь забирает информацию с файла и проводит нужные операции что заданы в скрипте, после чего результат отправляется обратно на сайт.

Для начала возьмем exe файл и посмотрим возможные операции с ним. Для примера я взял популярный генератор паролей для видеорегистраторов.

Скачать этот генератор

Есть 2 активных поля (DATE и PASSWORD) и 2 кнопки (OK и Cancel). В поле DATE вводим дату в формате Год Месяц День, затем жмем ОК, и получаем свой PASSWORD.
Таким образом алгоритм работы становится понятным для нас, но нужно перевести все это в скриптовый вариант.

  • Создаем новый скрипт
  • Запускаем утилиту AutoIt Window Info для получения информации об активных окнах в системе

Теперь следует получить информацию о программе ( в данном варианте это Super Password).
Чтобы узнать название программы выбираем кнопку Finder Tool что отмечена и зажимая левую кнопку мышки переводим курсор в поле окна программы. В итоге показывается название программы.

  • Run("SuperPassword.exe")
    Запускает программу в обычном режиме. Команда Run имеет дополнительные флаги для запуска, вот их описание https://autoit-script.ru/docs/functions/run.htm
  • WinWaitActive("Super Password")
    Указываем что нужно ожидать активное окно с названием Super Password
  • ControlClick("Super Password", "", "[ID:1002]")
    Теперь следует активировать окно DATE. Во вкладке Control находим ID окна (1002)
  • ClipPut(FileReadLine("input.txt"))
    Поскольку в поле нужно ввести данные, предварительно создадим текстовый файл input.txt со следующим содержимым: 20201016. Помните еще о Год Месяц День ?
  • send(ClipGet())
    Теперь вставим данные 20201016 с текстового документа в поле DATE. Отлично, мы получаем данные с файла input.txt, затем вставляем их в форму DATE, и на выходе имеем сгенерированный ключ в поле PASSWORD
  • Send("{ENTER}")
    Чтобы отправить команду генерации пароля можно нажать кнопку OK или просто нажать Enter
  • Создадим файл в который будет производится запись результата с поля PASSWORD.
  • $key = ControlGetText('Super Password', '', '[CLASS:Edit; INSTANCE:2]')
    Забираем нужные данные с поля PASSWORD. Создаем переменную $key которая будет содержать данные нужной формы.

Снова получаем свойство окна, но теперь в другом формате. Вы можете использовать разные методы получения данных с окна в зависимости от программы и окон что она формирует.

  • FileWrite("output.txt", $key)
    Запишем данные в файл output.txt
  • WinClose("Super Password", "")
    Закроем окно программы после успешного выполнения кода.

Как вы глядит полный скрипт
Run("SuperPassword.exe")
WinWaitActive("Super Password")
ControlClick("Super Password", "", "[ID:1002]")
ClipPut(FileReadLine("input.txt"))
send(ClipGet())
Send("{ENTER}")
$key = ControlGetText('Super Password', '', '[CLASS:Edit; INSTANCE:2]')
FileWrite("output.txt", $key)
WinClose("Super Password", "")

Или его можно Скачать

Теперь превратим скрипт в exe файл который можно запускать в среде Windows.

Для этого запускаем утилиту с названием Compile Script to и указываем файл скрипта что мы сделали выше , и нажимаем Convert

Часть 2

Для управления со стороны Windows будем использовать Open Server https://ospanel.io. Это позволит запускать скрипты AutoIt и одновременно настроить Apache и Php для работы web-сервера.
Примечание: web-сервер может быть настроен и на Linux, это не имеет значения.
После скачивания и установки программы приступим к ее настройке.

  • В папке openserver→ OSPanel→ domains создадим адрес нашего сайта. Для примера это будет test.saniaowner.space. Теперь создадим вложенную папку test и добавим в нее файлы которые создали в первой части. Это должно выглядеть вот так
  • Настроим домен в автоматическом режиме. Чтобы создать домен или поддомен откройте [Меню → Папка с сайтами] и создайте папку с именем будущего домена. После создания домена перезапустите сервер.

Чтобы сайт был доступен в интернете обязательно нужен домен. Я рекомендую использовать проверенный и надежный домен который не подводит в сложные моменты.

Hosting Ukraine

Немного отступление от темы. Как то ночью мне не спалось и полез я редактировать настройки на хостинге. По итогу через пол часа сайт прилег, и не подавал признаков жизни. Обращение в тех. поддержку в 3 ночи решило вопрос за 10 мин (5 мин ждал ответ оператора и 5 мин пока настройки применились). В общим судите сами о тех.поддержке хостинга и моем нубстве.

  • Теперь создадим HTML форму в которой будем вводить данные для генерации пароля
<form action="forma_.php" method="post">
<br>Введите текущий Год Месяц День:
<input type="tel" size="10" pattern="[0-9]{8}" placeholder="<?php echo date("Ymd");?>" name="pass" /required></br>									      
<p><b><input type="submit" value="Сгенерировать пароль"></b>
</form>

Небольшое объяснение этой формы.
forma_.php — вызываем страницу которая содержит основной код.
type="tel — особенность HTML чтобы вводить только цифры.
size="10" — размер 10.
pattern="[0-9]{8}" — ограничение чтобы вводить только цифры от 0 до 9, общим количеством 8. То есть не больше 8, не меньше 8, ровно 8. Поскольку полная дата состоит из 8 цифр ( 2020 10 18).
placeholder="<?php echo date("Ymd");?>" — отображает текущую дату (Год Месяц День) в поле ввода.
name="pass" — имя формы.
/required — данные заполнить обязательно, иначе не получится отправить форму


<b>Сгенерированный пароль:
<?php

$way = 'C:\openserver\OSPanel\domains\test.saniaowner.space\test';  //путь к папке test на диске
$clear = fopen($way.'\input.txt', 'w');  //очистить файл input.txt
fclose($clear);
$clear = fopen($way.'\output.txt', 'w'); //очистить файл output.txt
fclose($clear);

$value = $_POST['value']; // Здесь будет значение инпута с name атрибутом "value"
$pass =  $_POST['pass']; // А здесь с name "pass"
$f = fopen($way.'\input.txt', 'a+'); // Открываем файл input.txt чтобы записать входящие данные с формы 
fwrite($f, $pass."\n"); // Записываем данные
fclose($f); // Закрываем файл


$cmd = '%CD%\Test.exe';   // запускаем Test.exe (готовый скрипт)

while (@ ob_end_flush()); // если есть, прекращает все буферы вывода
$proc = popen($cmd, 'r');
echo '<pre>';
while (!feof($proc))
{
    echo fread($proc, 4096);
    @ flush();
}
echo '</pre>';


$x = $way.'\output.txt';   //создаем путь к файлу output.txt(сгенерированный пароль) в виде переменной x
echo file_get_contents($x); //отображаем переменную x на сайте 


$clear = fopen($way.'\input.txt', 'w');  //очистить файл input.txt
fclose($clear);
$clear = fopen($way.'\output.txt', 'w'); //очистить файл output.txt
fclose($clear);

?>

Постарался максимально подробно дать комментарии для каждой строки.
Должно получится вот так

Все выше перечисленные файлы: Скачать

  • Если нужно вставить этот скрипт на другом сайте можно использовать Iframe
<head>
<title>saniaowner|Pass</title>
</head>
<body>
<iframe src="https://test.saniaowner.space/test/forma.php" width="100%" height="120px" frameborder="0" scrolling="auto"> </iframe>
</body>
</html>

src="https://test.saniaowner.space/test/forma.php" — путь к форме.
width="100%" — ширина 100%.
height="120px" — высота 120px. Если нужно укажите свою высоту.
frameborder="0" — толщина рамки 0.
scrolling="auto" — если случайно установите высоту меньше чем сама форма включится скроллинг.

Как я писал эту статью