Вопрос про API

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
kibernetics
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 846
Зарегистрирован: 03.05.2006 (Ср) 13:31
Откуда: Minsk

Вопрос про API

Сообщение kibernetics » 17.03.2017 (Пт) 13:30

Встала необходимость с энным порталом работать через их API.
И дилемма, средствами VB это сделать можно/сложно/нельзя?

Каков вообще механизм взаимодействия/обмена с их сервером?

alibek
Большой Человек
Большой Человек
 
Сообщения: 14069
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Re: Вопрос про API

Сообщение alibek » 17.03.2017 (Пт) 13:59

Это невозможно сказать, не увидев API.
Но обычно API создается для того, чтобы им могли пользоваться.
Lasciate ogni speranza, voi ch'entrate.

kibernetics
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 846
Зарегистрирован: 03.05.2006 (Ср) 13:31
Откуда: Minsk

Re: Вопрос про API

Сообщение kibernetics » 17.03.2017 (Пт) 19:46

Последний раз редактировалось kibernetics 20.03.2017 (Пн) 14:54, всего редактировалось 1 раз.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16004
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Вопрос про API

Сообщение Хакер » 18.03.2017 (Сб) 1:00

Ну, WinHTTP или XHR тебе в помощь. Отправляй с помощью них любой запрос, соответствующий описанным в документации на API, и получает соответстветственный ответ.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

The trick
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 488
Зарегистрирован: 26.06.2010 (Сб) 23:08
Откуда: Астрахань

Re: Вопрос про API

Сообщение The trick » 18.03.2017 (Сб) 1:50

Небольшой пример использования средств API.AI для распознавания голосовых команд.
https://www.youtube.com/watch?v=2Kygm_OAtC4
Вложения
API_AI.zip
(12.88 Кб) Скачиваний: 18
Анатолий Кривоус | http://vk.com/thetrick | http://promodj.com/Thetrik

kibernetics
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 846
Зарегистрирован: 03.05.2006 (Ср) 13:31
Откуда: Minsk

Re: Вопрос про API

Сообщение kibernetics » 18.03.2017 (Сб) 3:11

Ндаа, поковырялся, но реально тяжеловато что-то разрулить :(
Вот ещё пример нашёл
Integrate_443922015.zip
(305.62 Кб) Скачиваний: 8

тоже пока безрезультатно, там столько всего конечно, это не просто SessionID и SecretKey...

kibernetics
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 846
Зарегистрирован: 03.05.2006 (Ср) 13:31
Откуда: Minsk

Re: Вопрос про API

Сообщение kibernetics » 19.03.2017 (Вс) 2:29

Кстати, прикольная тема, что The trick выложил.
ALX_2002, глянь, интересная штука.

kibernetics
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 846
Зарегистрирован: 03.05.2006 (Ср) 13:31
Откуда: Minsk

Re: Вопрос про API

Сообщение kibernetics » 19.03.2017 (Вс) 13:24

Так, по своему вопросу, я практически его закрыл, но вопросик остался...
В общем, взял XHR. На том конце используется в качестве запроса PUT.
Я в PUT передаю кусок текстовых данных. Можно ли опрашивать XHR в это время, чтобы знать сколько уже отправлено данных?
Некий прогресс-бар повесить.

П.С. вот что я понаходил в инете:
Запрос XMLHttpRequest состоит из двух фаз:
Стадия закачки (upload). На ней данные загружаются на сервер. Эта фаза может быть долгой для POST-запросов. Для отслеживания прогресса на стадии закачки существует объект типа XMLHttpRequestUpload, доступный как xhr.upload и события на нём.

На стадии закачки для получения информации используем объект xhr.upload. У этого объекта нет методов, он только генерирует события в процессе закачки. А они-то как раз и нужны.
Вот полный список событий:
  • loadstart
  • progress
  • abort
  • error
  • load
  • timeout
  • loadend
Пример установки обработчиков на стадию закачки:
Код: Выделить всё
xhr.upload.onprogress = function(event) {
  alert( 'Загружено на сервер ' + event.loaded + ' байт из ' + event.total );
}

xhr.upload.onload = function() {
  alert( 'Данные полностью загружены на сервер!' );
}

xhr.upload.onerror = function() {
  alert( 'Произошла ошибка при загрузке данных на сервер!' );
}


как в таком коде
Код: Выделить всё
    With webRequest
        .Open "PUT", UPLOAD_CSV, True
        .setRequestHeader "Accept", "application/json"
        .setRequestHeader "Content-Type", "text/csv"
        .send (s)
        Do While .readyState <> 4
            DoEvents
        Loop
    End With

добратся до событий объекта xhr.upload?

ALX_2002
Продвинутый гуру
Продвинутый гуру
 
Сообщения: 1988
Зарегистрирован: 25.11.2002 (Пн) 20:03

Re: Вопрос про API

Сообщение ALX_2002 » 20.03.2017 (Пн) 12:26

Отладочный вариант :wink:
Вложения
prjWHR.zip
(2.16 Кб) Скачиваний: 11

kibernetics
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 846
Зарегистрирован: 03.05.2006 (Ср) 13:31
Откуда: Minsk

Re: Вопрос про API

Сообщение kibernetics » 20.03.2017 (Пн) 14:45

Ооо, спасибо Саш! Вся надежда на тебя сбылась.
А можно использовать объект на позднем связывании?

Т.е. у тебя в коде такая строка:
Код: Выделить всё
Dim WithEvents whr As WinHttp.WinHttpRequest

Её можно переделать на
Код: Выделить всё
Dim WithEvents whr As Object

Код: Выделить всё
Set xh = CreateObject("MSXML2.XMLHTTP")

?

Или на позднем связывании WithEvents не работает?
Или это через класс надо строить?

ALX_2002
Продвинутый гуру
Продвинутый гуру
 
Сообщения: 1988
Зарегистрирован: 25.11.2002 (Пн) 20:03

Re: Вопрос про API

Сообщение ALX_2002 » 20.03.2017 (Пн) 15:28

1) А какова цель позднего связывания ?
2) Есть параметры авторизации для тестов этого API (secretKey и т.п) ? Если есть - можешь в личку закинуть ?

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16004
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Вопрос про API

