WebRequest Post запрос на сайт

 

Добрый день, пытаюсь отправить POST запрос на сайт investing.com, используя такие параметры

   int    res;
   char   data[];
   string sites="https://www.investing.com/economic-calendar/Service/getCalendarFilteredData";
   string params="country[]:25\r\ntimeZone:8\r\ntimeFilter:timeRemain\r\ncurrentTab:today\r\nlimit_from:0\r\n";
   string headers="Accept: */*\r\nAccept-Encoding: gzip, deflate\r\nContent-Length: 400\r\nContent-Type: application/x-www-form-       urlencoded\r\nHost: www.investing.com\r\nUser-Agent: runscope/0.1\r\nX-Requested-With: XMLHttpRequest\r\n";

 res=WebRequest("POST",sites,headers,30000,post,result,result_headers);
   if(res!=200)
     {
      Print("Ошибка передачи файла на сервер #"+(string)res+", LastError="+(string)GetLastError());    
     }

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

Investing.com - Stock Market Quotes & Financial News
Investing.com - Stock Market Quotes & Financial News
  • www.investing.com
Dow under pressure as industrial stocks weigh By Sruthi Shankar (Reuters) - The S&P and the Nasdaq were marginally higher on Monday, while losses in industrial stocks such as General Electric and Boeing...
 

Пожалуйста, предоставьте полную структуру HTTP запроса (с хрома или прокси-снифера - не важно).
Сейчас не ясно конкретно что нужно передать в запросе с MT.

На вскидку, проблема может быть в передаче ненужных и не правдивых данных:

string headers="Accept: */*\r\nAccept-Encoding: gzip, deflate\r\nContent-Length: 400\r\nContent-Type: application/x-www-form-       urlencoded\r\nHost: www.investing.com\r\nUser-Agent: runscope/0.1\r\nX-Requested-With: XMLHttpRequest\r\n";

 
Sergey Dzyublik:

Пожалуйста, предоставьте полную структуру HTTP запроса (с хрома или прокси-снифера - не важно).
Сейчас не ясно конкретно что нужно передать в запросе с MT.

На вскидку, проблема может быть в передаче ненужных и не правдивых данных:

Через сайт https://www.hurl.it/ отправляю такие данные:

HEADERS

Accept: */*

Accept-Encoding: gzip, deflate

Content-Length: 349

Content-Type: application/x-www-form-urlencoded

Host: ru.investing.com

User-Agent: runscope/0.1

X-Requested-With: XMLHttpRequest


BODY
country
%5B%5D=25&country%5B%5D=4&country%5B%5D=17&country%5B%5D=39&country%5B%5D=72&country%5B%5D=26&country%5B%5D=10&country%5B%5D=6&country%5B%5D=37&country%5B%5D=43&country%5B%5D=56&country%5B%5D=36&country%5B%5D=5&country%5B%5D=61&country%5B%5D=22&country%5B%5D=12&country%5B%5D=35&timeZone=18&timeFilter=timeRemain&currentTab=today&limit_from=0
PARAMETERS

country[]: 25

country[]: 4

country[]: 17

country[]: 39

country[]: 72

country[]: 26

country[]: 10

country[]: 6

country[]: 37

country[]: 43

country[]: 56

country[]: 36

country[]: 5

country[]: 61

country[]: 22

country[]: 12

country[]: 35

currentTab: today

limit_from: 0

timeFilter: timeRemain

timeZone: 18


А при POST запросе с сайта, на сервер отправляется такой вот Request Header

POST /economic-calendar/Service/getCalendarFilteredData HTTP/1.1

Host: ru.investing.com

Connection: keep-alive

Content-Length: 349 Accept: */*

Origin: https://ru.investing.com

X-Requested-With: XMLHttpRequest

User-Agent: Mozilla/5.0 (Windows NT 6.1; Win64; x64)

AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36

Content-Type: application/x-www-form-urlencoded

Referer: https://ru.investing.com/economic-calendar/

Accept-Encoding: gzip, deflate,

br Accept-Language: ru-RU,ru;q=0.9,en-US;q=0.8,en;q=0.7

Cookie: adBlockerNewUserDomains=1505218236; travelDistance=4; adbBLk=7; PHPSESSID=h3u92hvij5jpm58jfporupi9b7; geoC=RU; StickySession=id.88899098863.312ru.investing.com; gtmFired=OK; billboardCounter_7=2; nyxDorf=OTUwYmEpP2I%2FYD0wYC00NDJgZThjejU2NzdmZQ%3D%3D

Параметры == body

