Задать вопрос

Авторизация на ru.grepolis.com C# + .NET

Пытаюсь написать код авторизации на ru.grepolis.com

Но застрял на втором шаге.
Первым отправляю Get запрос, получаю куки:

                request = (HttpWebRequest)HttpWebRequest.Create("http://ru.grepolis.com");
                //request.Proxy = new WebProxy("127.0.0.1", 8888);

                request.UserAgent = "Mozilla/5.0 (Windows NT 6.1; rv:17.0) Gecko/20100101 Firefox/17.0";
                request.Accept = "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8";
                request.Headers.Add("Accept-Language", "ru-ru,ru;q=0.8,en-us;q=0.5,en;q=0.3");
                request.KeepAlive = true;
                
                HttpWebResponse response = (HttpWebResponse)request.GetResponse();

                string sCookies = "";
                if (!String.IsNullOrEmpty(response.Headers["Set-Cookie"]))
                {
                    sCookies = response.Headers["Set-Cookie"];
                }


Затем, используя полученные куки отправляю Post запрос:

                request = (HttpWebRequest)HttpWebRequest.Create("http://ru.grepolis.com/start/index?action=login_from_start_page");
                request.Method = "POST";
                request.Referer = "http://ru.grepolis.com";
                request.UserAgent = "Mozilla/5.0 (Windows NT 6.1; rv:17.0) Gecko/20100101 Firefox/17.0";
                request.Accept = "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8";
                request.Headers.Add("Accept-Language", "ru-ru,ru;q=0.8,en-us;q=0.5,en;q=0.3");
                request.KeepAlive = true;
                request.ContentType = "application/x-www-form-urlencoded";

                // передаем куки, полученные в предыдущем запросе
                if (!String.IsNullOrEmpty(sCookies))
                {
                    request.Headers.Add(HttpRequestHeader.Cookie, sCookies);
                }


                request.AllowAutoRedirect = true;

                // Формируем строку с параметрами
                string secondStepForm = "json={\"name\":\"*********\",\"password\":\"***********\",\"passwordhash\":\"\",\"autologin\":false,\"window_size\":\"1263x535\"}";

                // передаем параметры
                byte[] EncodedPostParams = Encoding.ASCII.GetBytes(secondStepForm);
                request.ContentLength = EncodedPostParams.Length;

                // Записываем данные в поток
                request.GetRequestStream().Write(EncodedPostParams, 0, EncodedPostParams.Length);

                request.GetRequestStream().Close();
                // делаем запрос
                response = (HttpWebResponse)request.GetResponse();


Но он не проходит.
В чем может быть причина? Неправильные параметры Post или куки или еще что? Самому не получается разобраться.

Заголовки вроде идентичные с браузером передаю.

Мои куки почему то имеют другой вид, нежели чем передает браузер… Может в этом проблема?

Вот куки которые передает браузер:
PHPSESSID=JoHVf8NpzGf-uhyY8FXS91; cid=954932142; portal_tid=1355466714195-86254; portal_data=portal_tid=1355466714195-86254

А вот мои куки:
PHPSESSID=ssuvQVWUBcQqSlViFw-SE2; path=/,cid=308647358; expires=Sun, 14-Dec-2014 06:35:43 GMT; path=/

Почему так?
  • Вопрос задан
  • 5384 просмотра
Подписаться 4 Оценить Комментировать
Пригласить эксперта
Ответы на вопрос 4
ForhaxeD
@ForhaxeD
Посмотрите с помощью какого-нибудь сниффера (например WireShark) — что именно идет на сервер и с сервера в случае браузера <-> сайта и посмотрите, что идет с помощью вашего приложения <-> сайта.
Ответ написан
Комментировать
Seganapa
@Seganapa Автор вопроса
С одной проблемой вроде разобрался, не хватало
request.ServicePoint.Expect100Continue = false;


Теперь вопрос по request.KeepAlive = true;
Почему в первом запросе параметр передается нормально, а второй раз не отображается в заголовках, хотя я эту строку добавляю?

И второй вопрос:
Снифер показывает, если использовать обычный браузер, к кукам добавляется строчка:
portal_tid=1355502826904-62628

1355502826904 — это я так понимаю unix время, а вот что это — 62628?

Что это может быть ума не приложу? Буду рад любой помощи.

Как получить 10-ти значное unix время я знаю:
Код:

int unixTime = (int)(DateTime.UtcNow - new DateTime(1970, 1, 1)).TotalSeconds;


А вот как получить 13-ти значное? Это я так понял миллисекунды или я не прав?
Ответ написан
Комментировать
trolostasik
@trolostasik
С такими вопросами, курите лучше основы.
Ответ написан
Комментировать
Seganapa
@Seganapa Автор вопроса
Да ну в каких же основах мне расскажут что это за вставка в конце Unix Timestamp?
Может кто-то сталкивался на практике с этим? Или в силу опыта может знать что это…

Как получить 13-ти значное значение миллисекунд вроде разобрался:
long unixTime = (DateTime.Now.ToUniversalTime().Ticks - 621355968000000000) / 10000;


А вот что это в конце, так и не понял???
portal_tid=1355502826904-62628
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы