Как авторизоваться через WebRequest?

 

Здравствуйте!

 

Мне нужна помощь. 

 

Стоит задача через WebRequest авторизоваться на сайте и скачать файл. Пишут, что надо сниффером сначала посмотреть, что отправляется на сайт, затем делать такой POST-запрос. Сохранять cookies и через них уже закачивать файл с сайта.

 

Для меня это звучит очень сложно. Кто-нибудь может привести код авторизации на безобидный mql5.com в качестве примера?

 

Спасибо! 

 
zaskok:

Здравствуйте!

 

Мне нужна помощь. 

 

Стоит задача через WebRequest авторизоваться на сайте и скачать файл. Пишут, что надо сниффером сначала посмотреть, что отправляется на сайт, затем делать такой POST-запрос. Сохранять cookies и через них уже закачивать файл с сайта.

 

Для меня это звучит очень сложно. Кто-нибудь может привести код авторизации на безобидный mql5.com в качестве примера?

 

Спасибо! 

Мне тоже хотелось бы посмотреть! есть идея но реализовать не могу, из за авторизации
 

Ребята, просто WebRequest не подойдет для этих целей. То есть Вы авторизацию возможно и пройдете одним запросом, но вот следующий запрос уже будет воспринят как новый и снова будет необходима авторизация.

Куки сохранять куда? каждый браузер работает с куками по-своему. Грубо говоря Вам нужно написать свой браузер с поддержкой cookies, javascript и т.п. Оно Вам надо?

Если хотите поэкспериментировать как пользователь, то есть такая софтина iMacros. Она есть для Chrome, Mozilla и т.д. но при этом Вам нужно будет написать скрипт для авторизации и загрузки конкретного файла.

Для программистов же есть PhantomJS. Он содержит в себе браузер и позволяет выполнять логин, и продолжать работу как зарегистрированный юзер.

А WebRequest - только для простых запросов. 

 

вообще то правильный ответ — Сниффером сначала посмотреть, что отправляется на сайт, затем делать такой POST-запрос...

но посмотреть-то нужно вручную а уже потом писать запрос в mql

снифферы простым языком ;) —  https://ru.wikipedia.org/wiki/%D0%90%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%82%D0%BE%D1%80_%D1%82%D1%80%D0%B0%D1%84%D0%B8%D0%BA%D0%B0 

кто первым удосужится реализовать, плиз отпишитесь ) 

Анализатор трафика — Википедия
  • ru.wikipedia.org
Анализатор трафика, или сниффер (от англ.  ) — сетевой анализатор трафика, программа или программно-аппаратное устройство, предназначенное для перехвата и последующего анализа, либо только анализа сетевого трафика, предназначенного для других узлов. Сниффер может анализировать только то, что проходит через его сетевую карту. Внутри одного...
 

Если при авторизации используется AJAX (а он уже достаточно широко используется), то вряд ли сниффер Вам поможет. Да и во всем траффике будет "мусора" намного больше чем полезной информации. Если хромом пользуетесь, то можно и его штатными средствами посмотреть веб запросы производимые страницей. Но это мало что даст по-факту, WebRequest все равно не поможет. 

Думаю написать статью в эту сторону, как раз для работы MQL c Web (получение данных, скажем с forextrendy.com или подобного ресурса).

Фактически Вы получите ответ от веб скрипта, который должен еще быть интерпретирован самой страницей авторизации или дополнительным скриптом. По сути POST запрос выполнен будет, авторизация пройдет один раз (не факт что до конца), но при следующем любом запросе WebRequest потребуется авторизация снова. Вас просто перебросят редиректом на страничку логина или ошибки, какой бы ресурс не запросили.

 

Никакого стороннего сниффера не нужно. Все просто делается в инспекторе хрома. Заходите на страницу авторизации. Жмете F12->в инспекторе на вкладку Network, отмечаете Preserve Log.

Вводите свой логин/пароль -> Войти.

Теперь смотрим, все записано. Вот что видно на примере сайта mql5.com

первый запрос идет на страницу 

URL: https://www.mql5.com/ru/auth_login
ТИП: POST
ПОЛЯ ЗАПРОСА: 

RedirectAfterLoginUrl:https://www.mql5.com/ru/forum/37833
Login:ваш логин
Password: ваш пароль
RememberMe:false

В ответе приходит заголовок редиректа:

Location:
https://www.mql5.com/auth_set?auth=ТУТ_ТОКЕН_АВТОРИЗАЦИИ&returnUrl=https%3a%2f%2fwww.mql5.com%2fru%2fforum%2f37833

который уже открывает страницу.

Смотрите на Response Headers там есть и значения заголовка Set-Cookie. Т.е. можно рассмотреть и повторить всю схему. Сохранив и отправив куки при запросе нужной страницы сайта.


Причем через web request лучше делать простой запрос к своему сайту, на котором серверным скриптиком делается нужный авторизационный запрос с доступом к файлу.

Интерфейс авторизации, расположения файла может меняться, а советника/программу  при этом не придется переделывать.

Да и в PHP, например, в модуле curl есть все что нужно, включая автоматическое получение и хранение кук между запросами.



 
Vigor:

Причем через web request лучше делать простой запрос к своему сайту, на котором серверным скриптиком делается нужный авторизационный запрос с доступом к файлу.

 То есть чтобы авторизироваться на каком-либо сайте вы предлагаете еще и свой сайт для этого дела создавать ? Неэффективное решение.

 
