Модераторы: Snowy, Poseidon, MetalFan

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Логин по IdHTTP на php сервер 
V
    Опции темы
chekist
Дата 19.6.2007, 10:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 27
Регистрация: 19.6.2007

Репутация: нет
Всего: 2



Вопрос такой: нужно залогиниться с помощью delphi (idHTTP) на сервер (php) и загрузить ряд страниц.

Сервер: http://vkontakte.ru

Делаю так:

Код


var
  str:TStringList;
begin

  str:=TStringList.Create;
  str.Add('[email protected]');
  str.Add('pass=yyy');

  // попытка логина
  RichEdit1.Lines.Add(IdHTTP1.Post('http://vkontakte.ru/login.php',str));
  RichEdit1.Lines.Add(IdHTTP1.Response.Location);
  RichEdit1.Lines.Add(IdHTTP1.Response.ResponseText);

  // попытка получить страницу
  RichEdit1.Lines.Add(IdHTTP1.Get('profile.php'));

  str.Free;
end;



После запроса Post выдает  HTTP/1.1 302 Found    и предлагает перейти на страницу  profile.php . Вроде так и должно быть.
Но когда пытаюсь получить страницу, пишет:  Чтобы просматривать эту страницу, нужно зайти на сайт .

CookieManager прикрутил стандартным способом, через компоненты.

Нашел на форуме тему с подобной проблемой:  http://forum.vingrad.ru/topic-81091.html
Там проблемы разрешились. Вроде делаю все так же, но проблемы остаются.

Спасибо.  
PM MAIL   Вверх
Snowy
Дата 19.6.2007, 10:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

Репутация: 53
Всего: 484



Включи HandleRedirects - он сам перейдёт, куда нужно.
Также посмотри сниффером или маппером, что шлёт браузер, а что ты.
PM MAIL   Вверх
chekist
Дата 19.6.2007, 17:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 27
Регистрация: 19.6.2007

Репутация: нет
Всего: 2



Посмотрел маппером. Кажется у меня что-то странное творится с Cookie.

В ответ на запрос POST, как и ожидалось,  приходит ответ с Cookie.
Однако в следующем запросе GET Indy никаких Cookie не вставляет (в отличие от браузера).

Может я как-то неправильно подключил/настроил CookieManager ?
PM MAIL   Вверх
aktuba
Дата 19.6.2007, 18:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Смышленный
***


Профиль
Группа: Завсегдатай
Сообщений: 1915
Регистрация: 24.4.2006
Где: Планета Земля

Репутация: 9
Всего: 38



Цитата

Может я как-то неправильно подключил/настроил CookieManager ? 


А ты прописал его в IdHTTP?


--------------------
user posted image
PM MAIL WWW Skype   Вверх
chekist
Дата 19.6.2007, 18:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 27
Регистрация: 19.6.2007

Репутация: нет
Всего: 2



aktuba
Я кинул на форму компонент IdCookieManager, добавил его через инспектор в 
свойстве CookieManager у компонента IdHTTP и выставил AllowCookies в true.


PM MAIL   Вверх
Snowy
Дата 19.6.2007, 19:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

Репутация: 53
Всего: 484



chekist, в IdHttp менеджер куков нужно указать.
Свойство CookieManager IdHTTP - выбери его. Иначе он просто валяться будет, но никак не работать...
PM MAIL   Вверх
chekist
Дата 19.6.2007, 20:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 27
Регистрация: 19.6.2007

Репутация: нет
Всего: 2



Snowy
Цитата

в IdHttp менеджер куков нужно указать.
Свойство CookieManager IdHTTP - выбери его. Иначе он просто валяться будет, но никак не работать...


Чего-то я не совсем понял. А я что по-твоему сделал?
PM MAIL   Вверх
aktuba
Дата 19.6.2007, 20:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Смышленный
***


Профиль
Группа: Завсегдатай
Сообщений: 1915
Регистрация: 24.4.2006
Где: Планета Земля

Репутация: 9
Всего: 38



chekist, выложи проект тестовый - посмотрим. Так трудно сказать.


--------------------
user posted image
PM MAIL WWW Skype   Вверх
chekist
Дата 19.6.2007, 20:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 27
Регистрация: 19.6.2007

Репутация: нет
Всего: 2



Цитата

chekist, выложи проект тестовый - посмотрим. Так трудно сказать.


O.K. Вот проект.

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

Это сообщение отредактировал(а) chekist - 19.6.2007, 20:56

Присоединённый файл ( Кол-во скачиваний: 178 )
Присоединённый файл  Vkontakt.zip 3,54 Kb
PM MAIL   Вверх
aktuba
  Дата 20.6.2007, 03:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Смышленный
***


Профиль
Группа: Завсегдатай
Сообщений: 1915
Регистрация: 24.4.2006
Где: Планета Земля

Репутация: 9
Всего: 38



chekist, за такую задачку я бы тебе поставил плюс, но думаю рановато для тебя =)

Итак. Задачка действительно оказалась интересной и, не скрою, я ее не до конца еще решил... Надо будет покопаться поглубже, для того чтобы найти красивое решение. Но если в кратце, то проблема в следующем. Вот так выглядит установка куков для этого сайта:
Код

Set-Cookie: remixchk=2; expires=Thu, 19-Jun-2008 00:55:33 GMT; path=/; domain=.vkontakte.ru
Set-Cookie: remixmid=23452; expires=Thu, 19-Jun-2008 00:55:33 GMT; path=/; domain=.vkontakte.ru
Set-Cookie: remixemail=aktuba%40yandex.ru; expires=Thu, 19-Jun-2008 00:55:33 GMT; path=/; domain=.vkontakte.ru
Set-Cookie: remixpass=52120febf525e8abeb9c95e9dce2c930; expires=Thu, 19-Jun-2008 00:55:33 GMT; path=/; domain=.vkontakte.ru


