2015-07-14 3 views
2

Я пробовал много примеров как здесь, так и из Google и по-прежнему не могу получить мой логин. Я отлаживал и видел, что он отправляет перенаправление 302, и мой логин успешно завершен. Я верю. Затем отправлю его на следующую страницу, но сохраняем файлы cookie, полученные из ответа на вход. Но я все еще вышла из системы. Вот мой код, кроме URL-адресов и информации для входа. Я проверил параметры POST. Сначала я запрашиваю файл cookie сеанса, затем войдите в систему, затем перейдите на страницу переадресации. Вся помощь по достоинству оценена, это огромная головная боль.C# сохранение файлов cookie и сеансов на веб-страницах

HttpWebRequest GetRequest(string Site, CookieContainer Cookies, string SendType) 
    { 

     HttpWebRequest request = WebRequest.Create(Site) as HttpWebRequest; 
     request.UserAgent = "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/43.0.2357.134 Safari/537.36"; 
     request.CookieContainer = Cookies; // Assign it some cookies 
     request.ContentType = "application/x-www-form-urlencoded"; 
     request.Method = SendType; 
     return request; 
    } 

    private string GetLoggedInPage(string username, string password, string loginPage, string redirectPage) 
    { 

     string formParams = string.Format("login={0}&password={1}", username, password); 

     // cookies to use for multiple requests 
     var cookies = new CookieContainer(); // Create cookies! 



     var request= GetRequest(loginPage, cookies, "POST"); 


     //Send params off 
     byte[] bytes = Encoding.ASCII.GetBytes(formParams); 

     using (Stream loginStream = request.GetRequestStream()) 
     { 
      loginStream.Write(bytes, 0, bytes.Length); 
     } 



     request.GetResponse().Dispose(); // removed some code here, no need to read response manually 



     request= GetRequest(redirectPage, cookies, "GET"); 



     using (WebResponse getResponse = request.GetResponse()) 
     { 
      using (StreamReader sr = new StreamReader(getResponse.GetResponseStream())) 
      { 
       var result = sr.ReadToEnd();//Read logged in webpage 
       return Convert.ToString(result); 
      } 

     } 


     return "<Html></html>"; //Return blank page in case the using above didn't work correctly. 



    } 

Приведенный ниже код реорганизуется и работает. Я последовал совету KoBE ниже, но он все еще не работал. Вопрос оказался ориентированным на структуру 4.5.2. Я нацелен на работу 4.0 и ниже. просто отправьте GetLoggedInPage свое имя пользователя, пароль и URL-адрес для входа и адрес URL, и он вернет вам строку. Я собираюсь превратить это в класс и использовать его.

Не забывайте сохранять файлы cookie!

void WriteParams(string Params, HttpWebRequest webrequestStream) 
{ 
    byte[] bytes = Encoding.ASCII.GetBytes(Params); 


    using (Stream requestStream = webrequestStream.GetRequestStream()) 
    { 
     requestStream.Write(bytes, 0, bytes.Length); 
    } 


} 


HttpWebRequest GetRequest(string Site, ref CookieContainer Cookies, string SendType) 
{ 

    HttpWebRequest request = WebRequest.Create(Site) as HttpWebRequest; 
    request.UserAgent = "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/43.0.2357.134 Safari/537.36"; 
    request.CookieContainer = Cookies; // Assign it some cookies 
    request.ContentType = "application/x-www-form-urlencoded"; 
    request.Method = SendType; 
    return request; 
} 

private string GetLoggedInPage(string username, string password, string loginPage, string redirectPage) 
{ 

    string formParams = string.Format("login={0}&password={1}", username, password); 

    // cookies to use for multiple requests 
    var cookies = new CookieContainer(); // Create cookies! 



    HttpWebRequest request= GetRequest(loginPage, ref cookies, "POST"); 


    //Send params off 

    WriteParams(formParams, request); 


    request.GetResponse();// .Dispose(); // removed some code here, no need to read response manually 



    request= GetRequest(redirectPage, ref cookies, "GET"); 



    using (WebResponse getResponse = request.GetResponse()) 
    { 
     using (StreamReader sr = new StreamReader(getResponse.GetResponseStream())) 
     { 
      var result = sr.ReadToEnd();//Read logged in webpage 
      return Convert.ToString(result); 
     } 

    } 


    return "<Html></html>"; //Return blank page in case the using above didn't work correctly. 



} 

ответ

1

Редактировать: Я наконец посмотрел на ваш код. Похоже, вы просто пропустили пользовательский агент. См. Измененный код внизу.

Первое, я хотел бы изменить это:

var cookies = new CookieContainer(); // Create cookies! 
TheRequest.CookieContainer = new CookieContainer(); 

Для этого:

var cookies = new CookieContainer(); // Create cookies! 
TheRequest.CookieContainer = cookies; 

Это предотвратит вас от необходимости:

foreach (Cookie c in TheResponse.Cookies)//Get response cookie 
{ 
    cookies.Add(c); 
} 
TheRequest.CookieContainer = cookies; 

Там нет необходимости создавать два контейнера для файлов cookie, а затем копировать их из одного в другой, только для установки оригинала в скопированную версию.

Я не уверен, но это может решить ваши проблемы в зависимости от того, сколько работ CookieContainer на самом деле делает на заднем плане в отношении определенных cookie Uri или того, что у вас есть.

https://www.pucatrade.com/dashboard Адрес, использованный вами? Кроме того, почему вы пытаетесь войти в систему несколько раз?

Модифицированный код


string username = "your-user"; 
string pass = "your-pass"; 
string loginPage = "https://pucatrade.com/login"; 
string redirectPage = "https://pucatrade.com/dashboard"; 
string formParams = string.Format("login={0}&password={1}", username, pass); 

// cookies to use for multiple requests 
var cookies = new CookieContainer(); // Create cookies! 

var request = WebRequest.Create(loginPage) as HttpWebRequest; 
request.UserAgent = "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/43.0.2357.134 Safari/537.36"; 
request.CookieContainer = cookies; // Assign it some cookies 
request.ContentType = "application/x-www-form-urlencoded"; 
request.Method = "POST"; 
byte[] bytes = Encoding.ASCII.GetBytes(formParams); 
request.ContentLength = bytes.Length; 
using (Stream loginStream = request.GetRequestStream()) 
{ 
    loginStream.Write(bytes, 0, bytes.Length); 
} 

request.GetResponse().Dispose(); // removed some code here, no need to read response manually 

request = WebRequest.Create(redirectPage) as HttpWebRequest; //we know we get redirected too here, so just go there. 
request.UserAgent = "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/43.0.2357.134 Safari/537.36"; 
request.CookieContainer = cookies; // Assign it some cookies 
request.Method = "GET"; 

using (WebResponse getResponse = request.GetResponse()) 
{ 
    using (StreamReader sr = new StreamReader(getResponse.GetResponseStream())) 
    { 
     var result = sr.ReadToEnd();//Read logged in webpage 
    } 
} 
+0

Я применил свои исправления, но я все еще получаю не вошли в экран. Что касается нескольких раз, я прочитал, что сначала вы должны отправить GET с учетными данными, чтобы получить файл cookie сеанса и добавить его. Я взял этот код и обновил его. Он идет со страницы входа на эту страницу. Нужно ли мне обрабатывать перенаправление? – NeedHelp

+0

Кажется, вам не хватает пользовательского агента. Также выньте это для цикла. Вам это больше не нужно. Я привел рабочий пример выше. – Cory

+0

Это все еще немного неудобно и может использовать какой-то рефакторинг, но я чувствовал, что это выходит за рамки вашего вопроса. – Cory