HttpWebRequest Login

10/14/2012 22:56 anonymous-f4h279#16
Quote:
Originally Posted by Kraizy​ View Post
Sicher, dass du deinen Code nicht einfach irgendwo rauskopiert hast..?
Naja, Debug.Print(quelltext), oder du setzt nen Haltepunkt und kopierst den Wert deiner Variable selber raus.
Jop, habe vorher nur nie mit Visual Studio gearbeitet, da ich aus Java komme und die Syntax ziemlich ähnlich ist, konnte ich da recht schnell einsteigen.
Das ein oder andere muss ich zwar auf MSDN nachschlagen, aber sonst keine Probleme. Meine Frage war lediglich, ob der Quelltext vom Debugger selbst kommt. Wie ich ihn auslesen kann, ist mir schon bewusst, dennoch danke :)
10/15/2012 12:13 Lawliet#17
Code:
public class Http
    {
        public string PostRequest(string host, string path, string spostPacket)
        {
            var cookies = Cookies.GetInstance();
            var cookieContainer = new CookieContainer();
            
            byte[] postPacket = Encoding.UTF8.GetBytes(spostPacket);

            var request = (HttpWebRequest) HttpWebRequest.Create("http://" + host + path);
            request.CookieContainer = cookieContainer;
            request.Method = "POST";
            request.Host = host;
            request.UserAgent = "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:15.0) Gecko/20100101 Firefox/15.0.1";
            request.ConnectionGroupName = "keep-alive";

            request.ContentType = "application/x-www-form-urlencoded";
            request.ContentLength = postPacket.Length;
            request.Proxy = new WebProxy();
            foreach (var cookie in cookies.GetCookies())
            {
                request.CookieContainer.Add(cookie);
            }
            
            
            

            var dataStream = request.GetRequestStream();


            dataStream.Write(postPacket, 0, postPacket.Length);
            var response = (HttpWebResponse)request.GetResponse();
            var responseType = response.ContentType;
            dataStream = response.GetResponseStream();
            var responseStream = new StreamReader(dataStream);
            var html = responseStream.ReadToEnd();
            if(response.Cookies.Count != 0)
            {
                List<Cookie> retCookie = new List<Cookie>();
                for (int i = 0; i < response.Cookies.Count; i++)
                {
                    retCookie.Add(response.Cookies[i]);
                }
                cookies.SetCookies(retCookie);
            }
           dataStream.Close();
           return html;
        }




        public string GetRequest(string host, string path = "")
        {
            var cookies = Cookies.GetInstance();
            var cookieContainer = new CookieContainer();

            var request = (HttpWebRequest)WebRequest.Create("http://" + host + path);
            request.CookieContainer = cookieContainer;
            request.Method = "GET";
            request.ContentType = "application/x-www-form-urlencoded";
            request.ConnectionGroupName = "keep-alive";
            request.Host = host;
            request.UserAgent = "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:15.0) Gecko/20100101 Firefox/15.0.1";
            request.Proxy = new WebProxy();
            
            foreach (var cookie in cookies.GetCookies())
            {
                request.CookieContainer.Add(cookie);
            }

            var response = (HttpWebResponse)request.GetResponse();
            
            var dataStream = response.GetResponseStream();
            var responseStream = new StreamReader(dataStream);
            var html = responseStream.ReadToEnd();
            if (response.Cookies.Count != 0)
            {
                List<Cookie> retCookie = new List<Cookie>();
                for (int i = 0; i < response.Cookies.Count; i++)
                {
                    retCookie.Add(response.Cookies[i]);
                }
                cookies.SetCookies(retCookie);
            }
            dataStream.Close();
            return html;
        }
    }

Code:
 public class Cookies
    {
        private List<Cookie> _cookies = new List<Cookie>();
        private static Cookies _cookiesInstance;


        public static Cookies GetInstance()
        {
           if (_cookiesInstance != null)
                return _cookiesInstance;
            _cookiesInstance = new Cookies();
           return _cookiesInstance;
        }

        private Cookies(){}

        public List<Cookie> GetCookies()
        {
            return _cookies;
        }
        public void SetCookies(List<Cookie> cookies )
        {
            _cookies = cookies;
        }
    }





    public class CookieEntity
    {
        public Cookie cookie { get; set; }
    }
Das sind zwei alte Methoden von mir, zwar nicht perfekt nach den Normen gecoded, aber da kannst du über die Cookies immer checken, ob dein Login erfolgreich war. Außerdem werden die Cookies immer automatische gespeichert und wieder neu mitgegeben.
Ein Login bei epvp würde dann so aussehen:


Code:
var httpRequest = new Http();
            var html = string.Empty;
            html = httpRequest.GetRequest(@"www.elitepvpers.com");
            html = httpRequest.PostRequest(@"www.elitepvpers.com", "/forum/login.php?do=login", @"vb_login_username=" + usrName + @"&vb_login_password=&cookieuser=1&s=&securitytoken=" + "guest" + "&do=login&vb_login_md5password="+ GetMd5Hash(password).ToLower() +"&vb_login_md5password_utf=" + GetMd5Hash(password).ToLower());

Zum Login prüfen:

Code:
            Cookies.GetInstance().GetCookies().Contains("COOKIEDASEXISTIERENMUSSWENNDUEINGELOOGTBIST")
10/16/2012 09:25 Naworia#18
You need to save cookies to use in other pages.
10/16/2012 12:20 Kraizy​#19
I guess the problem is already solved..
10/17/2012 20:41 vwap#20
Falls, es noch benötigt wird, der Konstruktor meiner Klasse:

Code:
public Elitepvpers(string username, string password)
        {
            Request request = new Request();
            string serverResponse = null;

            username = HttpUtility.UrlEncode(username);

            request.Send("http://elitepvpers.com/forum", ref cookies);
            serverResponse = request.Send("http://www.elitepvpers.com/forum/login.php?do=login", "vb_login_username=" + username + "&vb_login_password=" + password + "&cookieuser=1&s=&securitytoken=guest&do=login&vb_login_md5password=&vb_login_md5password_utf=", ref cookies);

            if (!serverResponse.Contains("Thank you for logging in")) loggedIn = false;
            else loggedIn = true;
        }
10/18/2012 13:28 Kraizy​#21
@Headpuster funktionieren bei dir Logins, welche mit Usernamen durchgeführt werden, die zb ein ♥ im Namen enthalten? Bei mir nicht, und ich bin zu blöd das richtige CharSet zu finden :D
10/18/2012 14:09 Shawak#22
Schon mit dem Charset von Elitepvpers versucht (charset=ISO-8859-1)?
10/18/2012 14:43 vwap#23
Code:
username = HttpUtility.UrlEncode(username);
& charset=ISO-8859-1

That's the Trick.
10/18/2012 15:48 Kraizy​#24
Hm komisch..hab ich gestern schon probiert, aber angeblich Invalid username/password..naja jz gehts