2012-11-04 4 views
1

Я пытаюсь войти на форум с httpwerequests, но я не имел успеха до сих пор, это мой код:Не можете войти в систему с HttpWebRequests

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 
     } 
    } 
} 

После запроса ответ точно такой же странице, ничего не изменилось, ни одно сообщение не сообщило мне, что я вводил неверный пароль или что-то в этом роде.

+0

Возможно ли связать нас с соответствующей страницей? Различные форумы VBulletin используют разные уровни безопасности. На первый взгляд я не вижу ничего плохого в коде, но, по моему опыту с VBulletin, на странице входа в систему есть теги безопасности, которые вам нужно извлечь и опубликовать на странице (см. 'S' POST параметр, например) –

+0

Вы отправляете неправильный URL-адрес. Измените 'url' на' http: //warriorforum.com/login.php? Do = login' –

ответ

0

Я просто проверял, используя мой общий 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, а также.

+0

Все хорошее, но HttpUtils.UrlEncode, похоже, является частью рамки 4.5, я использую VS2010 –

+0

@FaTaL_ErRoR Измените 'HttpUtils' на' HttpUtility', как я уже упоминал, прежде чем большая часть моей библиотеки была переплетена, 'HttpUtils' является моим собственный класс, но 'HttpUtility' имеет идентичный метод. –

0

Кажется, что вы пропускаете что-то, что делает браузер, когда вы входите в систему ... этот форум действительно нужен POST или, возможно, GET? Правильны ли все ваши параметры? Может ли веб-страница отправлять дополнительный параметр (скрытый) при входе в браузер?

Вы должны увидеть, что на самом деле идет по проводам при входе вручную через браузер - использовать Wireshark или Fiddler, чтобы узнать, а затем имитировать то, что происходит в коде ...

+1

Да, я уверен, что форум использует GET для отправки регистрационных данных: 3 –

+1

Хорошо, спасибо, что проверим его с помощью wirehark in в минуту –

+0

POST http://www.warriorforum.com/login.php?do=login HTTP/1.1 –

Смежные вопросы