Windows script http post

Объекты вида XMLHTTP — Обработка заголовков HTTP запроса

Приветствую всех, с вами автор блога scriptcoding.ru. В этой статье мы рассмотрим компоненты для отправки HTTP запросов программными средствами сервера Windows Script Host.

В предыдущих публикациях я приводил несколько примеров для работы с HTTP запросами – сканер IP адресов и поиск битых ссылок, в одном примере использовался объект MSXML2.XMLHTTP , во втором WinHttp.WinHttpRequest , фактически, они по логике работы идентичны и один можно заменить другим, есть и другие компоненты что бы отправить HTTP запрос, например, Microsoft.XMLHTTP или MSXML2.ServerXMLHTTP , я поместил библиотеки с компонентами в архив (ссылка ниже). Для регистрации компонента запустите Пуск/Выполнить REGSVR32 «Путь к компоненту». Вы можете запустить реестр (Пуск/Выполнить regedit) и просто ввести в поиске имя компонента, возможно он уже присутствует в системе.

Так как на блоге будут статьи с примерами для работы с заголовками HTTP запроса, то тут я хочу привести основные методы и свойства упомянутых выше компонентов. Дело в том, что все они по своей природе идентичны, поэтому, их свойства и метода содержат одинаковый синтаксис.

Компоненты для формирования HTTP запроса

Методы

Open (method, URL, type, userName, password) – определяем метод (method) с помощью которого будет происходить отправка запроса HTTP, например: GET – передача данных серверу через URL адрес , POST — передача данных серверу, используя тело HTTP запроса . Адрес (URL) интернет ресурса, которому в будущем будет отправляться запрос HTTP, можно указать как название домена, так и IP адрес. Тип режима (type) – может принимать два значения true — код будет выполняться, не ожидая ответа от сервера или false – сценарий остановит работу до возврата сервером ответа на запрос, username, password – указываем логин и пароль, если есть надобности в авторизации.

Send (data) – Собственно, отправка HTTP-запроса, тут data – данные для отправки, могут отсутствовать. Возвращаемая информация может быть проверена с помощью методов вида getAllResponseHeader или getResponseHeader , а также, свойства с префиксом response .

setRequestHeader (name, value) — Устанавливает заголовок HTTP запроса, тут name – название, запроса со значением value. Если заголовок с таким именем уже есть — он заменяется. Например:

  • xmlhttp.setRequestHeader(‘Content-Type’, ‘application/x-www-form-urlencoded’)
  • User-Agent», «Godzulla/4.0 (compatible; MyApp 1.0; Windows NT 5.1)

Заголовки в основном предназначены для информирования – дата, тип браузера, куки и так далее, хотя могут быть и произвольного характера, например, HTTP запрос:

  • X-hacker: If you’re reading this, you should visit automattic.com/jobs and apply to join the fun, mention this header.

getAllResponseHeaders () — Возвращает строку ответа сервера со всеми заголовками. Например, мы можем получить ответ вида:

  • Content-Type: text/html
  • Expires: Wed, 15 Aug 2012 14:15:52 GMT
  • Cache-Control: public
  • Content-Encoding: gzip
  • Content-Length: 20583
  • Accept-Ranges: bytes

getResponseHeader (headerName) — Возвращает значение заголовка ответа сервера с именем headerName, например, можно указать Date, User-Agent и так далее.

Abort () — Позволяет отменить текущий HTTP запрос, реализованный с помощью метода send, удаляет все заголовки HTTP запроса, ставит текст ответа сервера в null.

Свойства

responseText — Хранит ответ в виде строк текста, фактически, мы получим HTML текст страницы. Если состояние не 3 или 4, возвращает пустую строку.

responseXML — Хранит ответ в виде XML. Если состояние 4, возвращает пустую строку.

responseBody — Получает тело ответа лица в виде массива байтов без знака, используется при закачке бинарного файла

Status — Статусный код ответа сервера на запрос HTTP: 200 — OK, 404 – Не найдено, и т.п.

statusText — Текстовая расшифровка свойства status, например «Not Found» или «OK».

Хорошо, с теоретической стороной мы разобрались, теперь можно приступить к программированию.

Полученная информация от сервера – заголовки HTTP запроса

