Я просто проверял, используя мой общий 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
Тогда что-то подобное тому, что у вас уже есть для размещения могут быть использованы, только чтобы иметь правильный URL. Я также использовал бы UTF8
кодировку при получении байтов строки запроса. Например (используя исходный код, слегка модифицированный)
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
}
}
}
Обратите внимание на изменения с ContentType
, а также.
Возможно ли связать нас с соответствующей страницей? Различные форумы VBulletin используют разные уровни безопасности. На первый взгляд я не вижу ничего плохого в коде, но, по моему опыту с VBulletin, на странице входа в систему есть теги безопасности, которые вам нужно извлечь и опубликовать на странице (см. 'S' POST параметр, например) –
Вы отправляете неправильный URL-адрес. Измените 'url' на' http: //warriorforum.com/login.php? Do = login' –