|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
Спарсить и передать Cookie
Проблемма распространёная, т.к. от версии к версии у indy всегда проблемы.
Пробывал спарсить так: Код:
For N:=0 To Http.Response.RawHeade rs.Count-1 Do Begin If Http.Response.Raw Headers.Names[N]='Set-Cookie' Then Begin CookieList.Add(Http.Response.R awHeaders.ValueFromIndex[N]); End; End; Cookie вида Set-Cookie:usNick=...; expires=Sat, 19 Mar 2011 01:34:06 GMT Set-Cookie:usPass=...; expires=Sat, 19 Mar 2011 01:34:06 GMT как их спарсить и передать не пойму, прошу помощи, уже незнаю даже куда рытьна ваш форум последняя надежда |
#2
|
||||
|
||||
Код:
IdHTTP1.Get('http://ya.ru/'); IdHTTP1.Response.RawHeaders.Extract('Set-Cookie', Memo1.Lines); Пишу программы за еду. __________________ |
#3
|
|||
|
|||
NumLock это понятно, я имел ввиду что если делать так
Код:
For N:=2 To FH.Response.Ra wHeaders.Count-1 Do Begin If FH.Respons e.RawHeaders.Names[N]='Set-Cookie' Then Begin CookieList.Add(FH.Response.RawHe aders.ValueFromIndex[N]); End; End; for N := 0 to CookieList.Count-1 do ShowMe ssage(CookieList[N]); Login; expires=Sat, 19 Mar 2011 01:34:06 GMT Password; expires=Sat, 19 Mar 2011 01:34:06 GMT но как тогда обрезать expires=Sat, 19 Mar 2011 01:34:06 GMT |
#4
|
||||
|
||||
Код:
unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, IdCookieManager, StdCtrls, IdBaseComponent, IdComponent, IdTCPConnection, IdTCPClient, IdHTTP; type TForm1 = class(TForm) IdHTTP1: TIdHTTP; Memo1: TMemo; IdCookieManager1: TIdCookieManager; Button1: TButton; procedure Button1Click(Sender: TObject); procedure FormCreate(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; implementation {$R *.dfm} procedure TForm1.Button1Click(Sender: TObject); var i: Integer; begin IdHTTP1.Get('http://forum29.ru'); for i:=0 to IdCookieManager1.CookieCollection.Count-1 do Memo1.Lines.Add(IdCookieManager1.CookieCollection[i].CookieName+'='+IdCookieManager1.CookieCollection[i].Value); end; procedure TForm1.FormCreate(Sender: TObject); begin IdHTTP1.CookieManager:=IdCookieManager1; end; end. Пишу программы за еду. __________________ |
#5
|
||||
|
||||
Можно еще про функцию Pos(';', ...) вспомнить, если именно HTTP заголовки парсить.
И причем тут проблемы инди - это стандартный формат заголовков, а expires задает время, до которого будет действительно ( надо хранить ) это значение куков. ( если я правильно помню ) |
#6
|
|||
|
|||
вобще я думал что expires=Sat, 19 Mar 2011 01:34:06 GMT задаёт сначала время получения куков, т.к. у меня не истекают, значет должен ещё один параметр передаваться, интрегующе звучит, чтож буду знатиь, а с POS у меня не получиться т.к их от одного и более там может быть
Последний раз редактировалось bulldog, 27.12.2010 в 15:41. |
#7
|
||||
|
||||
Цитата:
CookieManager уже предлагает расперсеные куки: Код:
IdHTTP1.CookieManager.CookieCollection[i].Comment IdHTTP1.CookieManager.CookieCollection[i].MaxAge IdHTTP1.CookieManager.CookieCollection[i].Version IdHTTP1.CookieManager.CookieCollection[i].CookieText IdHTTP1.CookieManager.CookieCollection[i].Domain IdHTTP1.CookieManager.CookieCollection[i].Expires IdHTTP1.CookieManager.CookieCollection[i].CookieName IdHTTP1.CookieManager.CookieCollection[i].Path IdHTTP1.CookieManager.CookieCollection[i].Secure IdHTTP1.CookieManager.CookieCollection[i].Value Пишу программы за еду. __________________ |
#8
|
||||
|
||||
Согласен с NumLock, что CookieManager-ом пользоваться удобнее.
На всякий случай проверил про expires: Цитата:
|
#9
|
|||
|
|||
NumLock я сделал так
Код:
for N:=0 to CM.CookieCollection.Count-1 do CookieList.Add(CM.CookieCollection[N].CookieName+'='+CM.CookieCollection[N].Value); for N := 0 to CookieList.Count-1 do ShowMessage(CookieList[N]); |
#10
|
||||
|
||||
ну если так хочется на половину все делать руками, то:
Код:
unit Unit1; interface uses IdHTTP, Dialogs, Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, StdCtrls, IdBaseComponent, IdComponent, IdTCPConnection, IdTCPClient; type TForm1 = class(TForm) Button1: TButton; Button2: TButton; Memo1: TMemo; Edit1: TEdit; procedure Button1Click(Sender: TObject); procedure Button2Click(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; implementation uses IdCookieManager, IdCookie; {$R *.dfm} procedure TForm1.Button1Click(Sender: TObject); var IdHTTP: TIdHTTP; stringstream: TStringStream; i: Integer; begin IdHTTP:=TIdHTTP.Create(nil); IdHTTP.AllowCookies:=True; { TIdCookieManager создавать не будем, ибо (Delphi 7): unit IdHTTP procedure TIdCustomHTTP.ProcessCookies(ARequest: TIdHTTPRequest; AResponse: TIdHTTPResponse); ... begin ... if not Assigned(FCookieManager) and AllowCookies then begin CookieManager := TIdCookieManager.Create(Self); FFreeOnDestroy := true; end; ... } IdHTTP.HandleRedirects:=True; // POST request stringstream:=TStringStream.Create('vb_login_username=имя&vb_login_password=пароль&cookieuser=1&s=&securitytoken=guest&do=login&vb_login_md5password=&vb_login_md5password_utf='); try IdHTTP.Request.ContentType:='application/x-www-form-urlencoded'; IdHTTP.Request.ContentLength:=stringstream.Size; IdHTTP.Post('http://forum29.ru/login.php?do=login', stringstream); // не дождетесь raise if IdHTTP.CookieManager=nil then raise Exception.Create('CookieManager=nil'); // в Edit1 соберем cookie Edit1.Text:=''; for i:=0 to IdHTTP.CookieManager.CookieCollection.Count-1 do Edit1.Text:=Edit1.Text+IdHTTP.CookieManager.CookieCollection[i].CookieName+'='+IdHTTP.CookieManager.CookieCollection[i].Value+';'; finally stringstream.Free; IdHTTP.Free; end; end; procedure TForm1.Button2Click(Sender: TObject); var IdHTTP: TIdHTTP; begin IdHTTP:=TIdHTTP.Create(nil); // руками добавим cookie IdHTTP.AllowCookies:=False; IdHTTP.HandleRedirects:=True; try // в Edit1 наши cookie IdHTTP.Request.CustomHeaders.Add('Cookie: '+Edit1.Text); Memo1.Text:=IdHTTP.Get('http://forum29.ru/'); Memo1.Lines.SaveToFile('c:\Downloads\forum29.htm'); finally IdHTTP.Free; end; end; end. по кнопке 1 авторизуемся и сохраняем куки в едите. по кнопке 2 получаем авторизованную страничку. а вот если использовать TIdCookieManager, то никакой канители вообще не нужно для cookie. в случае использования нескольких TIdHTTP естественно. Пишу программы за еду. __________________ Последний раз редактировалось NumLock, 28.12.2010 в 10:10. |
#11
|
|||
|
|||
под delhi 2010 со стандартым indy версеей мучений не было, появились после установки delhi xe с новой версией indy появились траблы в cookiemanager, но всё равно спс, ща попробую
|
#12
|
||||
|
||||
Цитата:
|