[Synapse]Wysyłanie 2 zmiennych metodą POST

0

Mam taki kod z gotowca komponentów Synapse

function ProxyHttpPostURL(const URL, URLData: string; const Data: TStream): Boolean;
var
  HTTP: THTTPSend;
begin
  HTTP := THTTPSend.Create;
  try
    HTTP.Document.Write(Pointer(URLData)^, Length(URLData));
    HTTP.MimeType := 'application/x-www-form-urlencoded';
    Result := HTTP.HTTPMethod('POST', URL);
    Data.CopyFrom(HTTP.Document, 0);
  finally
    HTTP.Free;
  end;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  st: TMemoryStream;
begin
  st:=TMemoryStream.Create;
  try
    ProxyHTTPpostURL('http://strona_www.domena/message.php', 'tresc=' + text.Text , st);
    st.Seek(0,soFromBeginning);
    Memo2.Lines.LoadFromStream(st);
  finally
    st.Free;
  end;
end;

tylko mi to wysyła jedną zmienną POST a chcę by wysyłał dwie i nie wiem jak to zrobić
HELP
ProxyHTTPpostURL('http://strona_www.domena/message.php', 'tresc=' + text.Text , st);

0

Nie znam sznapsa, ale spróbowałbym:

ProxyHTTPpostURL('http://strona_www.domena/message.php', 'tresc=' + text.Text + '&tresc2=dupa_jasia', st);

b

0

właśnie o to chodzi że nie da się tak bo będzie uznawać to jako część dalszą pierwszego POST

1

Ja w pewnym swoim programie napianym dla siebie, służącym do szybkiego pobierania obrazów
z galerri na stronie jednego z klubów w Szczecinie - zrobiłem tak, jak poniżej i strona zachowuje
się prawidłowo. To jaki pakiet wysylany jest POST'em, sprawdziłem pod WireSharkiem. No i jak
widzisz wysylane jest kilka zmiennych i docierają do serwera. Poniżej zapis do Streama i pliku, a
więc albo kod w pliku php po stronie serwera oczekuje jakiś innych danych albo pobierz sobie, na
przykład, WireSharka i zobacz co jest wysyłane dokładnie jak logujesz się przeglądarką www, bo
może jest to robione jakoś inaczej. Jak używać WireSharka, można dowiedzieć się z filmików na
youtube. Są też pewnie inne sniffery. A i dodam, że Synapse powinno wysłać prawidłowe dane,
wyjątkiem jest chyba tylko strona chomikuj.pl, próbowałem dodać funkcjonalność wrzucania tam
plików po http, no i się nie udało. Bo prawodpodobnie potrzebne jest coś, co obsłuży javascript.
Fakt, że Ty potrzebujesz logowania się z użyciem proxy, ale to nie powinno stanowić różnicy, no
chyba że się mylę. Nie znam się za bardzo na proxy. Ale możesz sobie w modułe httpsend czy w
jakim tam jest ta funkcja (pewnie w tym co piszę) ProxyHTTPpostURL i przeanalizowac jej kod.

// ...
const
  Base_Url = 'http://www.heyaclub.pl/';
  Profile_Page = 'index.php?go=profile';
  Gallery_Page = 'index.php?go=galeria';
  Gallery_SubPage = '&page=';
  ToPost_MimeType = 'application/x-www-form-urlencoded';
  Opera_UserAgent = 'Opera/9.80 (Windows NT 5.1; U; pl) Presto/2.2.15 Version/10.10';

// ...

function HeyaPostToFile(const URL : string; HeyaUserName, HeyaPassword : string; const FileName : string) : boolean;
const
  Location_Prefix = 'Location:' + #32;
var
  SynHttp : THttpSend;
  I, Position : integer;
  UrlData, Str, DirectLink : string;
begin
  UrlData := 'login=' + HeyaUserName + '&pass=' + HeyaPassword + '&action=zaloguj';
  SynHttp := THttpSend.Create;
  try
    SynHttp.MimeType := ToPost_MimeType;
    SynHttp.UserAgent := Opera_UserAgent;
    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;
          HeyaPostToFile(DirectLink, HeyaUserName, HeyaPassword, FileName);
        end;
    else
      SynHttp.Document.SaveToFile(FileName);
    end;
  finally
    SynHttp.Free;
  end;
end;

function HeyaPostToMemoryStream(const URL : string;
  HeyaUserName, HeyaPassword : string; const MemoryStream : TMemoryStream) : boolean;
const
  Location_Prefix = 'Location:' + #32;
var
  SynHttp : THttpSend;
  I, Position : integer;
  UrlData, Str, DirectLink : string;
begin
  UrlData := 'login=' + HeyaUserName + '&pass=' + HeyaPassword + '&action=zaloguj';
  SynHttp := THttpSend.Create;
  try
    SynHttp.MimeType := ToPost_MimeType;
    SynHttp.UserAgent := Opera_UserAgent;
    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

Nic z tego nie rozumiem ale działa ;] THX

0

Prosze bardzo. Wiem, że powinno działać, bo mój kod był wzięty z działającego programu,
a Ty albo nie obslugiwałeś nowego adresu w przypadku przekierowania albo dane do POST
były niewłaściwe. Ale to nieważne, ważne że wszystko już działa Tobie i tak, jak powinno.

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