How to log in to a vbulletin forum with C#?
Asked Answered
T

2

7

I'm trying to log into a vbulletin forum. I got this far:

private string login(string url, string username, string password)
{
string values = "vb_login_username={0}&vb_login_password={1}"
values += "&securitytoken=guest&cookieuser=checked&do=login";

values = string.Format(values, username, password);
HttpWebRequest req = (HttpWebRequest)WebRequest.Create(url);
CookieContainer a = new CookieContainer();
req.CookieContainer = a;

System.Net.ServicePointManager.Expect100Continue = false; // prevents 417 error

using (StreamWriter writer = new StreamWriter(req.GetRequestStream(), System.Text.Encoding.ASCII)) 
{ writer.Write(values); }

this.response = (HttpWebResponse)req.GetResponse(); 

StringBuilder output = new StringBuilder();

foreach (var cookie in response.Cookies)
{
output.Append(cookie.ToString());
output.Append(";");
}


return output.ToString();
} 

It looks like i am getting logged in, but when i download the page, i can't find my username in it.

Do you guys see anything that i might be doing wrong?

Thanks in advance!

Tachistoscope answered 3/3, 2010 at 21:56 Comment(0)
H
6

You can do it using HTTP Request

Use this method

public string Login(Uri ActionUrl, string postData)
        {

            gRequest = (HttpWebRequest)WebRequest.Create(formActionUrl);
            gRequest.UserAgent = "Mozilla/5.0 (Windows; U; Windows NT 6.1; en-GB; rv:1.9.1.8) Gecko/20100202 Firefox/3.5.8 GTBDFff GTB7.0";

            gRequest.CookieContainer = new CookieContainer();
            gRequest.Method = "POST";
            gRequest.Accept = " text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8, */*";
            gRequest.KeepAlive = true;
            gRequest.ContentType = @"application/x-www-form-urlencoded";


            #region CookieManagement
            if (this.gCookies != null && this.gCookies.Count > 0)
            {

                gRequest.CookieContainer.Add(gCookies);
            }


            try
            {

                string postdata = string.Format(postData);
                byte[] postBuffer = System.Text.Encoding.GetEncoding(1252).GetBytes(postData);
                gRequest.ContentLength = postBuffer.Length;
                Stream postDataStream = gRequest.GetRequestStream();
                postDataStream.Write(postBuffer, 0, postBuffer.Length);
                postDataStream.Close();
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);

            }



            try
            {
                gResponse = (HttpWebResponse)gRequest.GetResponse();
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex);

            }



            //check if the status code is http 200 or http ok

                if (gResponse.StatusCode == HttpStatusCode.OK)
                {
                    //get all the cookies from the current request and add them to the response object cookies

                    gResponse.Cookies = gRequest.CookieContainer.GetCookies(gRequest.RequestUri);
                    //check if response object has any cookies or not
                    if (gResponse.Cookies.Count > 0)
                    {
                        //check if this is the first request/response, if this is the response of first request gCookies
                        //will be null
                        if (this.gCookies == null)
                        {
                            gCookies = gResponse.Cookies;
                        }
                        else
                        {
                            foreach (Cookie oRespCookie in gResponse.Cookies)
                            {
                                bool bMatch = false;
                                foreach (Cookie oReqCookie in this.gCookies)
                                {
                                    if (oReqCookie.Name == oRespCookie.Name)
                                    {
                                        oReqCookie.Value = oRespCookie.Name;
                                        bMatch = true;
                                        break; // 
                                    }
                                }
                                if (!bMatch)
                                    this.gCookies.Add(oRespCookie);
                            }
                        }
                    }
            #endregion



                    StreamReader reader = new StreamReader(gResponse.GetResponseStream());
                    string responseString = reader.ReadToEnd();
                    reader.Close();
                    //Console.Write("Response String:" + responseString);
                    return responseString;
                }
                else
                {
                    return "Error in posting data";
                } 

        }
Hagerty answered 16/9, 2010 at 7:22 Comment(1)
Where do you set username and password?Tachistoscope
T
1

I'm not sure if I follow you. What exactly do you mean with VBB?

If you mean posting a thread in vb.com, I can tell you that there is a thread opened in vb.org in forum 'vb3 programming discussion' (not posted by me). It should be on the 3rd page, starts with 'C#'.

If you mean something else with your post, can you clarify it a bit?

Tachistoscope answered 18/3, 2010 at 10:12 Comment(1)
If you want to reply to an answer, you should use the "add comment" link underneath that comment, rather than post an answer to your own comment.Ibis

© 2022 - 2024 — McMap. All rights reserved.