Witam
Dziś zacząłem się bawić HttpWebRequest oraz WebRequest w C#. Postanowiłem napisać aplikację, która sama będzie się logowała na określoną stronę.
Aby się zalogować trzeba wpisać nazwę użytkownika oraz hasło, aczkolwiek w formularzu jest ukryte pole, dla którego wartość zmienia się co ok. 5-10 minut. Na google chrome (na innych przeglądarkach też) po odświeżeniu strony wartość zostaje ta sama.
Problem się rozpoczyna tutaj - w C#, gdy za każdym razem wartość tego jest inna, przez co każda próba logowania jest nieudana.
Pobieranie ukrytej wartości (auth_token)
public string getToken()
{
string response = HttpGet("http://ask.fm/account/stream");
string token = Regex.Match(response, @"encodeURIComponent\('(.+)'\)").Groups[1].Value;
return token;
}
Proces logowania
public string Login()
{
string response = HttpGet("http://ask.fm/account/stream");
string token = Regex.Match(response, @"encodeURIComponent\('(.+)'\)").Groups[1].Value;
string parameters = "login=tarasverq%40yandex.ru&password=121995&follow=&like=&back=&remember_me=1&authenticity_token=" + System.Net.WebUtility.UrlEncode(token);
response = HttpPost(parameters);
return response;
}
Plus dwa dodatkowe kody:
string HttpPost(string parameters)
{
string targetUrl = "http://ask.fm/";
string sourceCode = string.Empty;
CookieCollection cookiesS = new CookieCollection();
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(targetUrl);
request.CookieContainer = cookies;
request.CookieContainer.Add(cookiesS);
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
cookiesS = response.Cookies;
var postBytes = parameters;
targetUrl = "http://ask.fm/session";
HttpWebRequest getRequest = (HttpWebRequest)WebRequest.Create(targetUrl);
getRequest.CookieContainer = cookies;
getRequest.CookieContainer.Add(cookiesS); //recover cookies First request
getRequest.Method = WebRequestMethods.Http.Post;
getRequest.UserAgent = "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/535.2 (KHTML, like Gecko) Chrome/15.0.874.121 Safari/535.2";
getRequest.AllowWriteStreamBuffering = true;
getRequest.ProtocolVersion = HttpVersion.Version11;
getRequest.AllowAutoRedirect = true;
getRequest.ContentType = "application/x-www-form-urlencoded";
byte[] byteArray = Encoding.ASCII.GetBytes(postBytes);
getRequest.ContentLength = byteArray.Length;
Stream newStream = getRequest.GetRequestStream(); //open connection
newStream.Write(byteArray, 0, byteArray.Length); // Send the data.
newStream.Close();
HttpWebResponse getResponse = (HttpWebResponse)getRequest.GetResponse();
using (StreamReader sr = new StreamReader(getResponse.GetResponseStream()))
{
sourceCode = sr.ReadToEnd();
}
return sourceCode;
}
public static string HttpGet(string URI)
{
System.Net.WebRequest req = System.Net.WebRequest.Create(URI);
System.Net.WebResponse resp = req.GetResponse();
System.IO.StreamReader sr = new System.IO.StreamReader(resp.GetResponseStream());
return sr.ReadToEnd().Trim();
}
Podczas klikania przycisku (button1) robię takie coś - textBox1.Text = Login().toString(); w celu sprawdzenia czy się zalogowałem, aczkolwiek za każdym razem jest strona do logowania.
Moje pytanie brzmi tak - czy da się zrobić coś takiego, aby za każdym razem gdy pobieram ten auth_token miał on taką samą wartość?
Na początku działałem na własnych kodach, ale ostatecznie pobrałem jakieś z neta.