Что нового

AutoIt на WEB-сервере

Microteam

Осваивающий
Сообщения
74
Репутация
34
Здравствуйте. Вот решил подружить AutoIt с WEB-сервером Apache2. За основу возьму платформу DENWER. Итак, AutoIt мы будем использовать в качестве CGI.

Устанавливаем Denwer (не буду описывать процесс его установки). Я выбрал стандартный путь: C:\WebServers (у вас он может быть другим), идём в папку куда установлен AutoIt (обычно: C:\Program Files\AutoIt3). Далее копируем файл AutoIt3.exe и папку Include, потом идём сюда: C:\WebServers\usr\local (не забываем что у вас путь к денверу может отличаться), и создаем там папку autoit3, и в созданной папке вставляем наши скопированные файлы.

Если у вас в данный момент включен денвер, обязательно выключите его.

Серверный скрипт AutoIt немного отличается от простого скрипта. Во первых директива:
Код:
#!/usr/local/autoit3/autoit3
Эта строчка, должна быть самой первой т.к., благодаря этой строчке Apache определяет путь к интерпретатору.

Далее, мы должны вывести в консоль(STDOUT поток) Mime тип контента. Вывод в консоль осуществляется с помощью функции:
Код:
ConsoleWrite();


т.к., мы будем выводить обычный html текст с кодировкой WINDOWS-1251, то мы указываем так:
Код:
ConsoleWrite("Content-Type: text/html; charset=WINDOWS-1251"&@CRLF&@CRLF);


HTTP заголовки от тела документа, разделяются одной пустой строкой, мы это также учли и в конце добавили @CRLF&@CRLF.

В итоге в начале каждого серверного скрипта, должны быть две строки:
Код:
#!/usr/local/autoit3/autoit3
ConsoleWrite("Content-Type: text/html; charset=WINDOWS-1251"&@CRLF&@CRLF);


Это неотъемлемая часть, любого серверного скрипта AutoIt. Только после указания этих строк, можно выполнять вывод. В противном случае сервер будет выдавать такую ошибку:
Код:
500 Internal Server Error

Давайте же, создадим наш первый серверный AutoIt скрипт, с таким содержанием:
Код:
#!/usr/local/autoit3/autoit3
ConsoleWrite("Content-Type: text/html; charset=WINDOWS-1251"&@CRLF&@CRLF);

ConsoleWrite("Hello from AutoIt");


И сохраним файл скрипта по пути: C:\WebServers\home\cgi-glob\test.au3

Запускаем денвер, и заходим сюда: http://localhost/cgi-glob/test.au3
Как видим вывелась, наша строка:
Код:
Hello from AutoIt

Если у вас всё получилось, то я поздравляю вас, вы написали свой серверный скрипт на AutoIt!


1. Заголовки
Итак, теперь разберёмся с окружением нашего серверного скрипта. Каждый браузер передаёт серверу заголовки, а тот уже передаёт их скрипту. Заголовки можно узнать, через функцию
Код:
EnvGet

Допустим, мы можем узнать наш браузер(User-Agent):
Код:
#!/usr/local/autoit3/autoit3
ConsoleWrite("Content-Type: text/html; charset=WINDOWS-1251"&@CRLF&@CRLF);

$user_agent = EnvGet('HTTP_USER_AGENT');

ConsoleWrite("Наш браузер: "&$user_agent);

После выполнения скрипта, будет выведена строка User-Agent нашего браузера. К примеру, я пользуюсь Google Chrome и у меня User-Agent:
Код:
Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/27.0.1453.116 Safari/537.36

2. GET запрос
Многие из нас видели ссылки, такого типа: http://example.com/index.php?key=value
Так вот, все что после знака вопрос "?", это строка запроса (англ. Query String).
Это часть GET запроса. Сервер нам позволяет получить эту самую строку запроса, также через функцию EnvGet. Код:
Код:
#!/usr/local/autoit3/autoit3
ConsoleWrite("Content-Type: text/html; charset=WINDOWS-1251"&@CRLF&@CRLF);

$var = EnvGet('QUERY_STRING');

ConsoleWrite("Строка запроса: "&$var);


Если мы уже к нашему URL добавим запрос, например: http://localhost/cgi-glob/test.au3?val=Hello_User

то мы получим в браузере такое:
Код:
Строка запроса: val=Hello_User

Мы можем указывать несколько переменных в запросе, разделяя их амперсандом "&", примерно так: http://localhost/cgi-glob/test.au3?a=foo&b=bar ,но как говорит Каневский: "А это уже совсем другая история".

3. POST запрос.
Обработка POST запросов несколько отличается от GET запросов. Чтобы получить данные указанные в POST запросе, нам нужно считать их с STDIN потока, в AutoIt это делает функция:
Код:
ConsoleRead();


