Страницы: 1
RSS
Отправка POST-запроса через VBA
 
Есть задача выгружать данные в виде файлов с сайта, сайт геренит уникальный ID сессии для выгрузки данных файлов. Есть очень похожая тема и по сути она дает все ответы (http://www.excelworld.ru/forum/10-19904-1), но до ума довести не могу данный вопрос.

благодаря Средствам разработчика IE получил строку ПОСТ запроса, формата:
Код
{“параметр1”:”значение1”,“параметр2”:”значение2”,“параметр3”:null, “параметр4”:123456677}

на который приходит ответ с необходимым ID
Как ее корректно отправить, я не могу разобраться (

Все параметры .SetRequestHeader передаются (тоже взял из средств разработчика)
загвоздка на позиции .send (?)
ошибка:Runtime Error -2147012890 (80072 ee6); Automation error, при отработке данной строки

Подскажите пожалуйста где есть внятное описание как преобразовать полученный запрос и отправить его, что бы получить ответ )
 
попробуйте сделать на основе этого кода, - может, получится
http://excelvba.ru/code/DownloadFileWithAuth
 
Игорь, Завтра попробую на работе, как я понял смыл сводится к тому что бы преобразовать запрос в Юникод:

   ' здесь перечисляем параметры авторизации в формате name1=value1&name2=value2&name3=value3
PostData = "mtklogin=MyLogin&mtkpass=MyPassword"
   POST = StrConv(PostData, vbFromUnicode)

Такого я не пробовал, но подумывал, что скорее всего кодировка запроса не устраивает "ту сторону" )
что касается формата передачи данных то такой вариант пробовался, результат - отрицательный(

мои мысли: с другой стороны  Средства разработчика IE тупо показывают  уже готовый текст запроса который был отправлен и он там читается, понятен и не кодирован, в чем подвох )  
 
Не кодировка , а скорее всего формат.
В Вашем примере это json
 
Doober, поподробнее можно?
да, формат именно json
как корректно отправит запрос в этом формате для меня пока неведомая загадка.
Буду признателен если подскажите или направите.
 
Цитата
zanoza1989 написал:
Средства разработчика IE
Не знаю как вы смотрели, но сделать все можно вполне обычным способом.
В хроме (как и в других браузерах, только в других браузерах в других местах может быть) в самом низу есть пункт Form Data. Вот там выбираете View Source и этот самый source копируете в текст payload'а.
Вот например текст для запоминания введенного текста на планете (view parsed в хроме):
autosave_id:21f6e6465711e8078a47bd3c1857d1550
form_data[PAGE_NAME]:read
form_data[FID]:1
form_data[TID]:96058
form_data[MID]:0
form_data[MESSAGE_TYPE]:REPLY
form_data[AUTHOR_ID]:
form_data[forum_post_action]:save
form_data[MESSAGE_MODE]:NORMAL
form_data[POST_MESSAGE]:
form_data[hidden_focus]:
form_data[USE_SMILES]:Y
form_data[TOPIC_SUBSCRIBE]:
form_data[send_button]:
form_data[view_button]:

А вот то же, только кодированное (без кавычек) - view source в хроме:
Скрытый текст
Изменено: Все_просто - 20.09.2017 21:58:38
С уважением,
Федор/Все_просто
 

Здравствуйте, отправляю запрос post, копирую заголовки и тело запроса из firefox,  в ответе получаю ошибка 511 отказано в доступе. "{"error":{"err_code":511,"err_desc":"Sign access denied"},"data":null}", а лиса получает все данные

Код
Set HTTP = CreateObject("MSXML2.XMLHTTP")
'Set HTTP = CreateObject("WinHttp.WinHttpRequest.5.1")
sURL1 = "http://new.d64f23.olimpb24d.gdn/api/slice/"
'POST /api/slice/ HTTP/1.1
HTTP.Open "POST", sURL1, False
HTTP.SetRequestHeader "Host", "new.d64f23.olimpb24d.gdn"
'Host: new.3f21c8.olimpb24d.gdn
HTTP.SetRequestHeader "User-Agent", "Mozilla/5.0 (Windows NT 5.1; rv:52.0) Gecko/20100101 Firefox/52.0"
'User-Agent: Mozilla/5.0 (Windows NT 5.1; rv:52.0) Gecko/20100101 Firefox/52.0
HTTP.SetRequestHeader "Accept", "*/*"
'Accept: */*
HTTP.SetRequestHeader "Accept-Language", "ru-RU,ru;q=0.8,en-US;q=0.5,en;q=0.3"
'Accept-Language: ru-RU,ru;q=0.8,en-US;q=0.5,en;q=0.3
HTTP.SetRequestHeader "Accept -Encoding", "gzip , deflate"
'Accept -Encoding: gzip , deflate
HTTP.SetRequestHeader "X -Token", "def96c3189252fd655c41c9b62d47752"
'X -Token: def96c3189252fd655c41c9b62d47752
HTTP.SetRequestHeader "Content-Type", "application/json"
'Content-Type: application/json
HTTP.SetRequestHeader "Referer", "http://new.3f21c8.olimpb24d.gdn/?utm_medium=zerkalo&utm_source=emailbot"
'Referer: http://new.3f21c8.olimpb24d.gdn/?utm_medium=zerkalo&utm_source=emailbot
HTTP.SetRequestHeader "Content-Length", "63"
'Content-Length: 63
HTTP.SetRequestHeader "Cookie", "_ym_uid=1508951902624815638; _ga=GA1.4.1576018127.1508951902; _gid=GA1.4.619746481.1508951902; UKEY=240bc1a8-0953-4723-aadd-a87655e26b64; LNGID=0; LNG_ISO=ru; _ym_isad=2; __lc.visitor_id.g6897171_2.group2=S1506754199.942c6daab8; __lc.visitor_id.g6897171_2.group2=S1506754199.942c6daab8; _ym_visorc_43611274=w; lc_window_state.group2=minimized; lc_window_state.group2=minimized"
'Cookie: _ym_uid=1508951902624815638; _ga=GA1.4.1576018127.1508951902; _gid=GA1.4.619746481.1508951902; UKEY=240bc1a8-0953-4723-aadd-a87655e26b64; LNGID=0; LNG_ISO=ru; _ym_isad=2; __lc.visitor_id.g6897171_2.group2=S1506754199.942c6daab8; __lc.visitor_id.g6897171_2.group2=S1506754199.942c6daab8; _ym_visorc_43611274=w; lc_window_state.group2=minimized; lc_window_state.group2=minimized
HTTP.SetRequestHeader "Connection:", "keep -alive"
'Connection: keep -alive
MSG = "{" & Chr(34) & "live" & Chr(34) & ":" & Chr(34) & "1" & Chr(34) & "," & Chr(34) & "time_shift" & Chr(34) & ":0," & Chr(34) & "lang_id" & Chr(34) & ":" & Chr(34) & "0" & Chr(34) & "," & Chr(34) & "platforma" & Chr(34) & ":" & Chr(34) & "SITE_RU" & Chr(34) & "}"
HTTP.send MSG
otvet = HTTP.responseTex
 