И так, с теорией мы закончили, теперь давайте приступим к практической стороне работы с заголовками HTTP запроса. Если у вас есть сайт, или установлен веб сервер Денвер, то, создаем файл tester.php, прописываем в нем строки кода и помещаем в корневую папку. И так открываем редактор Notepad++ и прописываем следующий код:

Как видим, скрипт будет выводить два текстовых поля, если первое поле заполнено, то будет происходить вывод заполненных данных. Можете протестировать скрипт… Теперь создадим файл tester.js, он будет отправлять данные php скрипту:

Скрипт отправляет запрос HTTP на страницу http://site.ru/tester.php, мы установили заголовок User-Agent – говорим, что мы типа с браузера Godzilla . Переменная MSG хранит строку, которую надо передать, фактически, мы говорим: «надо заполнить поле body1 и поле body2». В конце, мы выводим два окна, первое показывает все HTTP заголовки, а второе HTML код.

Данная публикация по работе с HTTP является не полной, так как в ней не рассмотрен пример для закачки файла и многое другое, просто, я решил не превращать материал в справочный хлам, удобней написать отдельную публикацию с примерами и разъяснениями. Так, я использовал компонент для отправки данных, при написании скрипта для поиска битых ссылок , далее была опубликована публикация для сканера IP адресов и сканера портов. В статье «Штурмуем протокол HTTP» был написан скрипт для отправки данных с помощью заданных методов и составления собственных значений для полей. Как видите, я стараюсь анализировать и дополнять материалы сайта примерами.

Спасибо за внимание. Автор блога Владимир Баталий

Windows script http post

This forum is closed. Thank you for your contributions.

Answered by:

Question

Hi,
From my web application i need to access another web application page so i used WinHttpRequest with POST method but its not passing the value. Can any one tell me is thr any thing wrong in my vbscript.

Dim objWinHttp, strURL, strStatus,strUser,strPswd

Set objWinHttp = Createobject(«WinHttp.WinHttpRequest.5.1»)
strURL = «https://example.com/Login.aspx»
Msgbox strURL
strUser = «demouser@example.com»
strPswd = «abC8234#»

Dim postDataOfLogin
postDataOfLogin = «ctl00_ContentPlaceHolder1_AdminCenterLoginControl_UserNameTextBox=» & strUser & «&ctl00_ContentPlaceHolder1_AdminCenterLoginControl_PasswordTextbox=» & strPswd
‘ Open an HTTP connection
objWinHttp.Open «POST», strURL

objWinHttp.SetRequestHeader «Content-Type», «application/x-www-form-urlencoded»

‘ Send the HTTP Request

objWinHttp.Send(postDataOfLogin)
strStatus = objWinHttp.StatusText’ResponseText
Wscript.echo strStatus

This is my script but values are not passing to that page can any one help me out.

HTTP request with Windows script host (.hta)

I can’t believe I’m stuck here, but I can’t seem to make a simple HTTP request using Windows script host or simple .hta file.

This is my code:

When I start the .hta file I get a JavaScript error saying something like Object Expected .. this is very annoying since it’s a trivial task and I can’t really debug it.

Any idea how I can debug this stuff? Thanks.

2 Answers 2

It seems to me you should use

inside of .hta file instead of CreateObject() .

UPDATED: Hi Luca! I have not much place in comments and can post links not so good, so I appended my answer:

The error which you do from the code of your question is that you try use in JavaScript elements of other language. In VBScript exist CreateObject, but it is a feature of the VBScript language. In JScript/JavaScript you have to use new ActiveXObject instead.

Moreover you mentioned in your comments several times about cross domain problems, but never described what do you do. If you want a help about this subject you should include in your question more information about what do you do. Probably you can include code in WSH or C which worked and include the corresponding version of the .HTA file. It would be also helpful if you describes why you want to use .HTA file instead of WScript/CScript or PowerShell. In which scenario you want to use .HTA file?

send a file and parameter HTTP Post with VBS

I’m new working with HTTP protocol and haven’t worked with VBS for some time. The problem I’m having is sending a parameter and an upload file to a web service. I just don’t understand what some of the code is. Below is part of the code.

I know I can’t use .Send twice. I believe I need to make a change in the below code block.

bytPD = «publication=moveit_test_pub» is the parameter I need along with the file upload. I’m just not sure how to add it to the above block. If that’s where I’m supposed to change. I’m posting the entire code below for reference. Thanks for all your help!

1 Answer 1

