idhttp + cookiemanager jak wysyłąne są te ciasteczka?

0

Witajcie.
Chce zalogować się na moją stronę poprzez POST, robie to co piszą w innych tematach ale nie działa. Co jest źle? Możę za mao nagłówków wysyłam? Mam ustawione wszystko na TRUE.
I te logowanie ma działać tak? logowanie post -> cookiemanager -> idhttp.get(pobranie kodu) ?
Proszę o pomoc .

 procedure TForm1.Button1Click(Sender: TObject);
var wejscie,wyjscie:TStringStream;
wynik,s:string;
i:integer;
begin

  
IdHTTP1.Response.ContentType:='application/x-www-form-urlencoded';
IdHTTP1.request.useragent := 'Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)';


wejscie:=Tstringstream.Create('');
wyjscie:=Tstringstream.Create('');

  wejscie.WriteString('login=kubeczek&haslo=kubeczek&zaloguj=Zaloguj+sie');
  wynik:=IdHTTP1.Post('http://www.mojastrona.boo.pl/admin.php', wejscie);
      
  memo1.text := wynik;



for i:=0 to IdHTTP1.CookieManager.CookieCollection.Count-1
do begin
memo1.Lines.Add(IdHTTP1.CookieManager.CookieCollection.Items[i].CookieText) ;
end;


    wynik:=IdHttp1.Get(IdHTTP1.Response.Location);
    memo2.text:=wynik;

  wejscie.free;
  wyjscie.Free;
end;
0

Nie mam pojęcia jak w Indy, ale pod Synapse jeżeli wyślesz w zmiennej Document metodą POST to, czego "strona oczekuje" to ponownie w zmiennej Document dostaniesz zawartośc strony. Jeżeli będzie ona pusta to znaczy, że należy obsłużyć ResultCode = 301 lub 302 i z nagłowków Headers, ktore są typu TstringList wyciągnąć adres po 'Location:' (lub 'location:') na ktory następuje przekierowanie. W przypadku php często będzie to sama nazwa pliku php, którą należy dodac do "podstawowego" adresu strony. Ciasteczka będą uzupełnione jak należy przez sam komponent THttpSend. W Indy jednak nie doradzę, bo nie używam od dawna, ale jeżeli ustawiony jest sensowny UserAgent i MimeType jak u Ciebie to powinno działać. Nie napisałeś co zwraca zmienna Wynik i co pokazywane jest później w Memo. Ja się nie upieram przy Synapse, ale jeżeli uprzesz się przy "Indy'ku" to może ktoś inny coś lepiej Tobie doradzi, kto ma opanowany ów pakiet w obsłudze HTTP, tak jak ja mam to opanowane pod Synapse :)

0

Nie wiem o jaką konkretnie stronę chodzi ale nie działać (jak podejrzewam) może z 2 powodów:

  1. Nie pobierasz strony logowania a powinieneś to zrobić za pomocą GET (być może po wejściu na stronę logowania pobierane są jakieś ciacha)
  2. Nie ustawiasz nagłówka Referer a niektóre strony to sprawdzają.
    Tak poza tym możesz olać CookieManager w większości przypadków robi on za zbędny bajer (a jeżeli już go używasz to IdHTTP i tak samo zadba o wysłanie ciasteczek).
    Poniżej podaję przykład logowania się do forum phpBB2 by Przemo:
const
  USER_AGENT = 'Mozilla/5.0 (Windows NT 5.1; rv:2.0) Gecko/20100101 Firefox/4.0';
  URL = 'TU ADRES FORUM/login.php';
var
  sl: TStringList;
begin
  IdHTTP1.HandleRedirects:= True;
  IdHTTP1.Request.UserAgent:= USER_AGENT;
  IdHTTP1.Get(URL); //tylko po to aby pobrać ciacha
  IdHTTP1.Request.Referer:= URL; //może by wymagany
  IdHTTP1.Request.ContentType:= 'application/x-www-form-urlencoded';
  sl:= TStringList.Create;
  try
  sl.Add('username=TU LOGIN');
  sl.Add('password=TU HASŁO');
  sl.Add('redirect=');
  sl.Add('login=Zaloguj');
  Memo1.Text:= IdHTTP1.Post(URL, sl);
  finally
  sl.Free;
  end;
