WebRequest и данные с внешнего сайта

 

Коллеги, помогите решить проблему.

Похож не верно формирую запрос в WebRequest.

Задача используя APi  получать данные для дальнейшей обработки.

Логиниться получается, а вот при попытке забрать ответ с данными получаю Invalid session



//+------------------------------------------------------------------+
//|                                                   isentiment.mq4 |
//|                                        Copyright 2017, Roman Zif |
//|                                           https://profxtrader.ru |
//+------------------------------------------------------------------+
#property copyright "Copyright 2017, Roman Zif"
#property link      "https://profxtrader.ru"
#property version   "1.00"
#property strict

string   Email       =  "";
string   Password    =  "";
string   Session     =  "";

string cookie=NULL,headers, urllogin="";
char post[],result[];
int res, timeout = 5000;
string   auth;
string urloutlook = "";

//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
{

   return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{

   
}
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
{
   if (Volume[0] > 1) return;
   
   string access="email="+Email+"&password="+Password;

   ResetLastError();
   res = WebRequest("GET", urllogin + access, cookie, NULL, timeout, post, 0, result, headers);
   
   if (res == -1) printf("Ошибка авторизации #"+(string)res+", LastError="+(string)GetLastError());
   else printf("Залогинились!"); 
   
   res = StringFind(headers,"Set-Cookie: JSESSIONID=");
   
   auth = StringSubstr(headers, res+23);
   auth = StringSubstr(auth,0,StringFind(auth,";"));

   ResetLastError();
   res = WebRequest("GET", urloutlook+auth, cookie, NULL, timeout, post, 0, result, headers);
   
   if (res  == -1) printf("Ошибка  #"+(string)res+", LastError="+(string)GetLastError());
   else printf(CharArrayToString(result));


}
//+------------------------------------------------------------------+
 

Возвращаемое значение
Код ответа HTTP-сервера либо -1 в случае ошибки.

Проверьте что возвращает сервер.
не -1, не значит Залогинились.

 
Taras Slobodyanik:

Возвращаемое значение
Код ответа HTTP-сервера либо -1 в случае ошибки.

Проверьте что возвращает сервер.
не -1, не значит Залогинились.


после первого запроса возвращает 200

после второго тоже 200, а в result возвращает:  {"error":true,"message":"Invalid session.","symbols":[],"general":{}}

 
Taras Slobodyanik:

Возвращаемое значение
Код ответа HTTP-сервера либо -1 в случае ошибки.

Проверьте что возвращает сервер.
не -1, не значит Залогинились.


вот что в headers возвращает после отправки запроса на логин:


HTTP/1.1 200 OK
Date: Tue, 26 Sep 2017 22:40:00 GMT
Server: Apache-Coyote/1.1
Content-Length: 43
Set-Cookie: JSESSIONID=1AD7595FA376DDC9CE808A672782E51A; Path=/; HttpOnly
Cache-Control: max-age=2592000
Expires: Thu, 26 Oct 2017 22:40:01 GMT
Vary: Accept-Encoding
Keep-Alive: timeout=10, max=100
Connection: Keep-Alive
Content-Type: application/json


 
Roman Meskhidze:

вот что в headers возвращает после отправки запроса на логин:


во вторую запрос попробуйте передать идентификатор который получаете в первом

у некоторых сайтов при первой авторизации создаётся переменная идентификатор сессии. смотрите всю выдачу после авторизации

 
Alexandr Gavrilin:
во вторую запрос попробуйте передать идентификатор который получаете в первом

у некоторых сайтов при первой авторизации создаётся переменная идентификатор сессии. смотрите всю выдачу после авторизации


Имеете ввиду куки?

Я пробовал вот так

res = WebRequest("GET", urloutlook+auth, auth, NULL, timeout, post, 0, result, headers);

эффект такой же 

 
Roman Meskhidze:

А так?

cookie = "Cookie: JSESSIONID=" + auth;
res = WebRequest("GET", urloutlook+auth, cookie, NULL, timeout, post, 0, result, headers);
 
Комбинатор:

А так?


к сожалению в result тот же результат:

 {"error":true,"message":"Invalid session.","symbols":[],"general":{}}


при этом в res 200 OK

в headers 

2017.09.27 22:00:00.933 isentiment EURUSD,H1: HTTP/1.1 200 OK

Date: Thu, 28 Sep 2017 02:00:00 GMT

Server: Apache-Coyote/1.1

Content-Type: application/json;charset=utf-8

Content-Length: 71

Vary: Accept-Encoding

Set-Cookie: JSESSIONID=71A53CAA9C38DB0C050996402C8D58C4; Path=/; HttpOnly

Set-Cookie: locale=en; Domain=.myfxbook.com; Expires=Wed, 27-Dec-2017 02:00:00 GMT; Path=/

Cache-Control: max-age=2592000

Expires: Sat, 28 Oct 2017 02:00:00 GMT

Keep-Alive: timeout=10, max=100

Connection: Keep-Alive


не понимаю что не так (((

 
string   Email       =  "";
string   Password    =  "";

string headers, urllogin="";
char data[], result[];
int res, timeout = 5000;
string urloutlook = "";

void OnStart()
{
   string access="?email="+Email+"&password="+Password;

   res = WebRequest("GET", urllogin + access, NULL, NULL, timeout, data, 0, result, headers);
   
   string login = CharArrayToString(result);
   res = StringFind(login, "<session>");
   login = StringSubstr(login, res + 9);
   login = StringSubstr(login, 0, StringFind(login, "</session>"));
   
   res = WebRequest("GET", urloutlook + "?session=" + login, NULL, NULL, timeout, data, 0, result, headers);

   string response = CharArrayToString(result);
   Print("response = \"" + response + "\"");
}
вот рабочий код
 
Комбинатор:
вот рабочий код

Спасибо огромное, ошибки теперь нет, но  почему-то response пустой возвращается.


P.S. Кстати странно, что мой код не работает, ведь я тоже вырезал SESSION и вручную проверял вырезал правильно.

в моем случае 

urloutlook = "___.myfxbook.com/api/get-community-outlook.json?session=";

ваш вариант 

"___.myfxbook.com/api/get-community-outlook.json";
 
Roman Meskhidze:

Вы вырезали сессию из куков, она отличается от сессии, передаваемой в ответе.

А то что ответ нулевой странно, у меня ответ был вроде аж 60кб, правда я пробовал на xml, а не json

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