![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
#1
|
|||
|
|||
|
Проблемма распространёная, т.к. от версии к версии у 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
|
||||
|
||||
|
Цитата:
) |