Synapse - jak utworzyć katalog na Chomiku metodą POST (po raz n-ty)

0

Witam.

Mój pierwszy post tutaj, więc krótkie przestawienie się: facet już parę lat po studiach (Elektronika i Telekomunikacja), z zamiłowania elektronik, informatyk, przyrodnik. Programy piszę głównie na własny użytek, tak zwany niedzielny programista ze mnie.

Teraz do rzeczy. Nie mogę za pomocą Delphi 7 + Synapse utworzyć katalogu na Chomiku. W AutoIt poszło jak po maśle, kilka linijek kodu i katalog jest (operacje na plikach też bez problemu), a tu w Delphi ciągle kłody pod nogi. Zainstalowałem nawet Indy i też to samo, odpowiedź 500.
Na forum znalazłem już takie posty jak:
http://4programmers.net/Forum/Ci.NET/231319-tworzenie_folderu_z_wykorzystaniem_httpwebrequest
http://4programmers.net/Forum/Ci.NET/231339-clogowanie+_chomikowaniepliku-_httpwebresponse
http://4programmers.net/Forum/Ci.NET/224318-tworzenie_folderu_z_wykorzystaniem_httpwebrequest
Zmiana nazwy oraz treści kategorii na chomiku
Pobieranie plików z chomikuj.pl
Jedynie dwa ostatnie zasługują na uwagę, ale rozwiązania brak.

Trafiam na praktycznie ten sam problem co poprzednicy. Przy próbie utworzenia katalogu, serwer uparcie odpowiada 500. Kolega Olesio wspomniał, że mu udało się utworzyć katalogi, pozostał problem z kopiowaniem plików (chyba, że w międzyczasie już po problemie?).
Mam nadzieję, że nie dołączę do coraz to większego grona ;-) tych co nie potrafią utworzyć katalogu na Chomiku.

Aby więcej nie marudzić zamieszczam mój kod (trochę w nim śmieci bo wycięty z całości):

unit test_v00;

interface

uses
  SysUtils,
  Classes,
  Windows,
  HttpProt,
  ShellApi,
  StrUtils,
  DateUtils,
  HTTPSend, blcksock,
  Dialogs,
  Messages, Controls, Forms,
  IdBaseComponent, IdHTTP, HTTPApp, IdURI,
  IdCoder, IdCoder3to4, IdCoderMIME,  IdMultipartFormData,
  StdCtrls, ComCtrls, IdTCPClient, IdTCPConnection, IdComponent, ExtCtrls,
  Variants, Graphics, IdTCPServer;

type
  TForm1 = class(TForm);
  TSearch = String;
  TTableee = array of TSearch;
  TProgress = class(TObject)
  LocalFile : PChar;
  RemoteFile : PChar;
  tmr : TTimer;
  Forum : TIdHTTP;
  IdTCPClient1: TIdTCPClient;
  private
    { Private declarations }
  public
    { Public declarations }
  end;

const
  naglowek = 'testowanie chomika';
  Opera_UserAgent = 'Mozilla/5.0 (Windows NT 5.1; rv:33.0) Gecko/20100101 Firefox/33.0';
  ToPost_MimeType = 'application/x-www-form-urlencoded; charset=UTF-8';
  Location_Prefix = 'Location:' + #32;
  login = 'chomik_testowy1';
  haslo = 'Haslo1234';

var
  Form1: TForm1;
  PreviousPath : string;
  CurrentPath : string;
  FLIndex : Integer;
  PathExe : string;
  HttpCli: THttpCli;
  HttpCli_nastepna: THttpCli;
  FileDate : _FILETIME;
  links : string;
  FileList : TStringList;
  ProgressObject : TProgress;
  GetSizeExtensions : string;
  SearchRecord : TSearchRec;
  LastPage : string;
  IsGettingFile : Boolean;
  AbortCopy : Boolean;
  GetFileNow : string;
  Parsed : Boolean;
  Debug, Debug2 : Text;

  token, chomik_id, chomik_treeticks, cookies : String;
  wszystkie_pobrane_strony, tylkonazwapliku : String;
  sl_pelna_sciezka : String;
  sl_do_wyswietlenia : String;
  sl_rozszerzenia : String;
  sl_rozmiar : String;
  sl_data : String;
  sl_id_katalogu : String;
  sl_id_pliku : String;
  tablica_katalogow : array[0..1] of String;
  tablica_wielowymiarowa :  array of array of String;
  SynHttp : THttpSend;
  strona : TMemoryStream;