Сообщение Хакер » 20.03.2017 (Пн) 15:45

kibernetics писал(а):А можно использовать объект на позднем связывании?

Термин «связывание» описывает внутреннюю механику работы кода при осуществлении вызова.

Обработка событий будет тут не причём, если для обработки событий использовать переменную WithEvetns whr as КоКлассССобытийнымИнтерфейсом, а для вызова — As Object. Это будет позднее связывания для вызовов и обработка событий как обычно. Но только смысла в этом почти никакого.WithEvents var As Object конечно не будет работать.

А со споcобом порождения объекта (Createobject против New) тип связывания (раннее или позднее) не коррелирует вообще никак.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

kibernetics
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 846
Зарегистрирован: 03.05.2006 (Ср) 13:31
Откуда: Minsk

Re: Вопрос про API

Сообщение kibernetics » 20.03.2017 (Пн) 18:36

Хакер спасибо что пояснил эти моменты.

ALX_2002 писал(а):1) А какова цель позднего связывания ?
2) Есть параметры авторизации для тестов этого API (secretKey и т.п) ? Если есть - можешь в личку закинуть ?

Там долго всё расписывать как они раздают токены, потом двойная авторизация.... А надо именно над одним действием тест сделать.
Можешь взять за основу пример от трика? Чуть выше по топику.
1. Запусти его проект.
2. Затем, нажми кнопку с записыванием звука, затем ещё раз нажми, вызовется функция SpeechToText (брейк сразу на ней поставь перед стартом проекта) класса clsAPI_AI.
И там ниже по коду есть такой метод:
Код: Выделить всё
' // Send body
    request.send binBody()

т.е. начнётся отправка массива, а он может быть большого размера. И вот тут как прикрепить прогресс отправки?
У трика только надо сделать для теста метод POST асинхронным.

П.С. Только ещё замени в этой же функции:
Set request = New XMLHTTP

на
Код: Выделить всё
Set request = CreateObject("MSXML2.XMLHTTP")


в моём проекте нет референса на раннее связывание, у же трика есть.
А мне необходимо позднее связывание. Не спрашивай, так надо.

ALX_2002
Продвинутый гуру
Продвинутый гуру
 
Сообщения: 1988
Зарегистрирован: 25.11.2002 (Пн) 20:03

Re: Вопрос про API

Сообщение ALX_2002 » 20.03.2017 (Пн) 19:17

1) Ради интереса собрал авторизацию на JavaScript.

А мне необходимо позднее связывание. Не спрашивай, так надо.


2) Не люблю такой подход.

Сразу вспоминаются мемы типа:

Изображение
Изображение

Мне важно знать конечную цель, потому что именно она определяет путь её достижения.

3) Так в итоге задача то какая ??? Нужно с тем АПИ работать, которые были по ссылке или нужно что-то получить из проекта Trick-а ??
Вложения
b2bApiTest.zip
(1.02 Кб) Скачиваний: 13

kibernetics
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 846
Зарегистрирован: 03.05.2006 (Ср) 13:31
Откуда: Minsk

Re: Вопрос про API

Сообщение kibernetics » 20.03.2017 (Пн) 19:38

ALX_2002 писал(а):Мне важно знать конечную цель, потому что именно она определяет путь её достижения.
Весь проект написан на позднем связывании. Это облегчает его транспортировку в походных условиях.


ALX_2002 писал(а):3) Так в итоге задача то какая ??? Нужно с тем АПИ работать, которые были по ссылке или нужно что-то получить из проекта Trick-а ??

Сейчас говорим о проекте The trick'a.
У него через метод POST засылается массив байт. Массив байт большой. Приложение висит пока не отправит, ну скажем, 10 мегабайт.
Как получать статистику, сколько байт передано?

ALX_2002
Продвинутый гуру
Продвинутый гуру
 
Сообщения: 1988
Зарегистрирован: 25.11.2002 (Пн) 20:03

Re: Вопрос про API

Сообщение ALX_2002 » 20.03.2017 (Пн) 19:54

Боюсь с этим сложнее. Предполагаю, что придётся через win api получать id соединения и за счет wsock api мониторить событие отправки данных. Но могу ошибаться.

ALX_2002
Продвинутый гуру
Продвинутый гуру
 
Сообщения: 1988
Зарегистрирован: 25.11.2002 (Пн) 20:03

Re: Вопрос про API

Сообщение ALX_2002 » 21.03.2017 (Вт) 1:20

Немного подумал. Это конечно "грязный код", и Хакер наверняка это не одобрит, но вдруг что-то из этого получится. :roll:
Вложения
prjProgress.zip
(1.29 МиБ) Скачиваний: 13

kibernetics
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 846
Зарегистрирован: 03.05.2006 (Ср) 13:31
Откуда: Minsk

Re: Вопрос про API

Сообщение kibernetics » 21.03.2017 (Вт) 12:27

Спасибо, но не пойдёт. Ты используешь компонент WinBrowser.
а хочется решить именно для XMLHTTP.

Я тоже ищу решение, но, надо заручится мнением Хакер'а, реально ли получить количество отправленных байт за счёт событий генерируемых XHR?
Или нет, чтобы не убивать времени на поиски решения.

Может это не возможно и придётся с этим жить :(. Чего крайне не хотелось бы осознавать.

ALX_2002
Продвинутый гуру
Продвинутый гуру
 
Сообщения: 1988
Зарегистрирован: 25.11.2002 (Пн) 20:03

Re: Вопрос про API

Сообщение ALX_2002 » 21.03.2017 (Вт) 15:54

kibernetics писал(а):Спасибо, но не пойдёт. Ты используешь компонент WinBrowser.
а хочется решить именно для XMLHTTP.


Но так ведь и пример кода:
Код: Выделить всё
xhr.upload.onprogress = function(event) {
  alert( 'Загружено на сервер ' + event.loaded + ' байт из ' + event.total );
}

xhr.upload.onload = function() {
  alert( 'Данные полностью загружены на сервер!' );
}

xhr.upload.onerror = function() {
  alert( 'Произошла ошибка при загрузке данных на сервер!' );
}


взят с https://learn.javascript.ru/xhr-onprogress

И он касается именно браузероной реализации XMLHttpRequest :wink:

Для того, чтобы это работало, объект XMLHTTP должен возвращать свойство "upload" (object.upload). Которое вернёт ссылку на [object XMLHttpRequestUpload].

kibernetics
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 846
Зарегистрирован: 03.05.2006 (Ср) 13:31
Откуда: Minsk

Re: Вопрос про API

Сообщение kibernetics » 21.03.2017 (Вт) 16:29

ALX_2002 писал(а):Для того, чтобы это работало, объект XMLHTTP должен возвращать свойство "upload" (object.upload). Которое вернёт ссылку на [object XMLHttpRequestUpload].

Таки-да, так а как получить это свойство?
На примере для VB6.0. Потому что на javascript у них типа всё ровненько и гладко, а как на visual basic'e так никто толком я смотрю в инете и не описывает.

Teranas
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 86
Зарегистрирован: 13.12.2008 (Сб) 4:26
Откуда: Новосибирск

Re: Вопрос про API

Сообщение Teranas » 21.03.2017 (Вт) 19:47

Вот что нашёл, может поможет :)
Вложения
класс эмуляции отправки формы из VBScript через XmlHttp.7z
класс эмуляции отправки формы
(2.37 Кб) Скачиваний: 8
xmlnews.7z
xmlnews
(12.85 Кб) Скачиваний: 8
С уважением, Андрей.