I found a solution. This was my logic:

with curl you can send a file + parameters with:

In this case you can see:

  • IP = 127.0.0.1 (localhost)
  • Port = 8000
  • Filename = img.png
  • Parameter = «id» with value 123456

If you use netcat in listening mode like this.

This means that it’s listening for anything on port 8000 of the localhost = 127.0.0.1 (I’m using the Mac version of Netcat. You may need to change some parameters to make it work like this).

So: launch netcat in listening mode, launch the previous curl command and you will see the entire POST packet. Now you know how it is made. It will look like that:

Now that you know how the working packet is made, you can replicate it.

For the header use: httpServer.SetRequestHeader «Content-type», «multipart/form-data; boundary=————————2deddc24cb2a8ca2;»

(boundary is sort of delimiter. Check it on Google)

Then you can build the body of the POST request:

  • in the body you can see that every boundary has an additional «—« string at the beginning (infact i wrote «—» & «————————2deddc24cb2a8ca2») and an additional «—« at the end of the last boundary.
  • The header must have «;» at the end of the line in vbs even if is not visible in the previous captured POST request. I don’t know exactly why.
  • The FILE_CONTENT variable in the body is the content of your file
  • Take care for every vbCrLf (end of the line) or the POST request may not be valid.

PROBLEM: The code you posted below should open a stream, write the first part of the body as a string, write the BINARY content of your file, write the last part of the body as a string.

Combining String and Binary data it’s not working for me: i can send only the binary or only text file. If i convert the binary content to string, the remote server will get a corrupted (different) file.

example (binary file only):

example (text file only)

As i told you, if you change the stream.Type from 2 to 1 (for Binary) you will end to send a corrupted file.

My solution was to send the parameter as an extra Header value: Example:

Now i can send the parameter (Id) AND the binary file.

NOTE: With Content-type: application/octet-stream you can send unknow file extension too

Как работать с Invoke-WebRequest в Powershell и алиасом Wget создавая запросы HTTP и HTTPS

Команда Powershell Invoke-WebRequest появилась в 3-ей версии консоли. Основной задачей команды — обращение к ресурсам по HTTP, HTTPS и FTP. У этой команды в Powershell есть алиасы в виде ‘iwk’ и ‘wget’. На примерах ниже мы рассмотрим обычные запросы, работу с json, заполнение форм, аутентификацию и парсинг.

Навигация по посту

Создание запроса HTTP и HTTPS в Powershell

После выполнения простого запроса мы увидим полученную информацию:

Если вы имеете прямую ссылку на файл и хотите его скачать нужно дополнительно указать ключ OutFile:

Так же можно скачивать любой файл формата ZIP,MP4 и так далее.

Доступ к свойствам

Почти любая команда в Powershell по умолчанию выводит меньше информации чем имеет. Что бы вывести все можно использовать следующий подход:

Я не рекомендую использовать подход выше, так как в этом случае вывод будет сложно читать. Мы можем посмотреть какие свойства хранит объект для следующего анализа:

И таким образом выводить данные:

Само содержимое веб документа может быть доступно по двум свойствам:

Использование заголовков

Выполнив запрос к какому-то сайту может оказаться, что полученные данные не соответствуют тому что мы видим на сайте. Причин, обычно, у этого две:

  1. Отсутствуют заголовки;
  2. Часть информации обрабатывается через JavaScript.

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

Если вы будете испытывать сложности с составлением заголовков, то можно включить отладчик на F12 и открыть закладку Networks и скопировать их. Они находятся в выделенной части на скриншоте:

Кстати через это же меню в Chrome можно получить уже сформировавшийся запрос с командой нажав на нужный элемент и выбрав «Copy as Powershell»:

Команда получится достаточно длинной, но это поможет избавиться от долгих поисков нужных заголовков:

Вы можете увидеть вторую кнопку «Copy all as Powershell», которая сформирует объект типа «[object Promise]», но информацию как работать с этим я не нашел.

Такой способ не поможет пройти аутентификацию на сайте так как в Chrome Cookies устанавливаются в параметр Headers, но судя по документации они должны передаваться через параметр WebSession.

Cookies

Для входа на сайт, где используется аутентификация, понадобится использовать Cookies, которые можно увидеть на скриншоте выше. Cookies вводятся отдельно от заголовков и их можно указать двумя путями.