implementation

{$R *.dfm}

//_________________________________________________________________
// strumień na string
function StreamToString(aStream: TStream): string;
var
  SS: TStringStream;
begin
  if aStream <> nil then
  begin
    SS := TStringStream.Create('');
    try
      SS.CopyFrom(aStream, 0);  // No need to position at 0 nor provide size
      Result := SS.DataString;
    finally
      SS.Free;
    end;
  end else
  begin
    Result := '';
  end;
end;
//______________________________________________________________________________
// funkcja dodana w celu wyszukiwania tekstu między dwoma stringami
function StringBetween(const Input, Delim1, Delim2: string): string;
var
  aPos, bPos: Integer;
begin
  result := '';
  aPos := Pos(Delim1, Input);
  if aPos > 0 then begin
    bPos := PosEx(Delim2, Input, aPos + Length(Delim1));
    if bPos > 0 then begin
      result := Copy(Input, aPos + Length(Delim1), bPos - (aPos + Length(Delim1)));
    end;
  end;
end;
//______________________________________________________________________________
// kompletna procedura do logowania do Chomika za pomocą Synapse
procedure chomik_zaloguj_synapse();
var
  adres, komenda, zadanie, wynik : String;
  I, Position : integer;
  URLData, Str, RedirUrl, FPage : string;
  login1, login2 : String;
begin
  // LOGOWANIE DO CHOMIKA
  strona := TMemoryStream.Create;
  SynHttp := THttpSend.Create;
  try
    // najpierw pobieramy strone logowania
    SynHttp.UserAgent := Opera_UserAgent;
    SynHttp.Headers.Insert(0, 'Referer: http://chomikuj.pl/');
    SynHttp.Headers.Insert(0, 'Accept-Language: pl,en-US;q=0.7,en;q=0.3');
    SynHttp.Headers.Insert(0, 'Accept-Encoding: gzip, deflate');
    SynHttp.Headers.Insert(0, 'X-Requested-With: XMLHttpRequest');
    SynHttp.Headers.Insert(0, 'Accept: */*');
    SynHttp.Headers.Insert(0, 'DNT: 1');
    SynHttp.KeepAlive := True;
    SynHttp.Protocol := '1.1';
    SynHttp.MimeType := ToPost_MimeType;
    HTTPpostURL('http://chomikuj.pl', '=', strona);
    strona.Seek(0,soFromBeginning);
    //strona.SaveToFile('C://Test POST GET przed zalogowaniem 22.html');

    // teraz z otrzymanego kodu HTML pobieram token i przetwarzamy go
    token := StringBetween ( StreamToString(strona), '<input name="__RequestVerificationToken" type="hidden" value="', '==" />');
    token := StringReplace(token, '/', '%2F', [rfReplaceAll]);
    token := StringReplace(token, '+', '%2B', [rfReplaceAll])+ '%3D%3D';
  finally
    strona.Free;
  end;

  try
    // teraz logujemy się do Chomika z loginem, haslem i tokenem
    adres := 'http://chomikuj.pl';
    komenda := '/action/Login/TopBarLogin';
    UrlData := 'ReturnUrl=&Login=' + login + '&Password=' + haslo + '&__RequestVerificationToken=' + token;
    SynHttp.KeepAlive := True;
    SynHttp.Protocol := '1.1';
    SynHttp.MimeType := ToPost_MimeType;
    SynHttp.UserAgent := Opera_UserAgent;
    SynHttp.Headers.Insert(0, 'Referer: http://chomikuj.pl/');
    SynHttp.Headers.Insert(0, 'Accept-Language: pl,en-US;q=0.7,en;q=0.3');
    SynHttp.Headers.Insert(0, 'Accept-Encoding: gzip, deflate');
    SynHttp.Headers.Insert(0, 'X-Requested-With: XMLHttpRequest');
    SynHttp.Headers.Insert(0, 'Accept: */*');
    SynHttp.Headers.Insert(0, 'DNT: 1');
    SynHttp.Document.Write(Pointer(URLData)^, Length(URLData));
    SynHttp.HTTPMethod('POST', adres + komenda);
    cookies := SynHttp.Cookies.Text;
//MessageBox(0, PChar(cookies), 'chomik zaloguj 1', MB_OK or MB_DEFBUTTON2 or MB_ICONWARNING);
    SynHttp.Document.SaveToFile('C://00 logowanie synapse.html');
    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
              RedirUrl := Copy(Str, Position + Length(Location_Prefix), MaxInt);
              if Pos('/', RedirUrl) = 1 then
              begin
                RedirUrl := adres + RedirUrl;
              end
              else
              begin
                RedirUrl := adres + '/' + RedirUrl;
              end;
            end;
          end;
          SynHttp.Headers.Clear;
          SynHttp.Document.Write(Pointer(URLData)^, Length(URLData));
          SynHttp.HTTPMethod('POST', RedirUrl);
          cookies := SynHttp.Cookies.Text;
//MessageBox(0, PChar(cookies), 'chomik zaloguj 2', MB_OK or MB_DEFBUTTON2 or MB_ICONWARNING);
          SetLength(FPage, SynHttp.Document.Size);
          SynHttp.Document.Read(PChar(FPage)^, Length(FPage));
          if Pos('topbarTransferHelp', FPage) > 0 then
          begin
            MessageBox(0, PChar('Zalogowany prawidłowo.'), PChar(naglowek), MB_ICONINFORMATION + MB_OK);
          end;
          if Pos('LoginError', FPage) > 0 then
          begin
            MessageBox(0, PChar('Podane hasło lub login są nieprawidłowe.'), PChar(naglowek), MB_ICONERROR + MB_OK);
          end;
        end
    else
      begin
        SetLength(FPage, SynHttp.Document.Size);
        SynHttp.Document.Read(PChar(FPage)^, Length(FPage));
        MessageBox(0, PChar('Problem z łączem. Spróbuj jeszcze raz.'), PChar(naglowek), MB_ICONERROR + MB_OK);
      end;
    end;

  // szukanie unikalnego ID oraz name="TreeTicks" dla naszego Chomika/loginu
  chomik_id := StringBetween ( FPage, 'name="ChomikId" value="', '"');
  chomik_treeticks := StringBetween ( FPage, 'name="TreeTicks" value="', '" />');

  //MessageBox(0, PChar(token + login + haslo + ' ' + cookies), 'fsinit', MB_OK or MB_DEFBUTTON2 or MB_ICONWARNING);
  Assign(Debug, 'C://01 zalogowany synapse.html');
  Rewrite(Debug);
  Writeln(Debug, Fpage);

  finally
    // tutaj nie zamykac sesji SynHTTP, aby byc widocznym jako ciagle zalogowany do Chomika
    // przy wywyolywaniu kolejnych komend HTTP POST i GET
    //SynHttp.Free;
  end;

end;
//______________________________________________________________________________
procedure chomik_mkdir();
var
  adres, komenda_katalogi, komenda_pliki, zadanie, wynik : String;
  I, Position : integer;
  URLData_pliki, URLData_katalogi, URLData_strona, Str, FPage, Redirurl, DirectLink : string;
  referer, id_katalogu, nr_podkatalogu : string;
  MemStream : TMemoryStream;

begin
  // nie trzeba otwierac nowej sesji SynHttp, bo jestesmy w sesji z funkcji chomik_zaloguj()
  // i dzięki temu caly czas jestesmy widoczni jako zalogowani do Chomika
  try
    // klikamy na utworzenie katalogu (nie jest to konieczne)
    // na ten POST dostaję prawidlową odpowiedz,
    adres := 'http://chomikuj.pl';
    referer := 'http://chomikuj.pl/' + login;
    komenda_katalogi := '/action/folderOptions/newFolder';
    URLData_katalogi := 'chomikId=' + chomik_id + '&folderId=0&__RequestVerificationToken=' + token;
    SynHttp.Headers.Clear;
    SynHttp.Clear;
    SynHttp.Document.Clear;
    SynHttp.UserAgent := 'Mozilla/5.0 (Windows NT 5.1; rv:33.0) Gecko/20100101 Firefox/33.0';
    SynHttp.MimeType := 'application/x-www-form-urlencoded; charset=UTF-8';
    SynHttp.KeepAlive := True;
    SynHttp.Protocol := '1.1';
    SynHttp.Headers.Insert(0, 'Accept: */*');
    SynHttp.Headers.Insert(0, 'Accept-Language: pl,en-US;q=0.7,en;q=0.3');
    SynHttp.Headers.Insert(0, 'Accept-Encoding: gzip, deflate');
    SynHttp.Headers.Insert(0, 'DNT: 1');
    SynHttp.Headers.Insert(0, 'X-Requested-With: XMLHttpRequest');
    SynHttp.Headers.Insert(0, 'Referer: ' + referer);
    SynHttp.Headers.Insert(0, 'Pragma: no-cache');
    SynHttp.Headers.Insert(0, 'Cache-Control: no-cache');
    SynHttp.Document.Write(Pointer(URLData_katalogi)^, Length(URLData_katalogi));
    SynHttp.HTTPMethod('POST', adres + komenda_katalogi);
    cookies := SynHttp.Cookies.Text;
//MessageBox(0, PChar(cookies), 'mkdir 1', MB_OK or MB_DEFBUTTON2 or MB_ICONWARNING);

    case SynHttp.ResultCode of
      200 :
         begin
          cookies := SynHttp.Cookies.Text;
          // POST tworzący katalog na Chomki
          // dostaję na niego odpowiedź: 500 Internal Server Error
          komenda_katalogi := '/action/FolderOptions/NewFolderAction';
          URLData_katalogi := 'FolderId=0&ChomikId=' + chomik_id + '&FolderName=foldertestowy&AdultContent=false&NewFolderSetPassword=false&Password=&__RequestVerificationToken=' + token;
          SynHttp.Headers.Clear;
          SynHttp.Clear;
          SynHttp.Document.Clear;
          SynHttp.UserAgent := 'Mozilla/5.0 (Windows NT 5.1; rv:33.0) Gecko/20100101 Firefox/33.0';
          SynHttp.MimeType := 'application/x-www-form-urlencoded; charset=UTF-8';
          //SynHttp.MimeType := 'application/json';
          SynHttp.KeepAlive := True;
          SynHttp.Protocol := '1.1';
          SynHttp.Headers.Insert(0, 'Accept: */*');
          SynHttp.Headers.Insert(0, 'Accept-Language: pl,en-US;q=0.7,en;q=0.3');
          SynHttp.Headers.Insert(0, 'Accept-Encoding: gzip, deflate');
          SynHttp.Headers.Insert(0, 'DNT: 1');
          SynHttp.Headers.Insert(0, 'X-Requested-With: XMLHttpRequest');
          SynHttp.Headers.Insert(0, 'Referer: ' + referer);
          SynHttp.Headers.Insert(0, 'Pragma: no-cache');
          SynHttp.Headers.Insert(0, 'Cache-Control: no-cache');
          SynHttp.Document.Write(Pointer(URLData_katalogi)^, Length(URLData_katalogi));
          SynHttp.HTTPMethod('POST', adres + komenda_katalogi);
          cookies := SynHttp.Cookies.Text;
//MessageBox(0, PChar(cookies), 'mkdir 3', MB_OK or MB_DEFBUTTON2 or MB_ICONWARNING);
          SetLength(FPage, SynHttp.Document.Size);
          SynHttp.Document.Read(PChar(FPage)^, Length(FPage));
          Assign(Debug, 'C://03 zalogowany tworzenie katalogu.html');
          Rewrite(Debug);
          Writeln(Debug, FPage);
         end;
    end;
  finally
    //SynHttp.Free;
  end;

end;

// Glówny program
begin

chomik_zaloguj_synapse;
chomik_mkdir;

end. 

Odpowiedź Chomika na próbę utworzenia katalogu za pomocą procedury chomik_mkdir (z powyższego kodu Delphi):

POST /action/FolderOptions/NewFolderAction HTTP/1.1
Host: chomikuj.pl
Connection: keep-alive
Cookie: rcid=9; guid=55dc2e63-3176-44c4-ab0b-0cc70d9ac118; RememberMe=19717347=793b15d6174f3e2956a2f67b3f3a39b7; ChomikSession=43acb718-ccc7-46dd-827a-cce286a94c20; __RequestVerificationToken_Lw__=gFk4xT2WygG8fUzD6CIbueI1bBj3pchsAcXs0JPPgBEXtx4mEyxdhH41d2fzTv/Fpe89/e4smHcX661oCIlfUkSlLrVwKKs+y3E+ZZg7/4AWPmND7ooxwEgvCF7so3twNx/PhA==
User-Agent: Mozilla/5.0 (Windows NT 5.1; rv:33.0) Gecko/20100101 Firefox/33.0
Content-Type: application/x-www-form-urlencoded; charset=UTF-8
Content-Length: 285
Cache-Control: no-cache
Pragma: no-cache
Referer: http://chomikuj.pl/chomik_testowy1
X-Requested-With: XMLHttpRequest
DNT: 1
Accept-Encoding: gzip, deflate
Accept-Language: pl,en-US;q=0.7,en;q=0.3
Accept: */*

FolderId=0&ChomikId=19717347&FolderName=foldertestowy&AdultContent=false&NewFolderSetPassword=false&Password=&__RequestVerificationToken=TpEdNts1DXaRXftJt%2Bfa%2F2smty%2BH%2BW7dGMDfxhIAMA9t0MC8y669Dg1sDqrMTIEyFE4qCfwPGrDczmY6r4yY32Khr3IZz4aHjfqC4l2mSqnWiRwmIN4NSWRQ1lmFvoWEtxj46Q%3D%3D

HTTP/1.1 500 Internal Server Error
Cache-Control: private
Content-Type: application/json; charset=utf-8
Server: Microsoft-IIS/7.5
X-Server: m30
Date: Sun, 01 Mar 2015 23:36:40 GMT
Connection: close
Content-Length: 203

{"Type":"Window","Title":"Błąd","Content":"Niestety podczas przetwarzania żądania wystąpił błąd.","refreshTopBar":false,"IsSuccess":true,"Data":null,"ContainsCaptcha":false,"trackingCodeJS":null} 

A poniżej utworzenie katalogu w AutoIt. Jak widać nawet nagłówek ma mniej danych i poszło. W Delphi zrobiłem taki sam nagłówek i nie zadziałało, odpowiedź 500.

 POST /action/FolderOptions/NewFolderAction HTTP/1.1
Referer: http://chomikuj.pl/chomik_testowy1
Content-Type: application/x-www-form-urlencoded
Host: chomikuj.pl
Content-Length: 293
Connection: Keep-Alive
Cookie: rcid=7; __RequestVerificationToken_Lw__=r1svj+tG24JzpM6vpUpP+WAif0PO8wtpR8HaWrpJzvcvmS8z3YeHajT5mYq3fwnutxBRLFis0+In5urhHS3oinIw+TIjoCW62Cma2cw/QnFTMcPrCuQxiteTFrXDTe+TJvavOA==; ChomikSession=5e026036-2308-47e7-93e0-d97f4c52654f; guid=9189d54a-b352-4d93-bc26-4c1b2d8374b4; RememberMe=19717347=793b15d6174f3e2956a2f67b3f3a39b7

FolderId=0&ChomikId=19717347&FolderName=katalog_testowy&AdultContent=false&NewFolderSetPassword=false&Password=&__RequestVerificationToken=vGiUsjIR%2Bpzj683SapvmmWEoZtPFG8Q3jvHeBQUVyBCTC%2B1tMUTcoArakrb2MEpzGfy%2BF%2BWACRleUzpgUeGg61zfOa%2FslExxY6ax%2FnCF1VMnfp25HknacKuk7qi3VxmclgA%2B5A%3D%3D

HTTP/1.1 200 OK
Cache-Control: private
Content-Type: application/json; charset=utf-8
Server: Microsoft-IIS/7.5
X-Server: m32
Date: Mon, 02 Mar 2015 18:41:14 GMT
Connection: close
Content-Length: 166

{"Type":"Growl","Title":"","Content":"Folder został dodany","refreshTopBar":false,"IsSuccess":true,"Data":{"Status":0},"ContainsCaptcha":false,"trackingCodeJS":null}
1

Uprościłem Twój kod. Zapomniałem też, że na dysku mam kod ktory loguje się ok i rzeźbiłem go samodzielnie od zera, co nie działalo. W końcu zastosowałem Twój kod, bo poprzedni dla testów pobierał plik po ID ale przestał działać bo chyba już sposób podawania danych o pliku się zmienił. Ale w to nie wnikałem.

Co do mojego starego kodu. Miałem downloader ktory robił wiele rzeczy poza pobieraniem w tym operacje na plikach i folderach. Nie działało mi za Chiny Ludowe tylko wrzucanie na serwer. Ale od tamtego czasu zmienił się sposób prezentacji danycn w zwróconym HTNLu jak i pewnie sposób odpowiedniego postowania ich.

Anyway. Poniżej kod, który działa u mnie ok. Przerobienie tego na ładniejszą funkcje do lgoowania i tworzenia oraz obsługę błędów tworzenia katalogu jak i zamienianie niedozwolonych znaków czy spacji, pozostawiam już Tobie. Ważne, że działa. Z logowaniem trochę można się zamotać analizując WireSharkiem to co jest POSTowane. Ale za to przy tworzeniu katalogu pomogło. I w razie czego przechowuje ciasteczka w zmiennej, ale nie jest to póki co potrzebne.

Miejmy nadzieję, że pomimo upublicznienia kodu sposób obsługi znowu się nie zmieni za jakąś chwilę. Chociaż musze przyznać, że strona ta schodzi na psy z jakością. Mam tam konto od dawna. Doładowałem jakiś czas temu kilkoma GB. Ostatnio szukałem rzadkich mp3ek i pobierałem je z innego chomika z marnymi 300 kilobajtami na sekundę. Jak za płatną usługę jest to moim zdaniem żenująca prędkość. To tak btw :/

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls, httpsend;

const
  Base_Url = 'http://chomikuj.pl';
  Location_Prefix = 'Location:' + #32;
  Default_MimeType = 'application/x-www-form-urlencoded';
  Default_UserAgent = 'Opera/9.80 (Windows NT 6.1; U; pl) Presto/2.12.388 Version/12.17';

type
  TForm1 = class(TForm)
    Button1 : TButton;
    procedure Button1Click(Sender : TObject);
    procedure FormCreate(Sender : TObject);
  private
  public
  end;

var
  Form1 : TForm1;

implementation

{$R *.dfm}

function StreamToStr(AStream : TMemoryStream) : string;
begin
  Result := '';
  if AStream.Size > 0 then
  begin
    SetLength(Result, AStream.Size);
    AStream.Read(PChar(Result)^, Length(Result));
    Result := UTF8ToAnsi(Result);
  end;
end;

function SimpleParse(StrBegin, StrEnd, Str : string) : string;
var
  B, E : integer;
begin
  Result := '';
  if StrBegin = '' then
  begin
    B := 1;
  end
  else
  begin
    B := Pos(StrBegin, Str);
  end;
  if B > 0 then
  begin
    Str := Copy(Str, B + Length(StrBegin), MaxInt);
    if StrEnd = '' then
    begin
      E := Length(Str) + 1;
    end
    else
    begin
      E := Pos(StrEnd, Str);
    end;
    if E > 0 then
    begin
      Result := Copy(Str, 1, E - 1);
    end;
  end;
end;

procedure ChomikLogonAndMkDir;
const
  A_User = 'username';
  A_Pass = 'password';
  A_Folder = '!TEST!';
var
  SynHttp : THttpSend;
  I, Position : integer;
  LogonOk, MkDirOk : boolean;
  Address, Command, ChomikId, FCookies, FPage, Token, URLData, Str, RedirUrl : string;
begin
  LogonOk := False;
  MkDirOk := False;
  SynHttp := THttpSend.Create;
  with SynHttp do
  begin
    Headers.Insert(0, 'Referer: ' + Base_Url);
    Protocol := '1.1';
    KeepAlive := True;
    MimeType := Default_MimeType;
    UserAgent := Default_UserAgent;
    HTTPMethod('GET', Base_Url);
    Token := SimpleParse('<input name="__RequestVerificationToken" type="hidden" value="', '==" />', StreamToStr(Document));
    Token := StringReplace(Token, '/', '%2F', [rfReplaceAll]);
    Token := StringReplace(Token, '+', '%2B', [rfReplaceAll]) + '%3D%3D';
    Address := Base_Url;
    Command := '/action/Login/TopBarLogin';
    UrlData := 'ReturnUrl=&Login=' + A_User + '&Password=' + A_Pass + '&__RequestVerificationToken=' + token;
    Clear;
    MimeType := Default_MimeType;
    Headers.Insert(0, 'Referer: ' + Base_Url);
    Document.Write(Pointer(URLData)^, Length(URLData));
    HTTPMethod('POST', Address + Command);
    case ResultCode of
      301, 302 :
        begin
          for I := 0 to Headers.Count - 1 do
          begin
            Str := Headers[I];
            Position := Pos(Location_Prefix, Str);
            if Position > 0 then
            begin
              RedirUrl := Copy(Str, Position + Length(Location_Prefix), MaxInt);
              if Pos('/', RedirUrl) = 1 then
              begin
                RedirUrl := Address + RedirUrl;
              end
              else
              begin
                RedirUrl := Address + '/' + RedirUrl;
              end;
            end;
          end;
          Clear;
          Document.Write(Pointer(URLData)^, Length(URLData));
          HTTPMethod('POST', RedirUrl);
          FCookies := Cookies.Text;
          FPage := StreamToStr(Document);
          LogonOk := Pos('LoginError', FPage) = 0;
          if LogonOk then
          begin
            LogonOk := Pos('topbarTransferHelp', FPage) > 0;
            ChomikId := SimpleParse('name="ChomikId" value="', '"', FPage);
            Command := '/action/FolderOptions/NewFolderAction';
            UrlData := 'FolderId=0&ChomikId=' + ChomikId +
              '&FolderName=' + A_Folder +
              '&AdultContent=false&NewFolderSetPassword=false&Password=' +
              '&__RequestVerificationToken=' + Token;
            Clear;
            MimeType := Default_MimeType;
            Headers.Insert(0, 'Referer: ' + Base_Url + '/' + A_User);
            Document.Write(Pointer(URLData)^, Length(URLData));
            HTTPMethod('POST', Address + Command);
            FPage := StreamToStr(Document);
            MkDirOk := Pos('Folder został dodany', FPage) > 0;
          end;
        end;
    end;
  end;
  SynHttp.Free;
  if LogonOk then
  begin
    MessageBox(Application.Handle, PChar('Zalogowany prawidłowo.'), PChar(Application.Title), MB_ICONINFORMATION + MB_OK);
    if MkDirOk then
    begin
      MessageBox(Application.Handle, PChar('Folder: ' + A_Folder + ' został utworzony prawidłowo.'), PChar(Application.Title), MB_ICONINFORMATION + MB_OK);
    end;
  end
  else
  begin
    MessageBox(Application.Handle, PChar('Podane hasło lub login są nieprawidłowe.'), PChar(Application.Title), MB_ICONERROR + MB_OK);
  end;
end;

procedure TForm1.FormCreate(Sender : TObject);
begin
  Application.Title := Caption;
end;

procedure TForm1.Button1Click(Sender : TObject);
begin
  ChomikLogonAndMkDir;
end;

end.

P.S.: i widzę w Twoim kodzie używane przeze mnie nazewnictwo. Mimo to fajnie, że ktoś pyta w końcu jak coś zrobić pod Synapse. Bo nie samym Indykiem człowiek żyje. U nas nie ma święta dziękczynienia, więc po co jest indyki? ;) A i kAzek tym razem mógł odpocząć ;)

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