Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2008/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Can';t使用HttpWebRequests登录_C#_Login_Httpwebrequest_Httpwebresponse_Vbulletin - Fatal编程技术网

C# Can';t使用HttpWebRequests登录

C# Can';t使用HttpWebRequests登录,c#,login,httpwebrequest,httpwebresponse,vbulletin,C#,Login,Httpwebrequest,Httpwebresponse,Vbulletin,我正在尝试使用HttpWerRequests登录论坛,但迄今为止没有成功,以下是我的代码: string url = "http://www.warriorforum.com/"; var bytes = Encoding.Default.GetBytes(@"vb_login_username=MyUsername&cookieuser=1&vb_login_password=&s=&securitytoken=guest&do=login&v

我正在尝试使用HttpWerRequests登录论坛,但迄今为止没有成功,以下是我的代码:

string url = "http://www.warriorforum.com/";

var bytes = Encoding.Default.GetBytes(@"vb_login_username=MyUsername&cookieuser=1&vb_login_password=&s=&securitytoken=guest&do=login&vb_login_md5password=d9350bad28eee253951d7c5211e50179&vb_login_md5password_utf=d9350bad28eee253951d7c5211e50179");
var container = new CookieContainer();

var request = (HttpWebRequest)(WebRequest.Create(url));
request.CookieContainer = container;
request.UserAgent = "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.2 (KHTML, like Gecko) Chrome/22.0.1229.94 Safari/535.2";
request.ContentLength = bytes.Length;
request.Method = "POST";
request.KeepAlive = true;
request.AllowAutoRedirect = true;
request.AllowWriteStreamBuffering = true;
request.CookieContainer = container;
using (var requestStream = request.GetRequestStream())
    requestStream.Write(bytes, 0, bytes.Length);

var requestResponse = request.GetResponse();
using (var responsStream = requestResponse.GetResponseStream())
{
    if (responsStream != null)
    {
        using (var responseReader = new StreamReader(responsStream))
        {
            var responseStreamReader = responseReader.ReadToEnd();
            richTextBox1.Text = responseStreamReader; //this is to read the page source after the request
        }
    }
}

请求后,响应只是同一页面,没有任何更改,没有消息告诉我输入了错误的密码或类似的内容。

您似乎缺少了登录时浏览器所做的某些操作。。。那个论坛真的需要一个
帖子
,或者一个
获取
?你所有的参数都正确吗?当从浏览器登录时,网页是否会发送附加参数(隐藏)


当您通过浏览器手动登录时,您需要了解实际情况-使用或找出并模拟代码中发生的情况…

我刚刚使用我的通用VBulletin登录功能进行了测试,它似乎工作正常:

private static bool VBulletinLogin(Uri loginUrl, string user, string password)
{
    var postParams = new[] {
        new HttpParam("vb_login_username", user),
        new HttpParam("cookieuser", "1"),
        new HttpParam("vb_login_password", password),
        new HttpParam("securitytoken", "guest"),
        new HttpParam("do", "login"),
    };

    var http = new HttpContext();
    var src = http.GetEncodedPageData(loginUrl, HttpRequestType.POST, postParams);
    return src.ResponseData.Contains("Thank you for logging in");
}
不幸的是,这使用了我的
HttpContext
类,它是我一直在编写的库的一部分,并且这些特性是相当相互交织的。不过,希望它至少能让您了解post参数。我还从我自己的类中包含了一些有用的结构/函数,它们应该会有所帮助。(注意,需要引用.NET 3.5
System.Web
命名空间

第一个有用的结构,HttpParam:

public struct HttpParam
{
    private string _key;
    private string _value;

    public string Key { get { return HttpUtilty.UrlEncode(_key); } set { _key = value; } }
    public string Value { get { return HttpUtility.UrlEncode(_value); } set { _value = value; } }

    public HttpParam(string key, string value)
    {
        _key = key;
        _value = value;
    }

    public override string ToString()
    {
        return string.Format("{0}={1}", Key, Value);
    }
};
以及与之配套的一个函数:

private static string GetQueryString(HttpParam[] args)
{
    return args != null
            ? string.Join("&", Array.ConvertAll(args, arg => arg.ToString()))
            : string.Empty;
}
这些组合将帮助您生成一致、安全的查询字符串。因此,在上述情况下:

var postParams = new[] {
    new HttpParam("vb_login_username", user),
    new HttpParam("cookieuser", "1"),
    new HttpParam("vb_login_password", password),
    new HttpParam("securitytoken", "guest"),
    new HttpParam("do", "login"),
};

var queryString = GetQueryString(postParams);
会给你一些类似的东西:

vb_login_username=<user>&cookieuser=1&vb_login_password=<password>&securitytoken=guest&do=login

请注意
ContentType
的更改。

您是否可以将我们链接到相关网页?不同的VBulletin论坛使用不同的安全级别。乍一看,我看不出代码有任何明显的错误,但根据我使用VBulletin的经验,有时登录页面上会有安全标记您需要提取并发布到页面(例如,请参见
s
post参数)您发布到错误的url。请将
url
更改为
http://warriorforum.com/login.php?do=login
vb\u login\u username=ISeeSoundsBG&cookieuser=1&vb\u login\u password=&s=&securitytoken=guest&do=login&vb\u login\u md5password=d9350bad28eee253951d7c5211e50179&vb\u login\u md5password\u utf=d9350bad28eee253951d7c5211e50179我不知道顺便说一句,看看我在讽刺什么。除了HttpUtils.UrlEncode似乎是我正在使用的4.5框架的一部分之外,一切都很好VS2010@FaTaL_ErRoR将
HttpUtils
更改为
HttpUtility
,正如我之前提到的,我的库的很大一部分是相互交织的,
HttpUtils
是我自己的类,但是
HttpUtility
具有相同的方法。
var postParams = new[] {
    new HttpParam("vb_login_username", "yourusername"),
    new HttpParam("cookieuser", "1"),
    new HttpParam("vb_login_password", "yourpassword"),
    new HttpParam("securitytoken", "guest"),
    new HttpParam("do", "login"),
};

string url = "http://warriorforum.com/login.php?do=login";
var container = new CookieContainer();
var buffer = Encoding.UTF8.GetBytes(GetQueryString(postParams));

var request = (HttpWebRequest)HttpWebRequest.Create(url);
request.CookieContainer = container;
request.UserAgent = "Mozilla/5.0";
request.Method = "POST";
request.KeepAlive = true;
request.AllowAutoRedirect = true;
request.CookieContainer = container;
request.ContentLength = buffer.Length;
request.ContentType = "application/x-www-form-urlencoded; charset=UTF-8";
request.Accept = "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8";

using (var requestStream = request.GetRequestStream())
    requestStream.Write(buffer, 0, buffer.Length);

using (var response = request.GetResponse())
{
    if (response.StatusCode == HttpStatusCode.OK || response.StatusCode == HttpStatusCode.NotModified)
    {
        using (var reader = new StreamReader(response.GetResponseStream()))
        {
            var result = reader.ReadToEnd();
            richTextBox1.Text = result; //this is to read the page source after the request
        }
    }
}