Переход на страницу и отображение её кода - CodeHelper

Переход на страницу и отображение её кода

1

Доброго времени суток! Есть у меня такой вопрос(еще один). Как исходя из кода, подкорректированного Чак Норрис, за что ему отдельно спасибо, перейти тут же на другую страницу этого же сайта, на котором уже авторизирован(допустим страница - "сообщения" "http://my.deviantart.com/messages/") и отобразить её html код.

Код:

    var msg = new StringBuilder(String.Empty);
var st = new Uri("http://www.deviantart.com");
var reqString = String.Format(
    "reusetoken=1&username={0}&password={1}", 
    username, password);
var requestData = Encoding.UTF8.GetBytes(reqString);
var cc = new CookieContainer();
var request = (HttpWebRequest) 
    WebRequest.Create(
        "https://www.deviantart.com/users/login"); 1
request.Credentials = CredentialCache.DefaultCredentials;
request.AllowAutoRedirect = false;
request.KeepAlive = true;
request.CookieContainer = cc;
request.Method = "POST";
request.ContentType = "application/x-www-form-urlencoded";
request.UserAgent = "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 2.0.50727)";
request.ContentLength = requestData.Length;

using (var s = request.GetRequestStream())
{
    s.Write(requestData, 0, requestData.Length);
}

var webResponse = request.GetResponse();
using (var stream = new StreamReader(webResponse.GetResponseStream()))
{
    var content = stream.ReadToEnd();
    Console.WriteLine(content);

    foreach (var str in cc.GetCookies(st))
    {
        msg.Append(str);
    }

    Console.WriteLine(msg.ToString());
}

HttpWebRequest req = (HttpWebRequest) WebRequest.Create("http://www.deviantart.com/?loggedin=1");
req.CookieContainer = cc;  2
req.Credentials = CredentialCache.DefaultCredentials;
HttpWebResponse respons = (HttpWebResponse)req.GetResponse();
Stream dataStream = respons.GetResponseStream();
StreamReader reader = new StreamReader(dataStream);
string responseFromServer = reader.ReadToEnd();
Console.WriteLine(responseFromServer);
reader.Close();
dataStream.Close();
respons.Close();

Console.ReadLine();

Заранее спасибо.

Лучший ответ:

1

Можно использовать последний участок кода для запроса любой страницы. Главное чтобы свойству CookiesContainer присваивался контейнер, содержащий куки авторизации. Можно сделать код более универсальным. У меня получилось вот что:

class Program
{
    static void Main(string[] args)
    {
        var username = "username";
        var password = "password";

        var cookieContainer = GetAuthtorizationCookie(username, password);

        var firstPage = GetPage(
            "http://www.deviantart.com/?loggedin=1", 
            cookieContainer);

        var secondPage = GetPage(
            "http://my.deviantart.com/messages/", 
            cookieContainer);

        Console.ReadLine();
    }

    private static CookieContainer GetAuthtorizationCookie(
        string username, string password) 1
    {
        var reqString = String.Format(
            "reusetoken=1&username={0}&password={1}", 
            username, 
            password);

        var requestData = Encoding.UTF8.GetBytes(reqString);
        var cookieContainer = new CookieContainer();
        var request = (HttpWebRequest) WebRequest.Create(
            "https://www.deviantart.com/users/login");
        request.Credentials = CredentialCache.DefaultCredentials;
        request.AllowAutoRedirect = false;
        request.KeepAlive = true;
        request.CookieContainer = cookieContainer;
        request.Method = "POST";
        request.ContentType = "application/x-www-form-urlencoded";
        request.UserAgent = "Mozilla/4.0 (compatible; MSIE 6.0;" + 
            " Windows NT 5.1; SV1; .NET CLR 2.0.50727)";
        request.ContentLength = requestData.Length;

        using (var s = request.GetRequestStream())
        {
            s.Write(requestData, 0, requestData.Length);
        }

        using(var webResponse = request.GetResponse())
        {
            // Тут можно вставить проверку статуса ответа...                
        }

        return cookieContainer;
    }

    private static string GetPage(
        string uri, CookieContainer cookies) 2
    {
        var request = (HttpWebRequest) WebRequest.Create(uri);
        request.CookieContainer = cookies;
        request.Credentials = CredentialCache.DefaultCredentials;
        using(var respons = (HttpWebResponse)request.GetResponse())
        {
            using (var reader = new StreamReader(respons.GetResponseStream()))
            {
                return reader.ReadToEnd();
            }
        }
    }
}

Метод GetAuthtorizationCookie 1 логинется на сайт и возвращает соответствующие куки. Метод GetPage 2 принимает эти куки и возвращает заданную (любую) страницу сайта.

kiborg

Спасибо еще раз, огромное!

v1.7.123.556
© 2009—2010 CodeHelper FAQ | О сайте | Обратная связь | История изменений | Статьи
Creative Commons LicenseМатериалы сайта распространяются под лицензией Creative Commons Attribution-Share Alike 3.0 Unported.