ALX_2002
Продвинутый гуру
Продвинутый гуру
 
Сообщения: 1988
Зарегистрирован: 25.11.2002 (Пн) 20:03

Re: Вопрос про API

Сообщение ALX_2002 » 21.03.2017 (Вт) 20:18

Teranas, СУПЕР ! )))) Этот класс написан мной. И он тут мало чем поможет :D Но приятно видеть, что кто-то пользуется моей давней заготовкой.

kibernetics, если я правильно понимаю, то надо кастованием получить DispHTMLXMLHttpRequest или XMLHttpRequestEventTarget (о котором упоминает документация https://developer.mozilla.org/en-US/doc ... est/upload) и уже дальше от них плясать. Они в MSHTML имеются. Либо создать MSHTML.Document, получить от него parentWindow и в нём за счёт скрипта получить нужные объекты.

И идти надо, наверное, от MSHTML.HTMLDocument. Но тут явно без знатаков (Хакер-а , The Trick-а) не разобраться. :roll:

P.S И всё-таки не зря в хелпе написано
Мы, для примера, рассмотрим загрузку файла с индикацией прогресса. Это требует от браузера поддержки File API, то есть исключает IE9-.

А значит рассчитывать на поддержку этих фич на "старых форточках" и на ПК со старым IE не приходится. И кстати о вопросе кросдоменности тоже не стоит забывать. XMLHTTP просто так не даст обращаться к чужим ресурсам. Так что думаю это тупиковая ветвь развития темы.

ALX_2002
Продвинутый гуру
Продвинутый гуру
 
Сообщения: 1988
Зарегистрирован: 25.11.2002 (Пн) 20:03

Re: Вопрос про API

Сообщение ALX_2002 » 22.03.2017 (Ср) 18:19

Ещё почитал и подумал и пришёл к выводу, что наиболее логичным вариантом будет использование API, которые предоставляет winhttp.dll - WinHttpConnect, WinHttpOpenRequest, ...

kibernetics
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 846
Зарегистрирован: 03.05.2006 (Ср) 13:31
Откуда: Minsk

Re: Вопрос про API

Сообщение kibernetics » 24.03.2017 (Пт) 13:22

Ну может ты и прав, вот что еще на американском форуме ответили:
The WinHttpRequest object offers better event binding for VB6 use.

MSXML2.XMLHTTP doesn't have events, only callbacks.

А примеры с XMLHttpRequest относятся для новой версии IE. И что их нельзя использовать в VB6.

А можно ли посылать методы во время отправки данных? Т.е. начал асинхронный посыл данных, и в это время еще один POST можно отослать?

ALX_2002
Продвинутый гуру
Продвинутый гуру
 
Сообщения: 1988
Зарегистрирован: 25.11.2002 (Пн) 20:03

Re: Вопрос про API

Сообщение ALX_2002 » 24.03.2017 (Пт) 13:30

Можно, но уже вторым, третьим и т.д экземпляром объекта. Думаю, что это может быть полезным: http://www.vbforums.com/showthread.php? ... ss-wrapper


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: Google-бот и гости: 6

    TopList