synapse + wysłanie zapytania POST

0

Witam

Mam takie pytanie bo dotychczas logowałem się poprawnie za pomocą takiego kodu

 
  HTTP.Document.Write(Pointer(wpisz)^, Length(wpisz));
  HTTP.HTTPMethod('POST', 'http://strona.pl/login.php');

i w zmiennej wpisz było login=kamil&haslo=kamil&bleble=blebl...

, a teraz mam taki oto problem że najpierw musze wejsc na strone logowania, tam jest formularz login, hasło i id. Id jest w input type="hidden" wiec musze go wyłuskać i zapisać i potem utworzyć link. To id zmienia się za każdym odświeżeniem strony.

I jak to ma działać bo jak robie tak:

 
HTTP.HTTPMethod('GET', 'http://strona.pl/login.php');
tutaj pobieram to id i tworze zmienna wpisz
  HTTP.Document.Write(Pointer(wpisz)^, Length(wpisz));
  HTTP.HTTPMethod('POST', 'http://strona.pl/login.php');

to nie działa.

Może wiecie jak to zrobić? Będęwdzięczny za odp.

0

Pokaż cały kod i o jaką stronę chodzi. A i czy na pewno masz ustawione MimeType na 'application/x-www-form-Urlencoded'. Poza tym po pobraniu GETem często trzeba wykonać czyszczenie nagłówków, a i niekiedy innych zmiennych. Poniżej masz przykład jak loguje się na stronę pewnego szczecinskiego klubu, najpierw przed zalogowaniem musze pobrać ciasteczka, które są przechowywane w zmiennej OldCookie i później korzysta z tej zmiennej procedura do pobierania zdjęć z galerii na tejże stronie. Nie wiem na jaką stronę próbujesz się logowac, ale może musisz zrobić to w podobny sposób jak ja na tej.

//...
uses
  httpsend;
//...
const
  Base_Url = 'http://heyaclub.pl/';
  Profile_Page = 'index.php?go=profil';
  Gallery_Page = 'index.php?go=galeria';
  Gallery_SubPage = '&page=';
  ToPost_MimeType = 'application/x-www-form-Urlencoded';
  Opera_UserAgent = 'Opera/9.80 (Windows NT 6.1; U; pl) Presto/2.8.131 Version/11.10';
//...
var
  OldCookie : string;
//...
procedure HeyaLogon(Url : string;
  HeyaUserName, HeyaPassword : string; const MemoryStream : TMemoryStream);
const
  Location_Prefix = 'Location:' + #32;
var
  SynHttp : THttpSend;
  I, Position : integer;
  UrlData, Str, DirectLink : string;
begin
  SynHttp := THttpSend.Create;
  try
    SynHttp.KeepAlive := True;
    SynHttp.Protocol := '1.1';
    SynHttp.MimeType := ToPost_MimeType;
    SynHttp.UserAgent := Opera_UserAgent;
    SynHttp.HTTPMethod('GET', Base_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;
          SynHttp.Headers.Clear;
          SynHttp.HTTPMethod('GET', DirectLink);
        end;
    end;
    SynHttp.Headers.Clear;
    SynHttp.Document.Clear;
    SynHttp.HTTPMethod('GET', Base_Url);
    OldCookie := SynHttp.Cookies.Text;
    SynHttp.Clear;
    SynHttp.KeepAlive := True;
    SynHttp.Protocol := '1.1';
    SynHttp.MimeType := ToPost_MimeType;
    SynHttp.UserAgent := Opera_UserAgent;
    SynHttp.Cookies.Text := OldCookie;
    UrlData := 'login=' + HeyaUserName + '&pass=' + HeyaPassword + '&action=zaloguj';
    SynHttp.Document.Write(Pointer(UrlData)^, Length(UrlData));
    SynHttp.HTTPMethod('POST', Base_Url + Profile_Page);
  finally
    MemoryStream.Clear;
    SynHttp.Document.SaveToStream(MemoryStream);
    MemoryStream.Position := 0;
    SynHttp.Free;
  end;
end;
0
procedure TForm1.Button1Click(Sender: TObject);
var i,l1:integer;
link,wpisz:string;
begin
  wpisz:='ref=&ef_id=&server='+edit3.text+'&username='+edit1.text+'&password='+edit2.text+'&submitlogin=Zaloguj';
  HTTP := THTTPSend.Create;
  HTTP.UserAgent := 'User-Agent: Opera/9.80 (Windows NT 5.1; U; pl) Presto/2.2.15 Version/10.10';
  HTTP.MimeType := 'application/x-www-form-urlencoded';
  HTTP.Document.Write(Pointer(wpisz)^, Length(wpisz));
  HTTP.HTTPMethod('POST', 'http://mojastrona.pl/login/proxy_login.php');

  l1:=pos('Location:',HTTP.Headers[3]);
  for i:=11 to length(HTTP.Headers[3]) do
  link:=link+HTTP.Headers[3][i];
  HTTP.Clear;

  HTTP.HTTPMethod('GET', link);
  HTTP.Clear;

  link:='http://s'+edit3.text+'.mojastrona.pl/main.php?ref=';
  HTTP.HTTPMethod('GET', link);

  button2.enabled:=true;
 
end;

procedure TForm1.Button2Click(Sender: TObject);
var
wpisz,hpp,linia:string;
l1,l2,i:integer;
begin
   HTTP.Clear;
 HTTP.HTTPMethod('GET', 'http://s'+edit3.text+'.mojastrona.pl/nachrichten/new.php');
 Memo2.Lines.LoadFromStream(HTTP.Document);
 linia:=memo2.lines[120];
 l1:=pos('name="hpc" value="',linia);
 l2:=l1+30+19;
  for i:=11+31 to l2 do
  hpp:=hpp+linia[i];

wpisz:='hpc='+hpp+'&msg_to='+edit5.text+'&msg_subject='+edit4.text+'&msg_body='+memo1.text+'&msg_send=Wy%C5%9Blij';
HTTP.Clear;
HTTP.Document.Write(Pointer(wpisz)^, Length(wpisz));
HTTP.HTTPMethod('POST', 'http://s'+edit3.text+'.mojastrona.pl/nachrichten/new.php');
 memo3.text:=wpisz;
end;
 

i po pierwszym kliknięciu loguje sie tak jak ma być, ale problem jest w button2 bo zapytanie wysyła ale jest niepoprawne i nic się nie dzieje bo musze pobrać zmienną hpp, a jak otworze tą strone kilka razy to zawsze jest inna, i w tym button2 właśnie pobieram raz strone potem robie co ma wpisać i potem chyba pobiera jeszcze raz i wtedy już hpp jest pewnie inny. To jak działa to: ?

HTTP.HTTPMethod('POST', 'http://s'+edit3.text+'.mojastrona.pl/nachrichten/new.php');
 

To tylko wysyła na dany adres? czy też pobiera kod?

0
pomoc napisał(a)
HTTP.HTTPMethod('POST', 'http://s'+edit3.text+'.mojastrona.pl/nachrichten/new.php'); 

To tylko wysyła na dany adres? czy też pobiera kod?

Ten kod wysyła dane metodą POST, ale zwrócona strona jest w zmiennej Document (typu TMemoryStream). Można ją później przypisać do zmiennej typu string. Oczywiście jeżeli Document będzie pusty (miał 0 bajtów) to na 99,99% nastepuje przekierowanie na inną stronę i należy je obsłużyć analizując nagłówki, tak jak pokazałem to w kodzie - w postcie wyżej. Oto wycinek logowania do FaceBooka, już nie podaje nazw stałych. Zmienna SynHttp to oczywiście THttpSend, a FPage jest typu string. Możesz też przeanalizować snifferem tupy WireShark (jak go używać dowiesz się z tutoriali video na YouTube) albo debuggera HTTP i sprawdzić pod nimi porównując jak loguje się prawdziwa przeglądarka, a jak Twój program. Wiadomo, że w nagłowku mogą być wtedy pewnie różnice, bo te nagłowki od na przykład prawdziwej Opery są "bogatsze", ale może dojdziesz co jest nie tak wtedy.

//...
  with SynHttp do
  begin
    Cookies.Clear;
    Headers.Clear;
    Document.Clear;
    UpdateCurrentStepGBCaption(0);
    FUrl := Base_Url + 'index.php';
    HTTPMethod('GET', FUrl);
    UpdateCurrentStepGBCaption(1);
    Headers.Clear;
    FUrl := Base_Url + 'login.php?login_attempt=1';
    FStrData := 'charset_test=' + ACharset_Test + '&locale=pl_PL' +
      '&email=' + UserEMail + '&pass=' + UserPassword +
      '&default_persistent=0&charset_test=' + ACharset_Test;
    Document.Write(PChar(FStrData)^, Length(FStrData));
    HTTPMethod('POST', FUrl);
    SetLength(FPage, Document.Size);
    Document.Read(PChar(FPage)^, Length(FPage));
    FPage := UTF8ToAnsi(FPage);
    //...
  end;
0

ok. Dzięki wielkie zaraz będe to analizował i sprawdze co mam nie tak

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