Во время выполнения аутентификации через Poweshell мы можем указать переменную куда будут сохранены данные, а затем передать ее для следующего запроса. В примере ниже такая переменная называется SavedSession:

Как вы можете увидеть в этой переменной хранятся и заголовки.

Второй способ это заполнить поля Cookies самим через контейнер .NET, то есть способом аналогичным получению заголовков. Первое что делается — создается объект аналогичный SavedSession:

Теперь мы должны добавить в поле Cookies данные и передать через командлет, я использовал алиас wget:

Cookie, которые мы передали соответствуют Password=123.

Работа с формами и загрузка

Когда мы заполняем какую-то форму на сайте или выполняем загрузку мы чаще используем метод POST, а не GET, который стоит по умолчанию. Метод можно увидеть в коде или в описании документации, если используете приложения или API:

Чаще всего используются методы описанные выше, но в Powershell доступно больше:

Ключ, в котором используются эти параметры так и называется Method:

Для заполнения форм, в версии Powershell 6 +, можно использовать следующий подход:

Если вы не установите свой тип в заголовке ContentType то он будет «application/x-www-form-urlencoded». Если это важно, то лучше использовать параметр -ContentType, а не писать это же свойство в заголовке. Синтаксис можно увидеть дальше.

Кодировка

Если вы используете данные, которые отличаются от латиницы вы можете столкнуться с проблемой кодировок. Дело в том, что следующие данные будут отосланы не в UTF-8, хоть это и будет указано:

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

Вы так же можете посылать данные таким образом:

Аутентификация

Посмотрим на три способа аутентификации используя: базовую (Basic), с использованием сертификата, NTLM и Kerberos.

Базовая аутентификация

Обычно сервер передает дополнительные данные для аутентификации, но в примере ниже это выполнение без их использования:

Такой способ не рекомендуется использовать, так как данные будут доступны в истории в незашифрованном виде. Вы так же можете использовать ключ Credential, который создаст аналогичный заголовок за вас.

Используя сертификат

Если у вас установлен сертификат, то вы можете его использовать только указав отпечаток (Thumbprint):

NTLM и Kerberos

Если вам нужно пройти аутентификацию для текущего пользователя вы можете добавить ключ -DefaultCredentials:

Этот ключ не будет работать вместе с аутентификацией типа Basic.

Парсинг сайтов

Парсинг, то есть возможность собирать информацию с сайтов, в Powershell реализована достаточно просто. Если мы посмотрим какие свойства имеет объект команды Invoke-WebRequest, сможем увидеть теги:

Картинки

Для примера в HTML картинки хранятся в таком виде:

То есть все картинки имеют тег IMG и SRC. В Powershell часть тегов уже собрана в отдельные свойства и так мы получим список всех картинок:

Мы видим только ссылки на картинки, а значит нам нужно выполнить еще по запросу для каждой картинки. К тому же я хочу сохранить существующие имена для каждой картинки, так как у них разные форматы (PNG, JPG). Это будет выглядеть примерно так:

Обратите внимание, что если у вас не создана директория куда будут сохранятся картинки, появится ошибка. Iwr не создает директории.

Парсинг других тегов

Парсинг остальной части сайта мало чем отличается от примера с картинками. Так как Images и Links выведены как основные свойства, то поиск, например, заголовков должен делаться через свойство AllElements. Для примера так я найду все теги h2:

Кроме поиска по тегам часто приходится искать по классам. Например так я найду все заголовки h2, но используя класс:

По умолчанию мы не можем работать с JSON объектами. Они будут восприниматься как строки пока мы не конвертируем объект в PSCustomObject. Это делается так:

После этого мы можем обращаться к свойствам:

После изменения мы возможно захотим отправить объект. Для этого мы конвертируем из PSCutomObject в JSON:

Как получать и изменять свойства файлов в Powershell

Работа с классом Net.WebClient

При работе в Powershell доступен еще один метод для доступа к веб страницам и скачивания файлов Net.WebClient. Этот класс имеет методы все из которых мы можем увидеть так:

Скачивание

Метод DownloadString() позволяет скачивать информацию. Так, например, мы получим содержимое главной страницы сайта:

Как вы видите есть проблема с кодировкой. Ее можно исправить так:

Для скачивания файлов используем метод DownloadFile():

Читайте также:  После обновления windows 10 перестали работать usb
Оцените статью