Вся проблема кроется в том, что в куках прописано на какой домен ставить эту куку: path=/; domain=.vkontakte.ru
Браузеры такое глотают легко, просто отбрасывая точку впереди, а вот Indy на этом валиться по следующей причине:

Код

  ACookie.CookieText := ACookieText;

  if Length(ACookie.Domain) = 0 then LDomain := AHost
  else LDomain := ACookie.Domain;

  ACookie.Domain := LDomain;

  if ACookie.IsValidCookie(AHost) then
  begin
    if DoOnNewCookie(ACookie) then
    begin
      FCookieCollection.AddCookie(ACookie);
    end
    else begin
      ACookie.Collection := nil;
      ACookie.Free;
    end;
  end
  else begin
    ACookie.Free;
  end;


Тут видно, что именно для .vkontakte.ru будут ставиться куки, а не для vkontakte.ru. Если покопаться дальше, то можно найти вот такие сравнения:
Код

Result := ((IndyPos('.', S) = 0) or (S[1] <> '.')) and NOT IsValidIP(S);


Как не трудно понять - эти сравнения всегда будут давать False, если домен, для которого устанавливается кука, впереди содержит точку. Вот и вся проблема =)))) Решение, на данный момент, простое. В модуль IdCookieManager, в процедуру DoAdd надо добавить одну строку:
Код

if LDomain[1] = '.' then LDomain := Copy(LDomain, 2, Length(LDomain) - 1);


Теперь эта процедура будет выглядеть так:
Код

procedure TIdCookieManager.DoAdd(ACookie: TIdCookieRFC2109; ACookieText, AHost: String);
Var
  LDomain: String;
begin
  ACookie.CookieText := ACookieText;

  if Length(ACookie.Domain) = 0 then LDomain := AHost
  else LDomain := ACookie.Domain;

  if LDomain[1] = '.' then LDomain := Copy(LDomain, 2, Length(LDomain) - 1);
  ACookie.Domain := LDomain;

  if ACookie.IsValidCookie(AHost) then
  begin
    if DoOnNewCookie(ACookie) then
    begin
      FCookieCollection.AddCookie(ACookie);
    end
    else begin
      ACookie.Collection := nil;
      ACookie.Free;
    end;
  end
  else begin
    ACookie.Free;
  end;
end;


После этого все работает нормально. Но повторяю - это половинчатое решение...

Это сообщение отредактировал(а) aktuba - 20.6.2007, 03:54


--------------------
user posted image
PM MAIL WWW Skype   Вверх
chekist
Дата 20.6.2007, 13:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 27
Регистрация: 19.6.2007

Репутация: нет
Всего: 2



Круто!  А существует способ работы с Cookies без CookieManager ?
Как-нибудь их вручную вытаскивать из Responce и вставлять в Request через свойства IdHTTP.


Это сообщение отредактировал(а) chekist - 20.6.2007, 13:58
PM MAIL   Вверх
aktuba
Дата 20.6.2007, 14:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Смышленный
***


Профиль
Группа: Завсегдатай
Сообщений: 1915
Регистрация: 24.4.2006
Где: Планета Земля

Репутация: 9
Всего: 38



Цитата

Круто!  А существует способ работы с Cookies без CookieManager ?
Как-нибудь их вручную вытаскивать из Responce и вставлять в Request через свойства IdHTTP.


Ты не понял - они даже в Response не попадают... С куками можно работать через WinInet, но это уже не так просто, как с Indy.


--------------------
user posted image
PM MAIL WWW Skype   Вверх
chekist
Дата 20.6.2007, 18:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 27
Регистрация: 19.6.2007

Репутация: нет
Всего: 2



В ообщем, спасибо aktuba за помощь и потраченное на нее время. 

Проект дальше будет писаться на Builder'e. Там есть один замечательный компонент - Fast Net  NMHTTP. В нем с куками тоже не все в порядке, но по крайней мере есть прямой доступ к Header и Cookie, и если что, нужные данные можно распарсить. 

Также благодарю Snowy за его маппер.

Удачи!

Это сообщение отредактировал(а) chekist - 20.6.2007, 20:50
PM MAIL   Вверх
Snowy
Дата 20.6.2007, 20:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

Репутация: 53
Всего: 484



chekist, в TIdHttp тоже можно к хедерам обращаться.
А FastNet уже устарел и больше не поддерживается.
В новых версиях билдера его уже нет.
Так что возникнут проблемы с переходом на новую версию билдера.
Видать старый билдер у тебя. 6-й небось. В 6-й дельфи эти компоненты тоже были...
PM MAIL   Вверх
aktuba
Дата 20.6.2007, 22:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Смышленный
***


Профиль
Группа: Завсегдатай
Сообщений: 1915
Регистрация: 24.4.2006
Где: Планета Земля

Репутация: 9
Всего: 38



Цитата

Проект дальше будет писаться на Builder'e. Там есть один замечательный компонент - Fast Net  NMHTTP. В нем с куками тоже не все в порядке, но по крайней мере есть прямой доступ к Header и Cookie, и если что, нужные данные можно распарсить. 


=)))) А чем тебе уже готовое решение не угодило?


--------------------
user posted image
PM MAIL WWW Skype   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Сети"
Snowy
Poseidon
MetalFan

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делится вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи

Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Snowy, Poseidon, MetalFan.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Сети | Следующая тема »


 




[ Время генерации скрипта: 0.1230 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.