У себя для быстрой проверки сократил параметры и проверял c меньшим количеством выгружаемых данных и вставлял только три хидера (X-Requested-With, Host, Content-Type). Последний вариант, это уже проверка на остальные варианты, так как программа не выводит ошибку и сложно отловить где я и что делаю не правильно. Если ничего не получится, буду смотреть через Fidler. 

Investing.com - котировки и финансовые новости
Investing.com - котировки и финансовые новости
  • ru.investing.com
Полюс видит для себя серьезные риски в случае новых санкций ... МОСКВА (Рейтер) - Крупнейшая золотодобывающая компания России Полюс предупредила о существенных последствиях для своего бизнеса и финансового состояния...
 
Sergey Dzyublik:

Пожалуйста, предоставьте полную структуру HTTP запроса (с хрома или прокси-снифера - не важно).
Сейчас не ясно конкретно что нужно передать в запросе с MT.

На вскидку, проблема может быть в передаче ненужных и не правдивых данных:

Fidler работает вот с этим значениями и выводит адекватный ответ:

Header

Accept: */*
Accept-Encoding: gzip, deflate
Content-Length: 400
Content-Type: application/x-www-form-urlencoded
Host: www.investing.com
User-Agent: runscope/0.1
X-Requested-With: XMLHttpRequest

Request body


country%5B%5D=25&country%5B%5D=32&country%5B%5D=6&country%5B%5D=37&country%5B%5D=72&country%5B%5D=22&country%5B%5D=17&country%5B%5D=39&country%5B%5D=14&country%5B%5D=10&country%5B%5D=35&country%5B%5D=43&country%5B%5D=56&country%5B%5D=36&country%5B%5D=110&country%5B%5D=11&country%5B%5D=26&country%5B%5D=12&country%5B%5D=4&country%5B%5D=5&timeZone=8&timeFilter=timeRemain&currentTab=today&limit_from=0

POST https://www.investing.com/economic-calendar/Service/getCalendarFilteredData HTTP/1.1
Перепробовал уже уйму вариантов но никак не могу отправить правильно данные с запросом, постоянно вываливается с ошибкой...
Investing.com - Stock Market Quotes & Financial News
Investing.com - Stock Market Quotes & Financial News
  • www.investing.com
S&P, Dow open flat as trade concerns loom (Reuters) - The S&P and the Dow opened little changed on Tuesday as U.S. President Donald Trump's move to impose steep import tariffs sparked concerns about...
 

В первом посту вы привели абсолютно не компилируемый код.
Каждый, кто захочет вам помогать должен тратить время на то, что бы просто откомпелировать его.
И, о чудо, после компиляции окажется что все работает.

1. Убедитесь, что вы добавили сайт https://www.investing.com/ в настройках МТ в список разрешенных.
2. Рабочий код:

   string url="https://www.investing.com/economic-calendar/Service/getCalendarFilteredData";
   string headers="X-Requested-With: XMLHttpRequest\r\nContent-Type: application/x-www-form- urlencoded";
   string params="country[]:25\r\ntimeZone:8\r\ntimeFilter:timeRemain\r\ncurrentTab:today\r\nlimit_from:0\r\n";
   
   char data[];
   StringToCharArray(params, data, 0, StringLen(params)-1);

   char result[];
   string result_headers;
   int res=WebRequest("POST", url, headers, 30000, data, result, result_headers);

   if(res!=200){
      Print("Ошибка передачи файла на сервер #"+(string)res+", LastError="+(string)GetLastError());     
   }
   else{
     Print(ArraySize(result));   
   }


3. Кусок ответа:

{"data":"<tr>      <td colspan=\"9\" class=\"theDay\" id=\"theDay1516665600\">Tuesday, January 23, 2018<\/td>    <\/tr>    <tr id=\"eventRowId_360123\" class=\"js-event-item \" event_attr_ID=\"1112\" data-event-datetime=\"2018\/01\/23 00:00:00\">      <td class=\"first left time js-time\"  title=\"\">00:00<\/td>      <td class=\"left flagCur noWrap\"><span title=\"Singapore\" class=\"ceFlags Singapore\" data-img_key=\"Singapore\">&nbsp;<\/span> SGD<\/td>      <td class=\"left textNum sentiment noWrap\" title=\"Moderate Volatility Expected\" data-img_key=\"bull2\"><i class=\"grayFullBullishIcon\"><\/i><i class=\"grayFullBullishIcon\"><\/i><i class=\"grayEmptyBullishIcon\"><\/i><\/td>      <td class=\"left event\" title=\"Click to view more info on CPI\"><a href=\"\/economic-calendar\/singaporean-cpi-1112\" target=\"_blank\">      CPI (YoY)  (Dec)<\/a>      <\/td>      <td class=\"bold act redFont event-360123-actual\" title=\"Worse Than Expected\" id=\"eventActual_360123\">0.4%<\/td>      <td class=\"fore  event-360123-forecast \" id=\"eventForecast_360123\">0.6%<\/td>      <td class=\"prev blackFont  event-360123-previous\" id=\"eventPrevious_360123\"><span title=\"\">0.6%<\/span><\/td>            <td class=\"alert js-injected-user-alert-container \"  data-name =\"CPI\" data-event-id=\"1112\" data-status-enabled=\"0\">        <span class=\"alertBellGrayPlus genToolTip oneliner\" data-tooltip=\"Create Alert\" data-tooltip-alt=\"Alert is active\"><\/span>    <\/td>    <\/tr>    <tr id=\"eventRowId_361209\" class=\"js-event-item \" event_attr_ID=\"370\" data-event-datetime=\"2018\/01\/23 01:30:00\">      <td class=\"first left time js-time\"  title=\"\">01:30<\/td>      <td class=\"left flagCur noWrap\"><span title=\"Japan\" class=\"ceFlags Japan\" data-img_key=\"Japan\">&nbsp;<\/span> JPY<\/td>      <td class=\"left textNum sentiment noWrap\" ........................



4. Сам сайт https://www.investing.com/ как-то кривовато написан, в частности работает только с неверным значением Content-Type
Не исключено, что со временем из-за исправлений на сайте данный код перестанет работать.




 
Sergey Dzyublik:

В первом посту вы привели абсолютно не компилируемый код.
Каждый, кто захочет вам помогать должен тратить время на то, что бы просто откомпелировать его.
И, о чудо, после компиляции окажется что все работает.

1. Убедитесь, что вы добавили сайт https://www.investing.com/ в настройках МТ в список разрешенных.
2. Рабочий код:

3. Кусок ответа:

4. Сам сайт https://www.investing.com/ как-то кривовато написан, в частности работает только с неверным значением Content-Type
Не исключено, что со временем из-за исправлений на сайте данный код перестанет работать.

Спасибо за развернутый ответ!

Я извиняюсь что дал по видимому не правильные данные,  так как тестировал webrequest и искал способы таки отправить этот запрос.

Вот эта строчка неоднозначно описана в мануале, она в основном и нужна была. 

StringToCharArray(params, data, 0, StringLen(params)-1);

 Благодарю за помощь

 
Sergey Dzyublik:

Добрый день, возникла еще одна не большая проблема, параметры которые вы предложили вводить, не подходят, даже у вас на примере отображается Сингапур а должна быть Австралия. Как я понимаю параметры WebRequest вообще не хочет видеть и передает стандартное сообщение при входе на сайт. Я пробовал уже вводить в таком виде с добавлением \r\n все равно та же ситуация. Подскажите пожалуйста как это можно исправить? С Fidler и https://www.hurl.it/ все работает на стандартных параметрах

country%5B%5D=25&timeZone=8&timeFilter=timeRemain&currentTab=tomorrow&limit_from=0
Hurl.it - Make HTTP requests
  • www.hurl.it
Check uptime and performance of your APIs from around the world or behind your firewall. Get notified of downtime before your customers complain.
 

1) Content-Type должен соответствовать формату разделения данных в POST запросе.
2) В предложенном варианте решения была допущена ошибка:

StringToCharArray(params, data, 0, StringLen(params)-1);  // Number of array elements to copy



Рабочий вариант:

   string url="https://www.investing.com/economic-calendar/Service/getCalendarFilteredData";
   string headers="X-Requested-With: XMLHttpRequest\r\nContent-Type: application/x-www-form-urlencoded";
   string params="country%5B%5D=25&country%5B%5D=4&country%5B%5D=17&country%5B%5D=39&country%5B%5D=72&country%5B%5D=26&country%5B%5D=10&country%5B%5D=6&country%5B%5D=37&country%5B%5D=43&country%5B%5D=56&country%5B%5D=36&country%5B%5D=5&country%5B%5D=61&country%5B%5D=22&country%5B%5D=12&country%5B%5D=35&timeZone=18&timeFilter=timeRemain&currentTab=today&limit_from=0";

   char data[];
   StringToCharArray(params, data);
   ArrayResize(data, ArraySize(data)-1);

   char result[];
   string result_headers;
   int res=WebRequest("POST", url, headers, 30000, data, result, result_headers);

   if(res!=200){
      Print("Ошибка передачи файла на сервер #"+(string)res+", LastError="+(string)GetLastError());     
   }
   else{
     Print(ArraySize(result));   
   }
 
Sergey Dzyublik:

1) Content-Type должен соответствовать формату разделения данных в POST запросе.
2) В предложенном варианте решения была допущена ошибка:

Рабочий вариант:

Спасибо вам, очень помогли. Все отлично работает

Причина обращения: