1 (изменено: Домовой, 2021-01-25 13:38:54)

Тема: VBS: Нужна помощь за вознаграждение - Метод POST (REST)

Здравствуйте!
Нужен скрипт выполнения запроса методом POST по URL-адресу, подробнее в приложенном файле.
У меня затруднения с заголовками, не могу понять, какие заголовки нужны. И не знаю как отправить сам запрос, который в формате JSON.
Проблема ещё в том, что пока нет рабочего URL, на котором можно потестить.

Помощь за вознаграждение.

Приложенный файл прислали разработчики сервиса, если возникнут вопросы - попробую ответить.

Заранее спасибо!

Post's attachments

Поиск по ФИОДР.docx 17.33 kb, 13 downloads since 2021-01-25 

You don't have the permssions to download the attachments of this post.
Я - фольклорный элемент!

2

Re: VBS: Нужна помощь за вознаграждение - Метод POST (REST)

Домовой, приветствую. А вам именно VBS реализация нужна ? На JS это всё куда проще и удобнее реализуется.

Передумал переделывать мир. Пашет и так, ну и ладно. Сделаю лучше свой !

3

Re: VBS: Нужна помощь за вознаграждение - Метод POST (REST)

Xameleon
Хотелось бы на VBS. Но, думаю, с JS переведу на VBS. Просто в организации у нас VBScript такой неформальный стандарт

Я - фольклорный элемент!

4 (изменено: Xameleon, 2021-01-25 16:04:55)

Re: VBS: Нужна помощь за вознаграждение - Метод POST (REST)

Домовой пишет:

Но, думаю, с JS переведу на VBS

Думаю будет непросто. Из описания в документации я вижу, что придётся работать с JSON, добавляя или убавляя критерии поиска и разбирать ответ. На VBS это крайне неудобно, ПМСМ. Мне кажется, что тогда уж проще написать WSC и вызывать его из VBS управляя методами и свойствами.

Вот пример на JS:


var url = "http://00.00.000.000:19000/api/mdm-api/sync/find_extended",
	token = "MINqsergkfjdnczzYQg94vEd6Mjqj5ldnz6rmgl0kdasBH0DsbflIDKsQ_0fZ-s9IAHBO92AszgTIqItY",
	request = {
	   "query": {
		  "logic": {
			 "operator": "AND",
			 "conditions": [
				{
				   "binary": {
					  "field": "first_name",
					  "operator": "=",
					  "value": "ЛЕОНИД"
				   }
				},
				{
				   "binary": {
					  "field": "middle_name",
					  "operator": "=",
					  "value": "ЛЕОНИДОВИЧ"
				   }
				},
				{
				   "binary": {
					  "field": "last_name",
					  "operator": "=",
					  "value": "ЛЕОНИДОВ"
				   }
				},
				{
				   "binary": {
					  "field": "birth_date",
					  "operator": "=",
					  "value": "1973-10-05"
				   }
				},
				{
				   "binary": {
					  "field": "documents.doc_passport_rf.series",
					  "operator": "=",
					  "value": "1234"
				   }
				},
				{
				   "binary": {
					  "field": "documents.doc_passport_rf.value",
					  "operator": "=",
					  "value": "654321"
				   }
				}
			 ]
		  }
	   },
	   "protocol": "kri"
	}

// Creating JSON object
var JSON = (function(){
	var document = new ActiveXObject("htmlfile");
	document.write('<meta http-equiv="X-UA-Compatible" content="IE=Edge">');
	document.parentWindow.onerror = function(){
		throw new Error(arguments[4])
	}
	return document.Script.JSON
})()

// Prepairing request 
var whr = new ActiveXObject('WinHttp.WinHttpRequest.5.1');
whr.open("POST",url,false);
whr.setRequestHeader("X-APPLICATION-TOKEN",token);
whr.setRequestHeader("Cache-Control", "no-cache");
whr.setRequestHeader("Content-Type","application/json");

// Serializing data and sending request 
whr.send(JSON.stringify(request,null,'\t'))

// Checking response 
if(whr.status != '200'){
	WSH.StdErr.WriteLine("Request Failed ! " + whr.status + ' ' + whr.statusText);
	WSH.Quit()
}

// Parsing response
try {
	var response = JSON.parse(whr.responseText)
} catch(e){
	WSH.StdErr.WriteLine("Failed to parse JSON response ! " + e.description);
	WSH.Quit()
}

// Checking error code
if(response.errorCode != 0){
	WSH.StdErr.WriteLine('Search failed ! Error code: "' + response.errorCode + '"; Error Message: "' + response.errorMessage + '"')
	WSH.Quit();
}

// Checking record count	
if(response.foundRecords <= 0){
	WSH.StdErr.WriteLine('No records found !');
	WSH.Quit();
}

// Parsing response data
var info, document, prefix;
for(var info in response.data){
	info = response.data[info]
	// Showing LFM
	WSH.StdOut.WriteLine([
		'Фамилия:\t' + info.last_name,
		'Имя:\t\t' + info.first_name,
		'Отчество:\t' + info.middle_name,
		'Дата рождения:\t' + info.birth_date.split(' ')[0]
	].join('\r\n'));
	// Showing documents
	for(var item in info.documents){
		document = info.documents[item];
		switch(item){
		case 'doc_passport_rf':
			for(var i in document){
				WSH.StdOut.WriteLine('Паспорт РФ:\t' + document[i].series + " " + document[i].value)
			}
			break
		case 'doc_snils':
			for(var i in document){
				WSH.StdOut.WriteLine('СНИЛС:\t\t' + document[i].value)
			}
			break
		}
	}
	WSH.StdOut.WriteLine(Array(50).join('-'))
}

Результат вывода в консоль при разборе тестового ответа:

Фамилия:             ЛЕОНИДОВ
Имя:                    ЛЕОНИД
Отчество:            ЛЕОНИДОВИЧ
Дата рождения:   1973-10-05
Паспорт РФ:        1234 654321
СНИЛС:               39582746292
-------------------------------------------------

В аттаче пример для запуска

Post's attachments

test.zip 1.58 kb, 10 downloads since 2021-01-25 

You don't have the permssions to download the attachments of this post.
Передумал переделывать мир. Пашет и так, ну и ладно. Сделаю лучше свой !

5

Re: VBS: Нужна помощь за вознаграждение - Метод POST (REST)

Xameleon
Спасибо! Спасибо! Буду разбираться.
Как я могу передать вознаграждение?

Я - фольклорный элемент!

6

Re: VBS: Нужна помощь за вознаграждение - Метод POST (REST)

Домовой, ответил на почту. ) Предлагаю обсудить подробнее цель и её реализацию.

Передумал переделывать мир. Пашет и так, ну и ладно. Сделаю лучше свой !

7 (изменено: svoboden, 2021-01-27 01:24:40)

Re: VBS: Нужна помощь за вознаграждение - Метод POST (REST)

Xameleon пишет:

На VBS это крайне неудобно

А что там "неудобного" ? Послать json запрос на vbs очень просто, как и распарсить ответ: вот писал скрипт похожий недавно: http://forum.script-coding.com/viewtopi … 15#p145315, до сих пор работает.

8 (изменено: Xameleon, 2021-01-27 21:35:27)

Re: VBS: Нужна помощь за вознаграждение - Метод POST (REST)

svoboden, доброго дня. Постараюсь пояснить свою позицию.

1) Если взять сериализацию JSON на примере Вашего кода:

sR = "{""requests"":[{""insertText"":{""text"":""" & key & "\n"",""location"":{""index"":1}}}]}"


не делаю так по причинам:
а) В случае больших структур, хранить такой код в строковых переменных VBScript ПМСМ неудобно. Визуально режет глаз. Куча задвоенных кавычек для экранировки и если вытягивать выражение в линию, то получается нечитабельная строка, уползающая за экран. Много мест где можно ошибиться. Если вставлять переводы строк, то появляется куча амперсандов, нижних подчёркиваний. И хоть от части кавычек можно избавиться (имена параметров можно не брать в кавычки, если они не содержат пробелов), но всё равно ПМСМ неудобно:


Dim key: key = "test"
MsgBox "{" & _
			"requests: [" & _
				"{" & _
					"insertText: {" & _
						"text: """ & key & "\n""," & _
						"location: {" & _
							"index: 1" & _
						"}" & _
					"}" & _
				"}" & _
			"]" & _
		"}"

б) Даже если "закрыть глаза на эстетику и красоту", то нельзя забывать про экранировку данных "инжектируемых" параметров.
У Вас в коде она не используется, так как подразумевается, что значение переменной key не принимает в себя символов подлежащих экранировке. В случае коллеги Домового, данные попадающие в запрос, вполне могут содержать такие. Тогда, если использовать Ваш код, то придётся вставлять обрамляющую функцию экранировки вокруг параметров, добавляемых в текст строки. К тому же у Домового запрос может содержать динамическое количество вложенных структур в блоке "conditions", а значит придётся делать вкрапления не только параметров, но и обрамляющих блоков:


            {
               "binary": {
                  "field": "first_name",
                  "operator": "=",
                  "value": "ЛЕОНИД"
               }
            }

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

2) Что касается десериализации через execScript() / eval() - Вы наверняка не хуже меня знакомы с понятием "небезопасная JSON сериализация/десериализация". Но если вдруг нет - вот несколько ссылок для примера: ссылка 1, ссылка 2, ссылка 3

По этой причине не рискую использовать такой код:

window.execScript "var json = " & strJson, "JScript"

Доверяю библиотеке json2.js либо методам встроенного объекта JSON, получаемого из htmlfile. Он появляется в объекте window как свойство, начиная с IE9. (пример использования в моём коде выше.). Но вторым вариантом пользуюсь реже, так как он менее универсален. Не у всех же до сих пор установлен IE9 или тем более какой-то выше. К тому же он "молча глотает ошибки" при разборе невалидного JSON и приходится отлавливать их через window.onerror, что тоже не очень удобно.

А самый ад начинается когда доходит до разбора динамического ответа JSON. Очень неудобно в VBS анализировать - есть у объекта свойство или нет, перебирать элементы массива или свойства объекта, проверять внутренний тип данных. В JS для этого есть вся широта функционала, а для VBS это инородное тело.

Вот по всем этим причинам я и написал

На JS это всё куда проще и удобнее реализуется.

Пока что мне видится, что если есть крайняя необходимость реализовать всё на чистом VBScript, то можно заюзать aspJSON. Либо можно оформить весь механизм работы с сервисом в виде WSC, в котором будет реализован код на JS, а управление и получение данных организовать через экспортируемые методы и свойства в подходящем для VBSсript варианте.

P.S svoboden, обязательно хочу уточнить - совершенно ничего не имею против Вашего подхода. Да, можно делать и так, просто лично мне так не нравится. Поэтому я не написал, что "нельзя" / "карается законом" / "побойтесь бога !", а написал лишь - "на JS удобнее". А "неудобно" / "удобно" это часто субъективное понятие. Как говорится - на вкус и цвет...

Передумал переделывать мир. Пашет и так, ну и ладно. Сделаю лучше свой !

9

Re: VBS: Нужна помощь за вознаграждение - Метод POST (REST)

Xameleon, +++!

10

Re: VBS: Нужна помощь за вознаграждение - Метод POST (REST)

alexii, благодарю за поддержку Делаю вывод, что я не одинок в своём видении ситуации.

Передумал переделывать мир. Пашет и так, ну и ладно. Сделаю лучше свой !

11

Re: VBS: Нужна помощь за вознаграждение - Метод POST (REST)

Я хоть и не умею толком работать с JScript (все мои JScript — это кривой перевод с VBScript), но отчётливо понимаю, что выбор этого средства для работы с JSON наиболее оптимален.

12

Re: VBS: Нужна помощь за вознаграждение - Метод POST (REST)

Xameleon пишет:

2) Что касается десериализации через execScript() / eval() - Вы наверняка не хуже меня знакомы с понятием "небезопасная JSON сериализация/десериализация". Но если вдруг нет - вот несколько ссылок для примера: ссылка 1, ссылка 2, ссылка 3
По этой причине не рискую использовать такой код:

На автохотки есть библиотека для JSON сериализации/десериализации, не используя js.
Наверняка на VBS тоже имеется, ну или при желании можно перевести.
https://github.com/cocobelgica/AutoHotkey-JSON
Правда при большом количестве данных работает медленнее.

13 (изменено: Xameleon, 2021-01-29 11:25:14)

Re: VBS: Нужна помощь за вознаграждение - Метод POST (REST)

Malcev,

Malcev пишет:

Наверняка на VBS тоже имеется, ну или при желании можно перевести.

Конечно имеется ! )

Xameleon пишет:

..... можно заюзать aspJSON.

Есть ещё несколько аналогов, но как Вы правильно заметили:

Malcev пишет:

Правда при большом количестве данных работает медленнее.

И прекрасно понятно почему.

К тому же сборка JSON через такую модель тоже не особо радует.

Пример:

+ открыть спойлер