Исходя из этого, POST запрос прочитать можно так:
Код:
#!/usr/local/autoit3/autoit3
ConsoleWrite("Content-Type: text/html; charset=WINDOWS-1251"&@CRLF&@CRLF);

$var = ConsoleRead()

ConsoleWrite("Строка POST запроса: "&$var);


Обратите внимание, что POST запросы не добавляются к URL, после знака вопрос "?", как это делают GET запросы, строка POST запроса храниться в заголовках, которые передаются серверу. Итак, конец теории, давайте же с вами напишем такой скрипт который будет получать POST запрос и обводить все вхождения слова "AutoIt" синим цветом, а буквы белым:
Код:
#!/usr/local/autoit3/autoit3
ConsoleWrite("Content-Type: text/html; charset=windows-1251"&@CRLF&@CRLF);


$method = EnvGet('REQUEST_METHOD') ; Узнаем метод запроса GET или POST
$path = EnvGet('SCRIPT_NAME'); Узнаем HTTP-путь к текущему скрипту

$uri = 'http://'&EnvGet('SERVER_NAME')&$path ; Тут мы получаем полный URI к текущему скрипту

; Если метод POST то читаем данные из STDIN потока
If $method = "POST" Then
   $POST = ConsoleRead();
EndIf

; Код на HTML
ConsoleWrite('<!DOCTYPE html>'&@CRLF)
ConsoleWrite('<html><head><meta http-equiv="Content-Type: text/html; charset=WINDOWS-1251"><title>Приожение на AutoIt!</title></head><body>')

ConsoleWrite('<form action="'&$uri&'" method="POST">Введите текст:
 <textarea name="text">This is AutoIt script. AutoIt is subtle</textarea>
<input type="submit" value="Отправить!"></form>');

; Если POST запрос, то мы его обрабатываем
if IsDeclared("POST") Then
   $POST = StringRegExpReplace($POST, '^text=', '');
   $POST = StringReplace($POST, "+", " ")
   
   $POST = StringReplace($POST, "autoit", "<span style='background: blue;color:white;'>AutoIt</span>")
   
   ConsoleWrite("Обработанный текст: "&$POST);
EndIf

ConsoleWrite('</body></html>');


Список переменных окружений можно узнать тут:
http://angel07.webservis.ru/perl/env.html

DENWER находится тут: http://denwer.ru

Удачи!
 

Garrett

Модератор
Локальный модератор
Сообщения
3,999
Репутация
967
Плохо одно, AutoIt на сервера не ставят ;D
 

Jan-Jak

Новичок
Сообщения
45
Репутация
1
я бы на свой поставил. но у меня IIS на Windows server 2008 r2.
 

alex33

Скриптер
Сообщения
1,457
Репутация
186
У меня всё заработало. Я скомпилировал в exe как консольное приложение и у меня тоже всё заработало.


Maalik [?]
идём в папку куда установлен AutoIt (обычно: C:\Program Files\AutoIt3). Далее копируем файл AutoIt3.exe и папку Include, потом идём сюда: C:\WebServers\usr\local (не забываем что у вас путь к денверу может отличаться), и создаем там папку autoit3, и в созданной папке вставляем наши скопированные файлы.
А можно и не переносить, просто указать путь к установленному AutoIt. Я написал
Код:
#!C:/Program Files/AutoIt3/AutoIt3
и у меня тоже всё заработало...
 

Olim98

Новичок
Сообщения
48
Репутация
2
Garrett сказал(а):
Плохо одно, AutoIt на сервера не ставят ;D
Два плохо) AutoIt не самый быстрый язык, а для серверов, особенно высоко-нагруженных это не приемлемо. но за статейку спасибо
 

alex33

Скриптер
Сообщения
1,457
Репутация
186
Olim98 сказал(а):
AutoIt не самый быстрый язык, а для серверов, особенно высоко-нагруженных это не приемлемо.
Ну для какого-нибудь офиса / в какую-нибудь локальную сеть можно я думаю запустить... :smile:
 

Olim98

Новичок
Сообщения
48
Репутация
2
Если кто нить знает OpenServer, измените пжл пути под него. Я сам что то не смог разобраться :(

UPD: Уже сам разобрался, во-первых вместо
Код:
#!/usr/local/autoit3/autoit3
вначале скрипта пишем
Код:
#!(ПОЛНЫЙ ПУТЬ К AUTOIT C НАЗВАНИЕМ ФАЙЛА БЕЗ РАСШИРЕНИЯ)
, например
Код:
#!C:/Program Files/AutoIt3/AutoIt3
. А во-вторых сам скрипт кидаем в папку
Код:
/OpenServer/domains/localhost/cgi-bin
, проходим по ссылке http://localhost/cgi-bin/test.au3 и наслаждаемся шедевром :beer: ;D
 
Верх