Изменено: Farafonov - 26.10.2017 08:22:48
 
zanoza1989 и Farafonov,  - это один и тот же человек?
Быть может, лучше сделать запрос в C#? Там есть замечательная библиотека JSON.NET для работы с JSON.
There is no knowledge that is not power
 
Нет это разные люди, спасибо сейчас погуглю, но всеже почему лиса получает ответ со всеми данными, а мне отказано, понятно что что-то не так, но в какую сторону искать.
 
Доброго времени суток, Мы разные, точно )
Свою проблему я решил простым методом научного тыка, помощью средств разработчика посмотрел какие параметры передаются в заголовке пост запроса и в самом запросе, скопировал всё это добро и начал исключать по очереди часть данных, и через н-ое количество раз - о чудо получил ответ.
Кстати нужно обязательно в сам запрос перекодировать в нужный язык который вы передаете  в заголовке.  
 
Я сравнил запросы Fiddler Web Debugger, оказалось, что мои запросы отличаются от запросов Firefox наличием Cookies, их просто нет, сейчас бьюсь над тем как их добавить, отправляю запрос вручную и все получается.
 
Вообщем если кому интересно или возможно пригодится исследователям в будущем. Сам запрос POST  я брал из отладчика Firefox F12, там в закладке сеть можно посмотрть все запросы и ответы сервера. Есть еще возможность "измнить и отправить", отуда я взял все заголовки и тело запроса. Далее ничего не получалось и я использовал Fiddler Web Debugger для сравнения моего и лисиного запроса, оказалось что мое приложение не отправляет часть заголовков, добавилась еще ночь гугленияи перебора вариантов, в итоге, что со мной уже не в первый раз, нужно было удалить лишние побелы и двоеточие. Добавляю код для ознакомления URL обновляется раз в сутки поэтому данный конкретный приме работать не будет нужно буде подставить свои параметры запроса.
Код
Set HTTP = CreateObject("MSXML2.XMLHTTP")
sURL1 = "http://new.7b4c5a.olimp9b55.gdn/api/slice/"
HTTP.Open "POST", sURL1, False
HTTP.SetRequestHeader "Host", "new.7b4c5a.olimp9b55.gdn"
HTTP.SetRequestHeader "User-Agent", "Mozilla/5.0 (Windows NT 5.1; rv:52.0) Gecko/20100101 Firefox/52.0"
HTTP.SetRequestHeader "Accept", "*/*"
HTTP.SetRequestHeader "Accept-Language", "ru-RU,ru;q=0.8,en-US;q=0.5,en;q=0.3"
HTTP.SetRequestHeader "Accept-Encoding", "gzip , deflate"
HTTP.SetRequestHeader "X-Token", "def96c3189252fd655c41c9b62d47752"
HTTP.SetRequestHeader "Content-Type", "application/json"
HTTP.SetRequestHeader "Referer", " http://new.7b4c5a.olimp9b55.gdn/?utm_medium=zerkalo&utm_source=emailbot"
HTTP.SetRequestHeader "Content-Length", "63"
HTTP.SetRequestHeader "Cookie", "__ga=GA1.4.456166197.1509038006; _gid=GA1.4.1925683772.1509038006; _ym_uid=1509038006108342172; _ym_isad=2; UKEY=9c7ff6ba-ec7d-4cf5-a201-b37739b9ef4b; LNGID=0; LNG_ISO=ru; _ym_visorc_43611274=w; __lc.visitor_id.g6897171_2.group2=S1506754199.942c6daab8; __lc.visitor_id.g6897171_2.group2=S1506754199.942c6daab8; lc_window_state.group2=minimized; lc_window_state.group2=minimized\r\n"
HTTP.SetRequestHeader "Connection", "keep-alive"
MSG = "{" & Chr(34) & "live" & Chr(34) & ":" & Chr(34) & "1" & Chr(34) & "," & Chr(34) & "time_shift" & Chr(34) & ":0," & Chr(34) & "lang_id" & Chr(34) & ":" & Chr(34) & "0" & Chr(34) & "," & Chr(34) & "platforma" & Chr(34) & ":" & Chr(34) & "SITE_RU" & Chr(34) & "}"
HTTP.send MSG
otvet = HTTP.responseText
Страницы: 1
Наверх