Неэффективное? Эффективней заставить ваших 100 клиентов обновить версию советника из-за того что сторонний сайт обновился? Или ждать пока клиент позвонит и спросит что-за фигня? Ну, каждый считает свои риски.
Никто не заставляет "создавать", у кого то есть, либо можно взять в облаке ресурс. Причем предлагемое решение универсальное, в поставщик информации для советника/группы советников превращаетесь вы сами, мониторя доступность нужных данных. Сервис-ориентированная структура.
 

Топикстартер о сопровождении вопрос не ставил. Если речь была бы о продакшн версии софта, то без сомнений Вы правы.

А так если для себя да заради экспериментов... phantomjs - вполне приличное решение. Затем его и на свой сервер перенести можно, а оттуда уже запрашивать данные из советника, индикатора...

 
elugovoy:

Топикстартер о сопровождении вопрос не ставил. Если речь была бы о продакшн версии софта, то без сомнений Вы правы.

А так если для себя да заради экспериментов... phantomjs - вполне приличное решение. Затем его и на свой сервер перенести можно, а оттуда уже запрашивать данные из советника, индикатора...

Да и сервер не обязателен. Можно phantomjs локально из mql запускать когда надо, попутно передавая какие-нибудь настроечные параметры, и получать результат обратно (к слову, в фантоме есть встроенные веб-сервер, так что если не хочется заморачиваться с временными файлами, можно тем же webrequest-ом получать результаты от фантома).
 
Vigor:

Никакого стороннего сниффера не нужно. Все просто делается в инспекторе хрома. Заходите на страницу авторизации. Жмете F12->в инспекторе на вкладку Network, отмечаете Preserve Log.

Вводите свой логин/пароль -> Войти.

Теперь смотрим, все записано. Вот что видно на примере сайта mql5.com

первый запрос идет на страницу 

URL: https://www.mql5.com/ru/auth_login
ТИП: POST
ПОЛЯ ЗАПРОСА: 

RedirectAfterLoginUrl:https://www.mql5.com/ru/forum/37833
Login:ваш логин
Password: ваш пароль
RememberMe:false

В ответе приходит заголовок редиректа:

Location:
https://www.mql5.com/auth_set?auth=ТУТ_ТОКЕН_АВТОРИЗАЦИИ&returnUrl=https%3a%2f%2fwww.mql5.com%2fru%2fforum%2f37833

который уже открывает страницу.

Смотрите на Response Headers там есть и значения заголовка Set-Cookie. Т.е. можно рассмотреть и повторить всю схему. Сохранив и отправив куки при запросе нужной страницы сайта.

Спасибо, получилось.

#property strict
#property show_inputs

input int SignalID = 58374;               // ID торгового сигнала
input string MQL5Login = "";              // MQL5-логин
input string MQL5Password = "";           // MQL5-пароль

class FILE
{
public:
  static bool StringToFile( const string FileName, const string Str )
  {
    bool Res = FALSE;
    const int handle = FileOpen(FileName, FILE_WRITE | FILE_BIN);

    if (handle >= 0)
    {
      Res = (FileWriteString(handle, Str) != 0);

      FileClose(handle);
    }

    return(Res);
  }
};

class STRING
{
public:
  static string GetBetweenString( const string &SourceString, const string BeginString, const string EndString = "" )
  {
    string Str = "";
    int Pos1 = 0;
    int Pos2 = 0;

    if (BeginString != "")
      Pos1 = StringFind(SourceString, BeginString);

    if (Pos1 >= 0)
    {
      Pos1 += StringLen(BeginString);

      if (EndString != "")
      {
        Pos2 = StringFind(SourceString, EndString, Pos1);

        if (Pos2 >= 0)
        {
          Pos2 -= Pos1;

          if (Pos2 == 0)
            Pos2--;
        }
      }

      if (Pos2 >= 0)
        Str = StringSubstr(SourceString, Pos1, Pos2);
    }

    return(Str);
  }
};

#define GETSTATEMENT_MACROS(METHOD)                                                                       \
{                                                                                                         \
  ResetLastError();                                                                                       \
                                                                                                          \
  if (WebRequest(METHOD, URL, Cookie, NULL, 10000, Post, ArraySize(Post), Result, ResponseHeaders) == -1) \
  {                                                                                                       \
    Print("Ошибка в WebRequest. Код ошибки  = " + (string)GetLastError());                                \
    Print("Необходимо добавить адрес '" + URL + "' в список разрешенных URL во вкладке 'Советники'");     \
                                                                                                          \
    return(Res);                                                                                          \
  }                                                                                                       \
}                                                                                                         \

class SIGNAL
{
public:
  static string GetStatement( const int ID, const string Login, const string Password )
  {
    string Res = "";
    string ResponseHeaders;
    string Cookie = "";
    string URL = "https://www.mql5.com/en/auth_login";
    char Result[];
    char Post[];

    StringToCharArray("Login=" + Login + "&Password=" + Password + "&RememberMe=false", Post);

    GETSTATEMENT_MACROS("POST")

    Cookie = STRING::GetBetweenString(ResponseHeaders, "Set-Cookie: ", ";");
    URL = "https://www.mql5.com/en/signals/" + (string)ID + "/export/history";

    GETSTATEMENT_MACROS("GET")

    Res = CharArrayToString(Result);

    return(Res);
  }
};

void OnStart( void )
{
  FILE::StringToFile("Statement-" + (string)SignalID + ".csv", SIGNAL::GetStatement(SignalID, MQL5Login, MQL5Password));

  return;
}