Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Delphi Cookies mit TIdCookieManager und TIdHTTP (https://www.delphipraxis.net/122219-cookies-mit-tidcookiemanager-und-tidhttp.html)

vlees91 11. Okt 2008 14:24


Cookies mit TIdCookieManager und TIdHTTP
 
habe ein bisher soweit funktionierendes Programm gemacht was von vielen getesteten Seiten die Cookies schoen akzeptiert und mir auch anzeigt (als zwischenprodukt; sinn des programms ist ein anderer)
Allerdings bei der Seite wofuer das Programm am Ende verwendet werden soll (uploaded.to) tritt ein Problem mit den Cookies auf: uploaded.to meldet dass mein Browser die Cookies nicht akzeptieren wuerde obwohl AllowCookies an ist, VAccept in der OnNewCookie procedure auf true ist und der CookieManager bei anderen Seiten auch ganz gut funktioniert.
Weiss einer woran das liegt?

vlees91 12. Okt 2008 20:06

Re: Cookies mit TIdCookieManager und TIdHTTP
 
push :'(

Zacherl 12. Okt 2008 23:41

Re: Cookies mit TIdCookieManager und TIdHTTP
 
Würde mich auch interesieren. Hab nämlich exakt das selbe Problem.

littleDave 13. Okt 2008 00:39

Re: Cookies mit TIdCookieManager und TIdHTTP
 
Schon mit idHTTP1.Request.UserAgent etwas rumgespielt? Vielleicht lesen die das ja aus und entscheiden dann anhand einer Datenbank, ob ein Browser Cookies akzeptiert oder nicht

vlees91 13. Okt 2008 14:07

Re: Cookies mit TIdCookieManager und TIdHTTP
 
steht schon laengst auf IE7 und klappt leider nicht (im IE7 klappts aber manuell)

shmia 13. Okt 2008 16:10

Re: Cookies mit TIdCookieManager und TIdHTTP
 
Uploaded.to verwendet doch auch Java-Script.
Schalte mal Java-Script in deinem Browser ab und prüfe hier (http://www.heise.de/security/dienste...tests/js.shtml) ob's wirklich aus ist.
Und dann schau mal, ob du auf Uploaded.to noch arbeiten kannst.

vlees91 13. Okt 2008 19:57

Re: Cookies mit TIdCookieManager und TIdHTTP
 
hab ich schon nachgesehen: die cookies werden nicht mit JS geschrieben und ausserdem haben die ein eigenes tool zum uploaden direkt von windows aus

vlees91 16. Okt 2008 15:37

Re: Cookies mit TIdCookieManager und TIdHTTP
 
das offizielle Porgramm logged sich so ein:
Code:
POST /login HTTP/1.1..Accept: */*..Cache-Control: no-cache..Content-Length: 242..Content-Type: multipart/form-data; boundary=---------------------------e5f210926b..Connection: Close..Host: uploaded.to..Pragma: no-cache..Referer: [url]http://uploaded.to/..User-Agent:[/url] Uploaded.to-Uploader V1.0....-----------------------------e5f210926b..Content-Disposition: form-data; name="email"....USR123..-----------------------------e5f210926b..Content-Disposition: form-data; name="password"....PWDHIER!..-----------------------------e5f210926b--.....
mein Programm macht das ein wenig anders: zuerst ruft der die login datei auf unf schickt als 2. Packet die logindaten hinterher
der code dazu funktioniert aber auf anderen Seiten auch wunderbar:
Delphi-Quellcode:
procedure TForm1.login(username, password: string);
var
  lStream: TMemoryStream;
  lParams: TStringStream;
  result: string;
begin
  result := '';
  lStream := TMemoryStream.create;
  lParams := TStringStream.create('');
    MyHTTP.Request.ContentType := 'application/x-www-form-urlencoded';
    MyHTTP.Request.Referer := 'http://uploaded.to/';          
    MyHTTP.Request.UserAgent := 'Uploaded.to-Uploader V1.0';

    lParams.WriteString('email='+ username +'&password='+ password);

      MyHTTP.Post('http://uploaded.to/login',
                 lParams,
                 lStream);
    SetLength(Result,lStream.Size);
    lStream.Position:=0;
    lStream.ReadBuffer(Result[1],lStream.Size);
    Memo2.Text := result; //temporaer um anzuzeigen was rauskommt. bisher immer eine HTML Seite die behauptet ich akzpetiere keine Cookies
    lParams.Free;
    lStream.Free;
end;
hier noch das was alles intialisiert wird wenn ich das prog starte:
Delphi-Quellcode:
procedure TForm1.FormCreate(Sender: TObject);
begin
  MyCookie := TIdCookieManager.Create(self);
  MyCookie.OnNewCookie := NewCookie;
  MyHTTP := TIdHTTP.Create(self);
  MyHTTP.AllowCookies := true;
  MyHTTP.CookieManager := MyCookie;
  MyHttp.HandleRedirects := true;
  MyHttp.OnRedirect := Redirection;
  login('USR123', 'PWDHIER!');    
  stopCheck := false; //alles hier nach hat nichts mit der funktionalitaet der cookies zu tun also nicht drauf achten
  dead := 0;
  if fileexists('lines.txt') then
    Memo1.Lines.LoadFromFile('lines.txt');
end;
und bitte auch nicht meckern ueber das nicht anwesend sein von try strukturen :P

vlees91 26. Okt 2008 07:10

Re: Cookies mit TIdCookieManager und TIdHTTP
 
leider noch ein PUSH

@post hiervor: die Punkte in dem Packet sind nicht unbedingt Punkte sondern sind Punkte+unlesbare Zeichen... sry hab vergessen das genaue Packet zu kopieren :'(

geskill 26. Okt 2008 11:22

Re: Cookies mit TIdCookieManager und TIdHTTP
 
Hi,
du benutzt für die Parameterliste (Name, Passwort)
einen "TStringStream", dass hat bei mir nie so richtig
funktioniert.
Am besten versuchst du es mal mit:

Delphi-Quellcode:
uses
  IdMultiPartFormData;

//[...]

procedure TForm1.login(username, password: string);
var
  Params:TIdMultiPartFormDataStream;
  lParams: TStringStream;
  result: string;
begin
  result := '';
  lStream := TMemoryStream.create;
  Params := TIdMultiPartFormDataStream.Create;
  TRY
    MyHTTP.Request.ContentType := 'application/x-www-form-urlencoded';
    MyHTTP.Request.Referer := 'http://uploaded.to/';          
    MyHTTP.Request.UserAgent := 'Uploaded.to-Uploader V1.0';

    Params.AddFormField('email',username);
    Params.AddFormField('password',password);  

    lStream := MyHTTP.Post('http://uploaded.to/login',Params);
 
    SetLength(Result,lStream.Size);
    lStream.Position:=0;
    lStream.ReadBuffer(Result[1],lStream.Size);
    Memo2.Text := result; //temporaer um anzuzeigen was rauskommt. bisher immer eine HTML Seite die behauptet ich akzpetiere keine Cookies
  FINALLY
    FreeAndNIL(Params);
    lStream.Free;
  END;
end;
Vielleicht hat das Login nicht geklappt und deshalb wird ausgegeben das die Cookies nicht aktiviert sind?
Du kannst es ja mal versuchen ;)

Grüße

vlees91 26. Okt 2008 19:05

Re: Cookies mit TIdCookieManager und TIdHTTP
 
sieht nicht danach aus, dass das klappt...
Imernoch bekomme ich eine Loginseite als Result.
Achja: ich musste ine Zeile anpassen: lStream := MyHTTP.... wurde zu MyHTTP(...,Params,lStream); da sonst der Fehler kam dass memorystream und string inkompatibel seien

Agent159 26. Okt 2008 20:22

Re: Cookies mit TIdCookieManager und TIdHTTP
 
aus irgendwelchen Gründen funktionier bei den neueren Version des Indy-Pakets die Cookieübergabe und -Speicherung komplett garnicht!

Ich habs mit der 9er und 10er Version versucht, es klappte nur mit den älteren per IdHTTP empfangene Cookies zu speichern, bzw. wurde das mit AllowCookies schon automatisch gemacht.

vlees91 27. Okt 2008 14:37

Re: Cookies mit TIdCookieManager und TIdHTTP
 
Wie ich aber schon schrieb ist es merkwuerdig dass die Cookies anderer Seiten zugelassen werden (Ich lasse mir ne MessageBox geben sobald eine Seite ueberhaupt versucht einen Keks zu hinterlassen aber beim Login auf uploaded.to wird diese Funktion garnicht erst aufgerufen...
ich werde mal weitersuchen...

vlees91 28. Okt 2008 21:26

Re: Cookies mit TIdCookieManager und TIdHTTP
 
habe jetzt mal die Packets des offiziellen Programms mit denen des Safari Browsers und meinem Programm verglichen:
Fakt: Alle drei bekommen das zu schreibende Cookie mitgeteilt aber mein Programm liest es grade bei diesem Server nicht ein

Code:
HTTP/1.1 302 Found..Date: Tue, 28 Oct 2008 21:21:07 GMT..Server: Apache/2.2.3 (Ubuntu) mod_python/3.2.10 Python/2.5.1..Location: /login?coo=1..Cache-Control: no-cache="set-cookie"..Set-Cookie: lang=en; path=/; domain=.uploaded.to; expires=Fri, 28-Oct-2011 21:21:07 GMT..Set-Cookie: auth=1234567890abcdef1234567890abcdef1234567; path=/; domain=.uploaded.to; expires=Fri, 28-Oct-2011 21:21:07 GMT..Connection: close..Content-Type: text/plain; charset=UTF-8....

The document has moved [url="/login?coo=1"]here[/url]</p>.
die lange hexzahl in der mitte ist das tatsaechliche cookie
nur mein Programm speichert es nicht (im OnCookie event was wiegesagt von allen anderen bisher getesteten Seiten die Cokies speichert.
Also am TIdHTTP wirds imho nicht liegen. werde also jetzt beim TIdCookieManager weitersuchen denke ich mal

(ist es eig genug IdHTTP.AllowCookies := true und IdHTTP.CookieManager := IdCookieManager einzustellen?)

vlees91 29. Nov 2008 10:24

Re: Cookies mit TIdCookieManager und TIdHTTP
 
zur info: mit Curl funktionierts einwandfrei: einziges Problem: libcurl fuer Delphi ist total veraltet und von daher scheint mir Indy eben praktischer weils direkt bei Delphi dabei ist
Code:
<?php
$ch = curl_init();
curl_setopt($ch, CURLOPT_COOKIEJAR, "/tmp/cookieFileName");
curl_setopt($ch, CURLOPT_URL,"http://www.uploaded.to/login");
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, "email=EMAIL&password=PASSWORD");

ob_start();     // prevent any output
curl_exec ($ch); // execute the curl command
ob_end_clean(); // stop preventing output

curl_close ($ch);
unset($ch);

$ch = curl_init();
curl_setopt($ch, CURLOPT_RETURNTRANSFER,1);
curl_setopt($ch, CURLOPT_COOKIEFILE, "/tmp/cookieFileName");
curl_setopt($ch, CURLOPT_URL,"http://www.uploaded.to/home");

$buf2 = curl_exec ($ch);

curl_close ($ch);
unset($ch);

//echo ($buf2); //$buf2 enthaelt eine HTMLseite die mir erzaehlt dass ich eingeloggt bin...

$ch = curl_init();
curl_setopt($ch, CURLOPT_RETURNTRANSFER,1);
curl_setopt($ch, CURLOPT_COOKIEFILE, "/tmp/cookieFileName");
curl_setopt($ch, CURLOPT_URL,"http://uploaded.to/api/uploadserver");

$uploadserver = curl_exec ($ch);

curl_close ($ch);
unset($ch);

$uploadserver .='up?output=xml&upload_id='. rand(100000000, 999999999);

$uploadfile = 'testdata.xml';
$ch = curl_init();
curl_setopt($ch, CURLOPT_COOKIEFILE, "/tmp/cookieFileName");
curl_setopt($ch, CURLOPT_RETURNTRANSFER,1);
curl_setopt($ch, CURLOPT_URL,$uploadserver);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS,
               array('file1x'=>"@$uploadfile"));

$result = curl_exec ($ch);

curl_close ($ch);
unset($ch);

echo $result;

?>
Jaja, der code ist ziemlich unsauber... aber er funktioniert und laedt die ungefaehr 6.5mb grosse testdatei hoch. leider ohne progressbar... aber nach einer Minute (ungefaher) steht die Datei unter meinem usernamen hochgeladen auf uploaded.to

auch mit der commandline version von curl hat der login geklappt:
Code:
curl -L -b cookies.txt -c cookies.txt -d "email=EMAIL&password=PASSWORD" "http://www.uploaded.to/login"
Auch aus diesem query kam die "login erfolgrech" Mitteilung und wurden die richtigen cookies in die cookies.txt geschrieben

Weiss jetzt jemand was an meinem Code mit Indy falsch ist? Oder ist es Indy's Fehlinterpretation des Responses des Servers?


Alle Zeitangaben in WEZ +1. Es ist jetzt 15:43 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz