Большой Воронежский Форум
» Программирование>[C#] И снова сookies...
Мамед 16:47 14.11.2010
Доброго времени суток! Пытаюсь произвести авторизацию на vkontakte.ru, но не выходит, т.к. работа с кукисами не продвигается никак. Сетевой прокси-отладчик fiddler показывает, что ни 1 кукиса не передается серверу контактовскому, в то время как отладчик студии показывает мне что в CookieContainer все ок, куки на месте. Перепробовал по-разному, никак не могу понять в чем дело.

Код:
public static void LogIn(string login, string pass)
{
	/////////////////////////////////////////ЗАПРОС 1
	HttpWebRequest hwr = (HttpWebRequest) WebRequest.Create("http://vkontakte.ru/login.php");
	hwr.Method = "POST";
	hwr.ProtocolVersion = HttpVersion.Version10;
	hwr.UserAgent = "Opera/9.80 (Windows NT 6.1; U; ru) Presto/2.6.30 Version/10.62";
	hwr.Accept = "text/html, application/xml;q=0.9, application/xhtml+xml, */*;q=0.1";
	hwr.Headers.Add("Accept-Language", "ru-RU,ru;q=0.9,en;q=0.8");
	hwr.Headers.Add("Accept-Charset", "iso-8859-1, utf-8, utf-16, *;q=0.1");
	hwr.Headers.Add("Accept-Encoding", "deflate, gzip, x-gzip, identity, *;q=0");
	hwr.Referer = "http://vkontakte.ru";
	hwr.ContentType = "application/x-www-form-urlencoded";
	hwr.ServicePoint.Expect100Continue = false;
	hwr.ContentLength = 18;
	CookieContainer cc = new CookieContainer();
	hwr.CookieContainer = cc;

	StreamWriter sw = new StreamWriter(hwr.GetRequestStream());
	sw.Write("op=a_login_attempt");
	sw.Close();
	HttpWebResponse wr = (HttpWebResponse) hwr.GetResponse();
	cc = hwr.CookieContainer;
	wr.Close();

	/////////////////////////////////////////ЗАПРОС 2
	hwr = (HttpWebRequest) WebRequest.Create("http://login.vk.com/?act=login");
	hwr.Method = "POST";
	hwr.ProtocolVersion = HttpVersion.Version10;
	hwr.UserAgent = "Opera/9.80 (Windows NT 6.1; U; ru) Presto/2.6.30 Version/10.62";
	hwr.Accept = "text/html, application/xml;q=0.9, application/xhtml+xml, */*;q=0.1";
	hwr.Headers.Add("Accept-Language", "ru-RU,ru;q=0.9,en;q=0.8");
	hwr.Headers.Add("Accept-Charset", "iso-8859-1, utf-8, utf-16, *;q=0.1");
	hwr.Headers.Add("Accept-Encoding", "deflate, gzip, x-gzip, identity, *;q=0");
	hwr.Referer = "http://vkontakte.ru/";
	hwr.ContentType = "application/x-www-form-urlencoded";
	hwr.ServicePoint.Expect100Continue = false;
	hwr.CookieContainer = cc;

	//Пишем в поток логин и пасс
	sw = new StreamWriter(hwr.GetRequestStream());
	sw.Write("email=" + Uri.EscapeDataString(login) + "&pass=" + Uri.EscapeDataString(pass) + "&expire=&vk=&al_test=1");
	sw.Close();

	//Получили сжатые GZip данные - распаковываем
	wr = (HttpWebResponse) hwr.GetResponse();
	cc = hwr.CookieContainer;
	Stream input = wr.GetResponseStream();
	GZipStream gz = new GZipStream(input, CompressionMode.Decompress);
	byte[] buffer = new byte[1024];
	gz.Read(buffer, 0, 1024);
	gz.Close();
	gz.Dispose();
	wr.Close();
			

	//Достаем код из распакованных данных
	string content = ASCIIEncoding.ASCII.GetString(buffer);
	Regex rx = new Regex("value='[^']+");
	string sid = rx.Match(content).ToString().Remove(0, 7);


	/////////////////////////////////////////ЗАПРОС 3
	hwr = (HttpWebRequest)
		WebRequest.Create("http://vkontakte.ru/login.php");
	hwr.Method = "POST";
	hwr.ProtocolVersion = HttpVersion.Version10;
	hwr.UserAgent = "Opera/9.80 (Windows NT 6.1; U; ru) Presto/2.6.30 Version/10.62";
	hwr.Accept = "text/html, application/xml;q=0.9, application/xhtml+xml, */*;q=0.1";
	hwr.AllowAutoRedirect = true;
	hwr.Headers.Add("Accept-Language", "ru-RU,ru;q=0.9,en;q=0.8");
	hwr.Headers.Add("Accept-Charset", "iso-8859-1, utf-8, utf-16, *;q=0.1");
	hwr.Headers.Add("Accept-Encoding", "deflate, gzip, x-gzip, identity, *;q=0");
	hwr.Referer = "http://login.vk.com/?act=login";
	hwr.ContentType = "application/x-www-form-urlencoded";
	hwr.ServicePoint.Expect100Continue = false;
	hwr.CookieContainer = cc;

	sw = new StreamWriter(hwr.GetRequestStream());
	sw.Write("s=" + sid + "&op=slogin&redirect=1&expire=0&to=&al_test=1");
	sw.Close();
	wr = (HttpWebResponse) hwr.GetResponse();
	wr.Close();
}
[Ответ]
Мамед 22:12 15.11.2010
Вопрос разрулился. Оказалось все просто и немного грустно. Все дело в том, шо это простой баг CookieContainer. Баг заключается в том, что, если в контейнер попадут куки с доменом,который начинается на точку, то контейнер не отправит их серверу. Мелкие исправили баг (тоже зарядили неплохо, видите ли в 2.0 - 3.5 исправлять не захотели, а исправили в 4.0, так шо пока 4.0 популярность и востребованность не наберет я больше не фанат фреймворка и мелких :-D). Обидно, канеш... Проблема решилась ручным добавлением 2 кукисов remixchk, remixsid с указанием домена без точки (vkontakte.ru вместо .vkontakte.ru). Авторизация прошла успешно. Я же благодарю вас за внимание (тех, кто, хотя бы, просто вчитались в суть проблемы), желаю вам не попадаться на это и запомнить про баг, желаю мелким не косячить так. [Ответ]
Part!zan 22:40 15.11.2010
.net - зло, адназначна ) [Ответ]
mexx 13:20 18.11.2010
ды чо, милая простыня кода [Ответ]
Мамед 10:01 19.11.2010
Да норм штученцио, не обижайте дотнет))) Вот, кстати, vkAPI наверно зло Никак не могу разобраться (точнее, якобы разобрался, но не срабатывает) с тем, как производить запрос. При этом куча примеров в гугле ничем не помогли, установил даже тестовое приложение вконтакте, выставил в нем параметры 1 в 1 (мол вдруг я в коде у себя что-то не так сделал, или в голове что-то недопонял) так он мне такой же код оишбки что и мой код выдает, мол неверная подпись. Подробнее см. здесь [Ответ]
Вверх