c# - 使用 Httpwebrequest 登录网站

标签 c# authentication httpwebrequest

我是编程 (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);

看来登录页面正在做一些事情,让它变得更复杂了! http://s2.kingsera.org

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

最佳答案

我不会从技术上回答你的问题,但当我遇到这样的事情时,我会转向 Fiddler ,拦截您的计算机和远程服务器之间的网络流量。

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

两个请求之间的差异应该向您展示解决问题的方法,或者至少为您提供大量额外信息以进行故障排除。

关于c# - 使用 Httpwebrequest 登录网站,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11651063/

相关文章:

java - 如何在登录时将用户名与加密密码匹配(java)

silverlight - 如何在Silverlight WebClient中设置超时?

c# - 在 C# 中传递的参数不能正常工作?内部函数使用了反射

仅使用单个密码字段(无用户名)的 PHP session ?

php - 保护登录和评论表单免受 CSRF

performance - HTTP 请求成本与页面大小成本?

.net - 在 .NET 中的多线程上快速、高效地处理 HTTP 请求

c# - 使用 P/Invoked GlobalSize 时堆已损坏

c# - 如何只取年份的最后 3 位数字

c# - 如何仅使用 C# 获取 SQL Server 数据库中的表列表以及主键?