end;

PS: Tak jak Ty użyłeś TStringStream zamiast TStringList (ja wolę to drugie bo wygląda czytelniej) też powinno przejść tylko chyba trzeba po Write ustawić Position na 0

EDIT// Zapomniałem może być jeszcze trzeci powód - strona wymaga JavaScript a wtedy tylko TWebBrowser lub coś innego oparte na silniku przeglądarki.

0

i to sa programiści, wszystko na komponenty a jak nie działa to leżą...

ciasteczka możesz przechwycić ręcznie w procedurze onRedirect komponentu idHTTP
po wyciągnięciu ciasteczka (np przy logowaniu) możesz już go używać.

Poniższy kod zwróci Ci nagłówek, aby przechwycic ciastko umieść go w procedurze OnRedirect.

naglowek := idhttp.Response.RawHeaders.DelimitedText;

Będzie tam Set-Cookie. wygrzebiesz sobie operując na stringach. Podpowiem Ci, że jeżeli w nagłówku będą 2 Set-Cookie, to Ciebie interesuje to drugie.

Ciasteczko dodajesz ręcznie do nagłówka poniższym kodem przed wysłaniem zapytania idhttp.get()

idhttp.Request.CustomHeaders.Add('Cookie: ' + ciasteczko);

Jeżeli chcesz, by ciastko dodawało się zawsze do nagłówka przy każdym zapytaniu, to dodawaj je w procedurze np Onstatus komponentu idhttp.

Troche trzeba pomyśleć, ja kiedyś bawiłem się ciasteczkami, jednak idhttp ani idcookiemanager nie radzi sobie z nimi, szczególnie jak jest ich kilka (nawet indy 10), a powiem Ci że zrobienie tego ręcznie nie jest sprawą trudną. Posiedź troche z wiresharkiem i zobacz co wysyła przeglądarka.

0

Legalnl ale wymyśliłeś pierwsze sprawdź później pisz. Tak jak napisałem wyżej Indy samo zadba o ciacha tym się nie trzeba martwić właśnie dlatego jest takie "ciężkie", że to i sporo innych rzeczy ma wbudowane. Owszem czasem rzeczywiście sobie nie radzi (np. z filmweb) trzeba mu pomóc i samemu zapodać ciacho (to aby pominąć reklamę) w sposób jak napisałeś ale w większości przypadków śmiga "samo".

0

To jest sprawdzona metoda i bardzo dobrze wiem, że indy nie wyrabia z ciastkami, bo logowałem się na przeróżne strony. Owszem radzi sobie w prostych sytuacjach, jednak jak na te czasy, to raczej nie wyrabia. Większość stron śle 2 ciastka, indy tego już nie ogarnia, poszukaj moich postów z przed roku, dwóch, jak pytałem sie o idcookiemanager, wiem co mówie.

@Autor: Sprawdź sobie WireSharkiem co wysyła przeglądarka, i spreparuj dokładnie taki sam nagłówek za pomocą kodu który Ci podałem wyżej. Za jego pomoca możesz także wysyłać inne nagłówki http. Jak sprawdzisz co wysyła przeglądarka, i tak samo wyślesz z Twojego programu to masz gwarantowane że się zalogujesz ;)

PS: w formularzu mogą być też ukryte kontrolki, input type=hidden To także musisz wysłać w zapytaniu

0

Bardzo dziękuję za wasze odpowiedzi. Ta strona na którą się loguje to jest moja strona napisana w php, dwa pola login i hasło oraz przycisk wyślij. Po zalogowaniu wysyłane jest idsesji w cookie i wtedy jesteśmy zalogowani. Zrobiłem ją dla testowania bo zawsze takie logowania robiłem przez php biblioteka CURL ale teraz chce to zrobić za pomocą delphi :). Zaraz bede to kombinował i powinno się udać.

Jeszce raz dzięki za odpowiedzi.

Teraz troche pozmieniałem kod ja mówili koledzy wyżej ale wywala mi następujący błąd i nie wiem czy to wina kodu czy może INDY lub delphi. Zdjęcie błędu dodałem w załącznikach.
A kod wygląda następująco W polach memo 1 i memo2 nic się nie wyświetla bo pojawia się ten błąd po kliknięciu w przycisk.

 
procedure TForm1.Button1Click(Sender: TObject);
var sl:TStringList;
wynik,URL:string;
i:integer;
begin