With oJSON.data

    .Add "familyName", "Smith"                      'Create value
    .Add "familyMembers", oJSON.Collection()

    With oJSON.data("familyMembers")

        .Add 0, oJSON.Collection()                  'Create unnamed object
        With .item(0)
            .Add "firstName", "John"
            .Add "age", 41

            .Add "job", oJSON.Collection()          'Create named object
            With .item("job")
                .Add "function", "Webdeveloper"
                .Add "salary", 70000
            End With
        End With


        .Add 1, oJSON.Collection()
        With .item(1)
            .Add "firstName", "Suzan"
            .Add "age", 38
            .Add "interests", oJSON.Collection()    'Create array
            With .item("interests")
                .Add 0, "Reading"
                .Add 1, "Tennis"
                .Add 2, "Painting"
            End With
        End With

        .Add 2, oJSON.Collection()
        With .item(2)
            .Add "firstName", "John Jr."
            .Add "age", 2.5
        End With

    End With

End With
Передумал переделывать мир. Пашет и так, ну и ладно. Сделаю лучше свой !

14

Re: VBS: Нужна помощь за вознаграждение - Метод POST (REST)

На автоите хороший быстрый парсер перенесли.
https://www.autoitscript.com/forum/topi … n-udf-jsmn
Наверное это был бы оптимальный вариант для языков где парсинг json отсутствует.

15 (изменено: Xameleon, 2021-01-29 13:11:40)

Re: VBS: Нужна помощь за вознаграждение - Метод POST (REST)

Malcev, как я понял, автор топика упирает на использование VBS

svoboden пишет:

Хотелось бы на VBS. Но, думаю, с JS переведу на VBS. Просто в организации у нас VBScript такой неформальный стандарт

Т.е вариант полностью сделать на AUTOIT не совсем подходит, но думаю автор уточнит приоритеты.
А скрестить VBS и AUTOIT, пмсм, будет менее удобно нежели VBS и JS, учитывая, что есть "мостики" в виде WSF / WSC.
Или вы предлагаете какое-то иное решение ?

Передумал переделывать мир. Пашет и так, ну и ладно. Сделаю лучше свой !

16

Re: VBS: Нужна помощь за вознаграждение - Метод POST (REST)

Я имел в виду перенести JSMN на vbs.
https://zserge.com/jsmn/

17 (изменено: Xameleon, 2021-01-29 19:00:10)

Re: VBS: Нужна помощь за вознаграждение - Метод POST (REST)

Malcev, а стоит ли игра свеч ? По факту ведь получится ещё один аналог aspJSON ?

Передумал переделывать мир. Пашет и так, ну и ладно. Сделаю лучше свой !

18

Re: VBS: Нужна помощь за вознаграждение - Метод POST (REST)

Я не знаю, как быстро работает aspJSON.
Но тут он самый быстрый 482 MB/s:
https://lionet.livejournal.com/118853.html

19 (изменено: Xameleon, 2021-01-29 19:34:18)

Re: VBS: Нужна помощь за вознаграждение - Метод POST (REST)

Malcev, тоже бенчмарки aspJSON не проверял, но если разбираться, то он написан на чистом VBS. Для создания похожей модели JS-ных объектов и массивов используется Scripting.Dictionary. Парсинг текста делается встроенными функциями Instr / Left / Right / Mid. И тут чудес особо не придумаешь, как мне кажется.
Поэтому "вангую", что если сесть писать аналог на VBS, то получится опять же нечто похожее aspJSON.

Передумал переделывать мир. Пашет и так, ну и ладно. Сделаю лучше свой !

20 (изменено: Malcev, 2021-01-29 19:48:07)

Re: VBS: Нужна помощь за вознаграждение - Метод POST (REST)

Я имел в виду создать машинный код и его уже вызывать из VBS.
Точнее и создавать не надо, а достаточно скопировать из автоит.

21 (изменено: Xameleon, 2021-01-29 19:49:10)

Re: VBS: Нужна помощь за вознаграждение - Метод POST (REST)

Malcev, озадачен. Т.е разработать свой COM объект и в нём реализовать всю эту механику ?

Передумал переделывать мир. Пашет и так, ну и ладно. Сделаю лучше свой !

22

Re: VBS: Нужна помощь за вознаграждение - Метод POST (REST)

Так вроде же YMP уже создал DynamicWrapperX.

23

Re: VBS: Нужна помощь за вознаграждение - Метод POST (REST)

Malcev, понял ход ваших мыслей. Непростая затея. Но это уже в любом случае и разработка и использование сторонних COM. Мне кажется слишком затратно по ресурсам.

Передумал переделывать мир. Пашет и так, ну и ладно. Сделаю лучше свой !

24 (изменено: svoboden, 2021-02-01 19:36:45)

Re: VBS: Нужна помощь за вознаграждение - Метод POST (REST)

Xameleon пишет:

как я понял, автор топика упирает на использование VBS

svoboden пишет:
Хотелось бы на VBS. Но, думаю, с JS переведу на VBS. Просто в организации у нас VBScript такой неформальный стандарт

Xameleon, так не я автор вопроса.

25

Re: VBS: Нужна помощь за вознаграждение - Метод POST (REST)

Malcev пишет:

Я имел в виду создать машинный код

На AutoIt? Так там по факту только скрипт и интерпретатор в одном флаконе.

26

Re: VBS: Нужна помощь за вознаграждение - Метод POST (REST)

Нет. Компилируем из С в машинный код, после чего получаем строку, которую загружаем через DynamicWrapperX.
На автохотки и на автоите можно загружать напрямую.

27 (изменено: alexii, 2021-01-30 02:03:57)

Re: VBS: Нужна помощь за вознаграждение - Метод POST (REST)

А… Понял. На C.

28

Re: VBS: Нужна помощь за вознаграждение - Метод POST (REST)

svoboden пишет:
Xameleon пишет:

как я понял, автор топика упирает на использование VBS

svoboden пишет:
Хотелось бы на VBS. Но, думаю, с JS переведу на VBS. Просто в организации у нас VBScript такой неформальный стандарт

Xameleon, так не я автор вопроса .

Пардоньте. При цитировании не тот никнейм копипастнул. )

Передумал переделывать мир. Пашет и так, ну и ладно. Сделаю лучше свой !

29

Re: VBS: Нужна помощь за вознаграждение - Метод POST (REST)

Кстати если забить на старые версии виндовса, то еще через uwp api можно.
https://docs.microsoft.com/en-us/uwp/ap … inrt-19041

30

Re: VBS: Нужна помощь за вознаграждение - Метод POST (REST)

Xameleon пишет:

Доверяю библиотеке json2.js либо методам встроенного объекта JSON

Спасибо за ссылку.
В принципе тогда можно еще проще - пропускать через ренулярку json перед тем как запускать eval через htmlfile.

31 (изменено: Malcev, 2021-02-10 04:08:52)

Re: VBS: Нужна помощь за вознаграждение - Метод POST (REST)

Xameleon, а чтобы избежать эксплойта при js.eval, может просто достаточно удалить объекты из js перед выполнением eval?

JS.("delete ActiveXObject; delete GetObject;")

32 (изменено: Xameleon, 2021-02-10 13:18:56)

Re: VBS: Нужна помощь за вознаграждение - Метод POST (REST)

Malcev, ага, а потом удалить document и window ? )

Ведь можно...


var e = document.createElement('object')
e.classid = '....'
document.appendChild(e);

а ещё можно


window.navigate(...)

И нельзя сбрасывать со счетов встроенный XMLHttpRequest.

И даже при вызове delete, встроенные объекты остаются видимыми в функции закрытого скоупа, если не ошибаюсь.

В общем не всё так просто, как хотелось бы.

В принципе, наверно можно все их попрятать через создание функции


var f = new function('document','window','navigator',code)
f();

Но всё равно как-то неаккуратненько выходит.

Передумал переделывать мир. Пашет и так, ну и ладно. Сделаю лучше свой !

33

Re: VBS: Нужна помощь за вознаграждение - Метод POST (REST)

Xameleon
Правильно я понимаю, чтобы словить что-то из текста, нужно запустить его, как код через eval? Тогда в случае JSON использование JSON.parse вместо eval решает проблему вредоносного содержимого?

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

34 (изменено: Xameleon, 2021-02-10 14:45:49)

Re: VBS: Нужна помощь за вознаграждение - Метод POST (REST)

teadrinker, приветствую ! Да, именно так. Ну если только внутри метода parse объекта JSON нет критических ошибок, которые можно эксплуатировать различными эксплойтами. Проще говоря - шанс "поймать беду" гораздо ниже.

Передумал переделывать мир. Пашет и так, ну и ладно. Сделаю лучше свой !

35

Re: VBS: Нужна помощь за вознаграждение - Метод POST (REST)

Понятно, спасибо.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder