IdHttp Logowaine na grę

0

Udało mi się zalogować, ale automatycznie po logowaniu to nadaje numer sesji i jeszcze samo przekierowuje na dalszą stronę, gdy chcę to sam przekierować bo w adresie strony to jest to pisze żebym się zalogował, tak jakby nie trzyma sesji wcale :-/ i nie wiem co mam zrobić.
Na komponencie WebBrowser działa mi bez problemu bo to w końcu imitacji IE.

0

Po pierwsze, będę się powtarzał aż do złudzenia: olej Indy - użyj Synapse. Możesz pod nim wygodnie podejrzeć sobie zawartość
nagłówków i ciasteczek bez konieczności używania jakiś tam IdCookiePierdolników. Może strona zachowuje się nietypowo, podam
Tobie poniżej przykład kodu jaki trzeba po zmianach na stronie pewnego szczecińskiego klubu użyć aby się prawidłowo zalogować.
Wcześniej takie kombinacje były zbędne, a pod Operą jak i innymi przeglądatkami wszystko jest ok, więc może dla tej gry musisz
coś na stronie pokombinować żeby otrzymać takie ciasteczka jak należy. Później je zapamiętać i przywrocić przy słaniu POSTem.
Może skorzystaj z WireShark (jak go używac - pokazują tutoriale na YouTube) i prześledź wysyłane przeglądarką do strony dane.

const
  Base_Url = 'http://www.heyaclub.pl/';
  ToPost_MimeType = 'application/x-www-form-urlencoded';
  Opera_UserAgent = 'Opera/9.80 (Windows NT 5.1; U; pl) Presto/2.6.30 Version/10.60';

function HeyaPostToMemoryStream(const URL : string;
  HeyaUserName, HeyaPassword : string; const MemoryStream : TMemoryStream) : boolean;
const
  Location_Prefix = 'Location:' + #32;
var
  SynHttp : THttpSend;
  I, Position : integer;
  OldCookie, UrlData, Str, DirectLink : string;
begin
  OldCookie := '';
  SynHttp := THttpSend.Create;
  try
    SynHttp.KeepAlive := True;
    SynHttp.Protocol := '1.1';
    SynHttp.UserAgent := Opera_UserAgent;
    SynHttp.HTTPMethod('GET', Base_Url);
    OldCookie := SynHttp.Cookies.Text;
    SynHttp.Clear;
    SynHttp.Cookies.Text := OldCookie;
    SynHttp.MimeType := ToPost_MimeType;
    URLData := 'login=' + HeyaUserName + '&pass=' + HeyaPassword + '&action=zaloguj';
    SynHttp.Document.Write(Pointer(URLData)^, Length(URLData));
    Result := SynHttp.HTTPMethod('POST', Url);
    case SynHttp.ResultCode of
      301, 302 :
        begin
          for I := 0 to SynHttp.Headers.Count - 1 do
          begin
            Str := SynHttp.Headers[I];
            Position := Pos(Location_Prefix, Str);
            if Position > 0 then
            begin
              DirectLink := Copy(Str, Position + Length(Location_Prefix), MaxInt);
              Break;
            end;
          end;
          HeyaPostToMemoryStream(DirectLink, HeyaUserName, HeyaPassword, MemoryStream);
        end;
    else
      MemoryStream.Clear;
      SynHttp.Document.SaveToStream(MemoryStream);
      MemoryStream.Position := 0;
    end;
  finally
    SynHttp.Free;
  end;
end;
0

Dałem sobie to pod procedurę przycisku ale kicha, nie loguje, być może przez to że usunąłem mały kawałek ale nie wiem ;/

procedure TForm1.Button1Click(Sender: TObject);
const
  Location_Prefix = 'Location:' + #32;

var
  SynHttp : THttpSend;
  I, Position : integer;
  OldCookie, UrlData, Str, DirectLink : string;
begin
  OldCookie := '';
  SynHttp := THttpSend.Create;
  try
    SynHttp.KeepAlive := True;
    SynHttp.Protocol := '1.1';
    SynHttp.UserAgent := Opera_UserAgent;
    SynHttp.HTTPMethod('GET', Base_Url);
    OldCookie := SynHttp.Cookies.Text;
    SynHttp.Clear;
    SynHttp.Cookies.Text := OldCookie;
    SynHttp.MimeType := ToPost_MimeType;
    URLData := 'text=' + edit1.text + '&pass=' + edit2.text+ '&submit=zaloguj';
    SynHttp.Document.Write(Pointer(URLData)^, Length(URLData));
    SynHttp.HTTPMethod('Post','http://s6.gladiatus.pl/game/index.php?mod=login/'+urldata) ;
    case SynHttp.ResultCode of
      301, 302 :
        begin
          for I := 0 to SynHttp.Headers.Count - 1 do
          begin
            Str := SynHttp.Headers[I];
            Position := Pos(Location_Prefix, Str);
            if Position > 0 then
            begin
              DirectLink := Copy(Str, Position + Length(Location_Prefix), MaxInt);
              Break;
            end;
          end;

        end;
    else

    end;
  finally
    SynHttp.Free;
  end;
end;
0

Olesio, nie mów zawsze Olej Indy. Indy także jest bardzo dobre, zawsze z niego korzystam. Co prawda idCookieManaget to porażka jednak można poradzić sobie i bez tego.

matigi12 jak nie masz idcookiemanaget to wstaw go na formę i podepnij po d idhttp. Jeżeli to nie pomoże to jest to już bardziej skomplikowane. W indy także można bez problemu podejrzeć nagłówki itp.

@olesio: Czy w synapse jest coś podobnego do IdCookieManager? co sprawdza się także z liczbą ciastek większą niż jeden?

0
 SynHttp.HTTPMethod('Post','http://s6.gladiatus.pl/game/index.php?mod=login/'+urldata) ;

bo tu masz błąd, daj bez "+urldata" i powinno być dobrze

0
Legalnl napisał(a)

Olesio, nie mów zawsze Olej Indy. Indy także jest bardzo dobre, zawsze z niego korzystam.

miliardy much jedzą g**no - czy to oznacza, że g**no jest dobre :>
Indy jest dobre jak trzeba zrobić szybko coś prostego albo coś standardowego (np. podstawowy serwer http), ale dopisywanie niestandardowej obsługi to porażka. Indy stwierdziło, że user (tu programista) to debil i sam nic nie potrafi zrobić więc ono (indy) zrobi wszystko za niego. Ok - kto chce niech używa. Z drugiej strony aby używać gniazd czy synapse trzeba wiedzieć jak działa dany serwer, jak działa dany protokół i mieć pojęcie co i kiedy wysyłać.

TV napisał(a)
 SynHttp.HTTPMethod('Post','http://s6.gladiatus.pl/game/index.php?mod=login/'+urldata) ;

bo tu masz błąd, daj bez "+urldata" i powinno być dobrze

nie będzie dobrze. Dobrze to będzie wtedy kiedy w URLData będą wysyłane poprawne dane. Ale żeby to wiedzieć to nie wystarczy zrobić CTRL+C a potem CTR+V tylko trzeba pomyśleć. Praktycznie każda strona inaczej wysyła dane przez post. Trzeba snifferem sprawdzić co jest wysyłane.

0
Legalnl napisał(a)

@olesio: Czy w synapse jest coś podobnego do IdCookieManager? co sprawdza się także z liczbą ciastek większą niż jeden?

Nie ma osobnego komponentu, ciasteczka Cookies, jak i nagłowki Headers, w THttpSend to obiekty typu TStringList i można
na nich dokonywać identycznych operacji jak na owym typie. To znaczy wstawiać, dodawać, usuwać, przypisywać i tak dalej.
A co do wysłania danych POSTem, to tak jak Misiekd potwiedzil. Trzeba użyć Sniffera i zobaczyć co wysyła przeglądarka i z
poziomu kodu później postarać się wysłac to samo. Dla każdej strony może to być co innego. Ja tu tylko podałem przykład.

0

Za pomocą idHttp wystarczyło że tak jak tutaj jest to URLData to tam miałem jako parametr i działało W sensie był odnośnik do strony z sesją ale jak chciałem wejść na ten link pisało ponownie że mam się zalogować, znaczy że traci sesje ;/

0

Ale Synapse to nie Indy. Sprawdź WireSharkiem co wysyłane jest przeglądarką do strony i postaraj się takie
same dane wysłać POSTem, zapisując to w zmiennej UrlData, a jako adres w HttpMethod podać tylko adres,
ktory rownież można odczytać w WireSharku, a jak dodatkowo w nagłowkach okaże się, że jest także jakiś
referer to wstaw go do nagłowka przez Headers.Insert(0, 'Referer: ' + RefererLink); bo jeżeli strona gry do
ktorej się chcesz zalogować nie używa jakiś cudowań z JavaSciptem - to na pewno Synapse da sobie radę.

0

Tu jest właśnie to, gra po zalogowaniu to jest 3/4 w javie :/ Mam wszystko pod webbrowsera i mi działa ale chciałem zmniejszyć zużycie ramu i procesora oraz przyśpieszyć działanie

0

A to z Javowymi stronami i Synapse nie miałem do czynienia, chyba jednak niestety pomoże tylko logowanie
się prawdziwą przeglądarką, także pozostaje Tobie WebBrowser, ale mogę się mylić i może Synapse da radę.

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