
| Если это ваш первый визит, рекомендуем почитать справку по форуму. Для размещения своих сообщений необходимо зарегистрироваться. Для просмотра сообщений выберите раздел. |
![]() |
||
[C#] И снова сookies...
|
||
| Философия, технологии, алгоритмы! |
![]() |
|
|
Опции темы |
|
|
#1 |
|
Форумец
Сообщений: 43
Регистрация: 20.05.2008
|
Доброго времени суток! Пытаюсь произвести авторизацию на 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();
}
Последний раз редактировалось Мамед; 14.11.2010 в 17:08. |
|
|
|
|
#2 |
|
Форумец
Сообщений: 43
Регистрация: 20.05.2008
|
Вопрос разрулился. Оказалось все просто и немного грустно. Все дело в том, шо это простой баг CookieContainer. Баг заключается в том, что, если в контейнер попадут куки с доменом,который начинается на точку, то контейнер не отправит их серверу. Мелкие исправили баг (тоже зарядили неплохо, видите ли в 2.0 - 3.5 исправлять не захотели, а исправили в 4.0, так шо пока 4.0 популярность и востребованность не наберет я больше не фанат фреймворка и мелких :-D). Обидно, канеш... Проблема решилась ручным добавлением 2 кукисов remixchk, remixsid с указанием домена без точки (vkontakte.ru вместо .vkontakte.ru). Авторизация прошла успешно. Я же благодарю вас за внимание (тех, кто, хотя бы, просто вчитались в суть проблемы), желаю вам не попадаться на это и запомнить про баг, желаю мелким не косячить так.
|
|
|
|
|
#5 |
|
Форумец
Сообщений: 43
Регистрация: 20.05.2008
|
Да норм штученцио, не обижайте дотнет))) Вот, кстати, vkAPI наверно зло
Никак не могу разобраться (точнее, якобы разобрался, но не срабатывает) с тем, как производить запрос. При этом куча примеров в гугле ничем не помогли, установил даже тестовое приложение вконтакте, выставил в нем параметры 1 в 1 (мол вдруг я в коде у себя что-то не так сделал, или в голове что-то недопонял) так он мне такой же код оишбки что и мой код выдает, мол неверная подпись. Подробнее см. здесь
|
|
|