Login to website and use cookie to get source for another page

17,253

Here's a simplified and working version of your code using a WebClient:

class Program
{
    static void Main()
    {
        var shows = GetSourceForMyShowsPage();
        Console.WriteLine(shows);
    }

    static string GetSourceForMyShowsPage()
    {
        using (var client = new WebClientEx())
        {
            var values = new NameValueCollection
            {
                { "login_name", "xxx" },
                { "login_pass", "xxxx" },
            };
            // Authenticate
            client.UploadValues("http://www.tvrage.com/login.php", values);
            // Download desired page
            return client.DownloadString("http://www.tvrage.com/mytvrage.php?page=myshows");
        }
    }
}

/// <summary>
/// A custom WebClient featuring a cookie container
/// </summary>

public class WebClientEx : WebClient
{
    public CookieContainer CookieContainer { get; private set; }

    public WebClientEx()
    {
        CookieContainer = new CookieContainer();
    }

    protected override WebRequest GetWebRequest(Uri address)
    {
        var request = base.GetWebRequest(address);
        if (request is HttpWebRequest)
        {
            (request as HttpWebRequest).CookieContainer = CookieContainer;
        }
        return request;
    }
}
Share:
17,253
Stuart Leyland-Cole
Author by

Stuart Leyland-Cole

Updated on June 15, 2022

Comments

  • Stuart Leyland-Cole
    Stuart Leyland-Cole almost 2 years

    I am trying to login to the TV Rage website and get the source code of the My Shows page. I am successfully logging in (I have checked the response from my post request) but then when I try to perform a get request on the My Shows page, I am re-directed to the login page.

    This is the code I am using to login:

        private string LoginToTvRage()
        {
            string loginUrl = "http://www.tvrage.com/login.php";
            string formParams = string.Format("login_name={0}&login_pass={1}", "xxx", "xxxx");
            string cookieHeader;
            WebRequest req = WebRequest.Create(loginUrl);
            req.ContentType = "application/x-www-form-urlencoded";
            req.Method = "POST";
            byte[] bytes = Encoding.ASCII.GetBytes(formParams);
            req.ContentLength = bytes.Length;
            using (Stream os = req.GetRequestStream())
            {
                os.Write(bytes, 0, bytes.Length);
            }
            WebResponse resp = req.GetResponse();
            cookieHeader = resp.Headers["Set-cookie"];
            String responseStream;
            using (StreamReader sr = new StreamReader(resp.GetResponseStream()))
            {
                responseStream = sr.ReadToEnd();
            }
            return cookieHeader;
        }
    

    I then pass the cookieHeader into this method which should be getting the source of the My Shows page:

        private string GetSourceForMyShowsPage(string cookieHeader)
        {
            string pageSource;
            string getUrl = "http://www.tvrage.com/mytvrage.php?page=myshows";
            WebRequest getRequest = WebRequest.Create(getUrl);
            getRequest.Headers.Add("Cookie", cookieHeader);
            WebResponse getResponse = getRequest.GetResponse();
            using (StreamReader sr = new StreamReader(getResponse.GetResponseStream()))
            {
                pageSource = sr.ReadToEnd();
            }
            return pageSource;
        }
    

    I have been using this previous question as a guide but I'm at a loss as to why my code isn't working.

  • Stuart Leyland-Cole
    Stuart Leyland-Cole almost 14 years
    This is perfect! Thank you very much!