Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Сети > Сохранение и использование Cookie


Автор: Poseidon 28.1.2007, 18:37
Появилась необходимость сохранять Cookie и потом, при последующем запуске программы их использовать.

Авторизуюсь на сайте, все ОК. Пытаюсь сохранить куки.

Сохраняю так:
Код

var Cookie: TStringList;
i: integer;
begin
Cookie:= TStringList.Create;

for i:= 0 to IdCookieManager.CookieCollection.Count-1 do
Cookie.Add(IdCookieManager.CookieCollection[i].CookieText);

Cookie.SaveToFile('Cookie.txt');
Cookie.Free;
end;


В Cookie.txt все сохраняется прекрасно. Но при поптытке загрузить обратно ничего не получается (сайт показывает что я не авторизован).

Загружаю обратно так

Код

var Cookie: TStringList;
i: integer;
begin
Cookie:= TStringList.Create;
Cookie.LoadFromFile('Cookie.txt');

IdCookieManager.CookieCollection.Clear;
for i:= 0 to Cookie.Count-1 do
IdCookieManager.CookieCollection.Add.CookieText:= Cookie.Strings[i];

Cookie.Free;
end;


При этом, если сравнить Cookie, каторые программа получает сама и каторые остались с предыдущего запуска (т.е. записались в файл), то они эдентичны. Может я не правильно их "подсовываю"?

Автор: Romikgy 28.1.2007, 19:07
Цитата(Poseidon @  28.1.2007,  17:37 Найти цитируемый пост)
IdCookieManager.CookieCollection.Add.CookieText:= Cookie.Strings[i];

Код

IdCookieManager.CookieCollection.AddSrcCookie(Cookie.Strings[i]);

так попробуй

Автор: Poseidon 29.1.2007, 01:34
Не прокатило.

Если уж никто не знает как нужно делать, то мот кто посоветует, где можно почитать про IdCookieManager.CookieCollection. Что тем делает Add, Add2, AddSrcCookie? В чем разница и т.п.
Только прошу не тыкать в полную документацию по Indy.

Автор: creas0ft 29.1.2007, 04:19
А время жизни куки?!
Может такое в самой куке?!

Автор: RA 29.1.2007, 22:20
ЛАжа этот ваш Инди, какой раз говорю слава ICS-у smile

PS:

А что если так
IdCookieManager1.AddCookie(USERNAME, 'http://www.host.com/login.php?');
IdCookieManager1.AddCookie2(PASSWORD, 'http://www.host.com/login.php?'); 

IdCookieManager.CookieCollection.Add.CookieText:=Cookie.Text



Автор: Poseidon 30.1.2007, 01:07
RA, не, залогинится-то у меня получается. Нужно сделать что-то вроди "сохранить пароль", только сохранять нужно не пароль, а состояние сайта. Т.е., зашел я на сайт, полазил по нему. В куках сохранилось где я был на сате, а где не был (сайт соответственно это все отображает). Пока сессия продолжается (т.е. пока не зактрою прогу), все ОК. Но как тольок я закрываю прогу, куки, понятное дело, уничтожаются, т.к. они хранятся в памяти. И при последующем запуске программы она (точнее сайт) думает, что я впервые на нем и опять начинает "светить" то, где программы уже побывала. А мне надо так загрузить программу, что бы сайт и не понял, что она вообще закрывалась. Вот. Сам не понял, но думаю вы догадаетесь что надо  smile 

Автор: RA 30.1.2007, 09:58
Poseidon, ДА это всё понятно, я как человек абсолютно не разбирающийся в Indy решил предположить вариант.


Там выше я имел в виду что:

ты куки добавляешь так 
for i:= 0 to Cookie.Count-1 do
IdCookieManager.CookieCollection.Add.CookieText:= Cookie.Strings[i]; 

а почемубы не сделать так

IdCookieManager.CookieCollection.Add.CookieText:= Cookie.text ?

Автор: CodeGold 23.7.2014, 08:52
Добавлю своих 5 копеек.


сохранение в файл
Код

procedure IdCookieManagerSaveFile(IdCookieManager: TIdCookieManager; dir: string);


загрузка из файла
Код

procedure IdCookieManagerLoadFile(var IdCookieManager: TIdCookieManager; domain, dir: string);


Код

procedure IdCookieManagerSaveFile(IdCookieManager: TIdCookieManager; dir: string);
var
  sl: TStringList;
  i: integer;
begin
  try
    sl := TStringList.Create;
    with IdCookieManager do
      for i := 0 to CookieCollection.Count - 1 do
        sl.Add(CookieCollection[i].CookieName + '=' + CookieCollection[i].Value);
    sl.SaveToFile(dir);
    sl.Free;
  except
  end;
end;

Код

procedure IdCookieManagerLoadFile(var IdCookieManager: TIdCookieManager; domain, dir: string);
var
  sl: TStringList;
  i: integer;
  idURI: TidURI;
begin
  try
    idURI := TidURI.Create(domain);
    sl := TStringList.Create;
    sl.LoadFromFile(dir);
    for i := 0 to sl.Count - 1 do
      IdCookieManager.CookieCollection.AddServerCookie(sl[i], idURI);
    sl.Free;
    idURI.Free;
  except
  end;
end;


delphi xe6

Автор: Poseidon 2.9.2014, 21:22
CodeGold, ты просто офигеть как вовремя. не прошло и 7,5 лет. 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)