INDY i logowanie do allegro.pl

0

Witam, jak w temacie napisalem, chce zalogowac sie do serwisu allegro z pomoca komponety TIdHTTP. Dla ulatwienia wystarczy polaczenie nieszyfrowane. Po wyslaniu poprawnego loginu i hasla do strony http://allegro.pl/login.php serwis powinien odeslac plik cookie z identyfikatorem sesji a ja uzywajac TIdCookieManager podpietego do TIdHTTP je przechowac. I w tym momenci mam problem jak wielu użytkowników, bo IdCookieManager1.CookieCollection.Count zwraca "0" a serwis przekierowuje mnie na strone gdzie jest informacja o tym, ze moja przegladarka nie obsluguje Cookie. Oczywiscie IdHTTP1.AllowCookies jest ustawione na TRUE.
Szukajac pomocy na forum znalazlem posta http://4programmers.net/Forum/328093#328093 i probowalem dostosowac kod wg tego co tam znalazlem ale bez skutku :-( Probowalem tez kilku innych rozwiazan ktore znalazlem ale to wydalo mi sie najbardziej obiecujace.

  data := TIdMultiPartFormDataStream.Create;
  IdHTTP1.Request.UserAgent  := 'Mozilla/5.0 (Windows; U; Windows NT 5.0; pl-PL; rv:1.7.6) Gecko/20050226 Firefox/1.0.1';
  RespContent := TMemoryStream.Create();

  try
    data.AddFormField('user_login', Edit1.Text);
    data.AddFormField('user_password', Edit2.Text);
    try
      IdHTTP1.Post('http://allegro.pl/login.php', data, RespContent);
    except
      on E: EIdHTTPProtocolException do
        begin
          if E.ReplyErrorCode = 302 then
          begin
            // now this is the redirect
            // get the next cookie (this will be the userid)
            for i := 1 to IdCookieManager1.CookieCollection.Count do
               IdHTTP1.Request.RawHeaders.Add('Cookie' +
               IdHTTP1.Request.RawHeaders.NameValueSeparator +
               IdCookieManager1.CookieCollection.Items[i - 1].CookieText);
            html := IdHttp1.Get(IdHTTP1.Response.Location);// follow redirect
          end
          else
            E.Create(E.Message);
       end;
    end;
  finally
    data.Free;
    RespContent.Free;
  end;

Liczę, że znajdzie się dobry samarytanin i pomoze mi sie zalogowac do allegro ;]

0

Może warto zainteresować się api które udostępnia allegro:
http://www.allegro.pl/country_pages/1/0/edukacja/narzedzia/help/index.php?page=3

Przyznam, że sam jeszcze nie korzystałem z tego.

0

AllegroAPI to na pewno najlepsze narzedzie spelniajace moje zalozenia ale ramy projektu nie pozwalaja mi na uzycie go :-( ale dziekuje za zainteresowanie

0

Udalo mi sie zalogowac...w koncu.
CookieManager jest dla mnie zagadka, nie watpie, ze w jakis sposob on działa ale w jaki tego nie wiem, wiec go wywalilem. Do IdHTTP dodalem IdConnectionIntercep i uzylem jego zdazenia OnRecive. W nim recznie odczytalem naglowek przychadzacy od serwera, odczytalem tresc Cookie i dodalem do IdHTTP.Request.CustomHeader. Probowalem tez Synaptic ale problem pozostawal. Rozwiazanie jakiego uzywam teraz nie jest najlepsze bo daje kontroli np nad przedawnionymi ciasteczkami ale dla mnie wystarczy bo razem z PHPSESID serwer nie przysylal daty jego waznosci. Teraz jak patrze na to, to nie bylo to takie trudne ale przy pierwszym spotkaniu z INDY czulem sie taki zagubiony :-)

Kod dla INDY 9

Wyslanie danych do skryptu logowania:

function TAllegroApi.Zaloguj(): boolean;
var
  HTML: string;
  params: TStringList;
begin
  result := TRUE;
  Params := TStringList.Create;
  Params.Clear;
  Params.Values['user_login'] := fAllegroLogin;
  Params.Values['user_password'] := fAllegroPass;

  try
    HTTP.Post('http://allegro.pl/login.php', Params);// now do the log in
  except
    on E: EIdHTTPProtocolException do begin
      if E.ReplyErrorCode = 302 then begin // redirect
        // wczytanie nowej strony
        HTML := HTTP.Get(HTTP.Response.Location);
        Form1.Memo1.Text := html;
        zalogowany := TRUE;
        if Pos('/logout.php', html) = 0 then begin
           zalogowany := FALSE;
           result := FALSE;
        end;
      end
      else
        E.Create(E.Message);
    end;
  end;
end;

Czytanie naglowka z interceptora:

procedure TAllegroApi.IdConnectionInterceptReceive(ASender: TIdConnectionIntercept;
  AStream: TStream);
var
  html : TStringStream;
  header: string;
  i,k : integer;
begin
  html := TStringStream.Create('');
  AStream.Position := 0;
  html.CopyFrom(AStream, AStream.Size);
  header := html.DataString;
  html.Free;

  while TRUE do begin
    i := Pos('Set-Cookie: ', header)+12;      // poczatek tresi cookie
    if i > 12  then begin
      k := (Pos(';', header))-i;              // dlugosc tresci cookie
      HTTP.Request.CustomHeaders.Values['Cookie'] :=
                 HTTP.Request.CustomHeaders.Values['Cookie'] +
                 Copy(header, i, k) + '; ';
    end
    else  // nie ma wiecej parametrow Set-Cookie
      break;
    Delete(header, 1, i+k+50);  // usuniecie czasci naglowka z Set-Cookie 
  end;
end;

Zeby sie wylogowac to wystarczy ustawic parametr Cookie na pusty string;

procedure TAllegroApi.Wyloguj;
var
  html : string;
begin
  try
    HTTP.Get('http://allegro.pl/logout.php');
    HTTP.Request.CustomHeaders.Values['Cookie'] := '';
    zalogowany := FALSE;
  except
    on E: EIdHTTPProtocolException do begin
      if E.ReplyErrorCode = 302 then begin
        ;   // pass
      end;
    end;
  end;
end;
0

witam szukam pomocy jak zalogowac sie na nasza-klasa za pomoca indy??

0

cookie o nazwie "remeber_me" (czy jakoś tak) przechowuje hasło i login tak, że od razu jesteś zalogowany

0

Sprawdziłem ten kod i mi nie działa.
Cały czas w HTTP.Response.Location otrzymuję www.alllegro.pl czyli stronę główną a przypuszczam że powinna to być strona użytkownika.
Jestem początkujący z Indy i nie mam pojęcia co jest nie tak...

0

Szogo życie mi uratowałeś! Pół roku się męczyłem, kombinowałem jak tu wysłać cookie przez Indy w BCB6. Wystarczy tylko:

IdHTTP1->Request->ExtraHeaders->Values["cookie"]=IdHTTP1->Request->ExtraHeaders->Values["cookie"]+"tresc ciacha";

W BCB6 działa.

Dzięki wielkie

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