C# 使用Httpwebrequest登录到网站

C# 使用Httpwebrequest登录到网站,c#,login,httpwebrequest,C#,Login,Httpwebrequest,我是编程新手(C#),我开始为MMORPG编写一个机器人,学习如何通过编程与网站进行交流等等 我在这里和那里发现了很多关于这个话题的问题。最后,在一只援助之手的帮助下,我找到了一些东西并完成了它,但不幸的是,这些东西不起作用:( 方法: public static CookieCollection GetCookie(HttpWebRequest request) { if (request.CookieContainer == null) {

我是编程新手(C#),我开始为MMORPG编写一个机器人,学习如何通过编程与网站进行交流等等

我在这里和那里发现了很多关于这个话题的问题。最后,在一只援助之手的帮助下,我找到了一些东西并完成了它,但不幸的是,这些东西不起作用:(

方法:

    public static CookieCollection GetCookie(HttpWebRequest request)
    {

        if (request.CookieContainer == null)
        { return new CookieContainer().GetCookies(request.RequestUri); }
        else
        { return request.CookieContainer.GetCookies(request.RequestUri); }
    }


    public static CookieContainer GetCookie(HttpWebResponse response)
    {

        CookieContainer cookiecontainer = new CookieContainer();
        cookiecontainer.Add(response.Cookies);

        return cookiecontainer;
    }


    public static void SetCookie(HttpWebRequest request, CookieContainer cookie)
    {
        request.CookieContainer = cookie;
    }


    public static void SetCookie(HttpWebResponse response, CookieCollection cookie)
    {
        response.Cookies = cookie;
    }


    public static HttpWebResponse PostData(string uri,string request,CookieContainer cookie)
    {
        HttpWebRequest httprequest;
        byte[] requestbytes;
        Stream requeststream;
        HttpWebResponse httpresponse;

        httprequest = (HttpWebRequest)HttpWebRequest.Create(uri);

        if (cookie == null)
        {httprequest.CookieContainer=new CookieContainer();}
        else
        {httprequest.CookieContainer=cookie;}

        httprequest.Method = "POST";
        httprequest.ContentType = "application/x-www-form-urlencoded";
        httprequest.UserAgent = "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.142 Safari/535.19";
        requestbytes = ASCIIEncoding.ASCII.GetBytes(request);
        httprequest.ContentLength = requestbytes.Length;

        requeststream=httprequest.GetRequestStream();
        requeststream.Write(requestbytes,0,requestbytes.Length);
        requeststream.Close();

        httpresponse=(HttpWebResponse)httprequest.GetResponse();

        if (!(httpresponse.Cookies.Count>0))
        { SetCookie(httpresponse, GetCookie(httprequest)); }

        return httpresponse;
    }


    public static HttpWebResponse GetData(string uri, CookieContainer cookie)
    {
        HttpWebRequest httprequest;
        HttpWebResponse httpresponse;

        httprequest = (HttpWebRequest)HttpWebRequest.Create(uri);

        if (cookie == null)
        { httprequest.CookieContainer = new CookieContainer(); }
        else
        { httprequest.CookieContainer = cookie; }

        httprequest.Method = "GET";
        httprequest.ContentType = "application/x-www-form-urlencoded";
        httprequest.UserAgent = "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.142 Safari/535.19";

        httpresponse = (HttpWebResponse)httprequest.GetResponse();

        if (!(httpresponse.Cookies.Count > 0))
        { SetCookie(httpresponse, GetCookie(httprequest)); }

        return httpresponse;
    }
主要问题:

        string uri = "http://s2.kingsera.org";
        string userName = "someUserName";
        string passWord = "somePassWord";

        string postData = "signinUsername=" + userName + "&signinPassword=" + passWord + "&signinRemember=remember";
        CookieContainer cookie = new CookieContainer();

        HttpWebResponse response = PostData(uri, postData, cookie);

        CookieContainer c = GetCookie(response);
似乎登录页面正在做一些事情,使其更加复杂

每一条评论/建议都将不胜感激。
提前谢谢。

我不打算从技术上回答你的问题,但当我遇到类似的问题时,我会转向它,它会拦截你的计算机和远程服务器之间的web通信

这将允许您查看浏览器向远程服务器发出的确切请求及其所有标题、cookie数据等,以及代码向远程服务器发出的请求


这两个请求之间的差异应该会告诉您解决问题的方法,或者至少会为您提供许多额外的故障排除信息。

我不打算从技术上回答您的问题,但当我遇到类似的问题时,我会转向,它会拦截您的计算机和远程服务器之间的web流量。

这将允许您查看浏览器向远程服务器发出的确切请求及其所有标题、cookie数据等,以及代码向远程服务器发出的请求


这两个请求之间的差异应该会告诉您解决问题的方法,或者至少会为您提供许多用于疑难解答的额外信息。

您没有在属性中设置任何内容。事实上,我设置了。但它似乎与我在该类示例中看到的不同。您没有在属性中设置任何内容y、 嗯,事实上我有。但它似乎不像我在那个类的例子中看到的那样。谢谢你的提示,我想它有点像TamperData和Firebug,不是吗?@Musketer非常像-我不熟悉TamperData,但它与Firebug的网络选项卡非常相似,但它适用于所有HTTP流量,所以它非常适合签入通过比较找出请求。甚至可能是你的目标站点正在检查浏览器请求字符串或其他部分。如果你能欺骗自己的相同请求,你肯定会得到相同的响应。谢谢你的提示,我猜这有点像TamperData和Firebug,不是吗?@Musketer很像-我不熟悉TamperData,但是它的功能与Firebug的“网络”选项卡非常相似,但它适用于所有HTTP流量,因此,通过比较,它非常适合检出请求。甚至可能是您的目标站点正在检查浏览器请求字符串或其他部分。如果您能伪造相同的请求,您肯定会得到相同的响应。