URL:='http://www.moja strona.boo.pl/admin.php';

IdHTTP1.Get(URL);
IdHTTP1.Request.Referer:= URL;
IdHTTP1.Response.ContentType:='application/x-www-form-urlencoded';
IdHTTP1.request.useragent := 'Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)';

sl:= TStringList.Create;
try
sl.Add('login=kubek');
sl.Add('haslo=kubek');
sl.Add('zaloguj=Zaloguj+sie');
Memo1.Text:= IdHTTP1.Post(URL, sl);
Memo2.Text:= IdHTTP1.get(URL);
finally
sl.Free;
end;
end;
0

Masz jakiś błąd wewnątrz IdHTTP (nie wiem jaki przed tym co wkleiłeś na pewno był komunikat błędu). Delphi chce debugować ale potrzebuje do tego źródeł komponentu dlatego prosi o wskazanie ścieżki.

0

Ok. Podałem ścieżkę to teraz pokazuje się taki błąd jak w załączniku. Może muszę zainstalować nowe INDY? Bo to instalowałem zgodnie z instrukcjami na tym forum.

0

No błąd zwrócony przez serwer (Twojej strony) widocznie coś jest nie tak z tym co wysyłasz ale trudno coś bliżej powiedzieć nie znając nawet adresu strony.

0

Osobiście nakłaniam do użycia synapse bo prościej...
Jak jak się bawiłem z IdHTTP żeby wysyłać dane metodą post to nie działało...
A ten błąd to wywołuje server (strona) przez błędnie sformułowane zapytanie (czyli to co wysyłasz przez POST) wynika to z tego że
412 Precondition Failed Warunek wstępny nie może być spełniony – serwer nie może spełnić przynajmniej jednego z warunków zawartych w zapytaniu

0

zapomniałem dopisać że jeżeli by miał problem z serverem to by wysłał to
500 Internal Server Error Wewnętrzny błąd serwera – serwer napotkał niespodziewane trudności, które uniemożliwiły zrealizowanie żądania
a gdyby były niepoprawnie sformułowane dane w post (login, hasło itp) to by serwer zwrócił błąd wykonania skryptu (np złe hasło, nie istnieje taki użytkownik)

0

ProQix Polaczeq ma tutaj rację, ja rownież polecam spróbować pod Synapse. Ten pakiet nie gryzie i używam go na pohybel haterom ślepo zapatrzonym w Indy, bo po prostu dzięki Miśkowid się do niego przekonałem. Używałem go w kilku swoich programach do obslugi protokołu HTTP i się nie zawiodłem. Spróbuj. Z http://synapse.ararat.cz/doku.php/download pobierzesz sam pakiet, dokumentację oraz przykłady użycia. Jeżeli w zwroconym dokumencie uzyskał byś błąd bad request to znaczy, że należy najprawdopdoobniej wyczyścić nagłowki przez Headers.Clear; i dopiero wysłać zapytanie (na przykłąd jeżeli metoda POST występuje po GET), a jeżeli w zwróconym Document nic nie ma to oznacza, że musisz obslużyć przekierowanie na adres zawarty w Headers po 'Location: '. Wtedy ResultCode wynosi 301 lub 302, co oznacza, że nastapiło przekierowanie. I możesz użyć debuggerów http lub sniffera WireShark (jak go używać pokazują tutoriale na Youtube), aby sprawdzić i upewnić się co wysyła prawdziwa przeglądarka www i postarać się wysłać to samo metoda POST przy użyciu THttpSend z Synapse.

0

Dziękuje za wasze wszystkie odpowiedzi. Zrobiłem to za pomocą synapse i jest dużo prościej :) (przynajmniej dla mnie)

Dzięki za pomoc

0

ma może ktoś jakiś przykład? albo mógłbyś sie podzielić tym co wykodziłeś? :) Chętnie zobaczyłbym jak to wygląda na synapse.

1 użytkowników online, w tym zalogowanych: 0, gości: 1