problem z metodą POST w Delphi

0

Hej !
Dostałem takie zadania:
napisać programik, który połączy się z wikipedią (oczywiście jest potrzebne hasło i login - bo wiki jest zabezpieczona), a następnie utworzy w niej artykuł o nazwie Student i umieści w nim dane: imie, nazwisko, nr indeksu.
Zadanie niby banalne :-P
Udało mi się napisać moduł zalogowania na wikipedii

procedure TForm1.Button1Click(Sender: TObject);
var
  i: Integer;
  EncodedStr: string;
: OleVariant;
  Post: OleVariant;
begin
  EncodedStr := 'wpName=login&wpPassword=haslo';

  // The post must be an array. But without null terminator (-1)
  Post := VarArrayCreate([0, Length(EncodedStr) - 1], varByte);

  // Put Post in array
  for I := 1 to Length(EncodedStr) do
    Post[I - 1] := Ord(EncodedStr[I]);

  Header := 'Content-Type: application/x-www-form-urlencoded' + #10#13;
  
WebBrowser1.Navigate('http://127.0.0.1/~mediawiki/index.php?title=Special:Userlogin&action=submitlogin&type=login', EmptyParam, EmptyParam, Post, Header);

  end;

I loguje się prawidłowo ;-P . Problem mam z utworzeniem artykułu:

procedure TForm1.Button6Click(Sender: TObject);
var
  strData: string;
  PostData: OleVariant;
  Headers : OleVariant;
  i: Integer;
begin

   strData :=
   'wpEditToken=' + '+/' + '&' +
   'wpSave=' + 'Save page' + '&' +
   'wpStarttime=' + '20071128191943' + '&' +
   'wpEdittime=' + '20071128191953' + '&' +
   'wpTextbox1=' + 'Imie<br>Nazwisko<br>Nr indeksu';

   PostData := VarArrayCreate([0, Length(strData) - 1], varByte);

   for i := 1 to Length(strData) do
     PostData[i-1] := Ord(strData[i]);

  Headers := 'Content-Type: application/x-www-form-urlencoded' + #10#13;

  WebBrowser1.Navigate('http://127.0.0.1/~mediawiki/index.php?title=Student&action=submit', EmptyParam, EmptyParam, PostData, Headers);
end;

I niby wszystko działa, ale pokazuje się komunikat:

Przepraszamy! Serwer nie może przetworzyć tej edycji z powodu utraty danych sesji. Spróbuj 
jeszcze raz. Jeśli to nie pomoże - wyloguj się i zaloguj ponownie.  

Czy ktoś wie jak to naprawić? Chodzi mi o to, żeby po naciśnięciu buttona utworzony został artykuł.

Oczywiście testuje wszystko na localhostcie, a nie zaśmiecam wikipedii P

0

Zaznacz HandleRedirect na TRUE... Pewnie to jest powodem bledu.

0
monsterrrr napisał(a)

Zaznacz HandleRedirect na TRUE... Pewnie to jest powodem bledu.

e..... a to nie jest w idHttp? Bo ja bym wolał Webbrowser (no chyba , że się nie da). Tak próbowałemm i nici.

var
  Output, Input: TStringStream;
begin
  Output := TStringStream.Create('');
  Input := TStringStream.Create('');

  IdHttp1.Request.ContentType := 'application/x-www-form-urlencoded';

  Input := TStringStream.Create('');
  Output := TStringStream.Create('');
  try
    Input.WriteString(  'editform=' + 'posad' + '&' +
   'wpEditToken=' + 'wqe' + '&' +
   'wpSave=' + 'save' + '&' +
   'wpStarttime=' + '20071128191943' + '&' +
   'wpEdittime=' + '20071128191953' + '&' +
   'wpTextbox1=' + 'asdadasdadasdasd');

    IdHTTP1.HandleRedirects := true;
    IdHTTP1.Connect();
    IdHTTP1.Post('http://127.0.0.1/~mediawiki/index.php?title=Hello&action=submit', Input, Output);
    ShowMessage('postłem');
    IdHTTP1.Disconnect;
    ShowMessage('wypisałm');
  finally
    FreeAndNil(Input);
    FreeAndNil(Output);
  end;
end;

:-( :-( :-(

0

Prawdopodobnie najpierw musisz pobrać żródło strony dodawania nowego artykułu i wyszukać tam numer sesji, gdyż jest on konieczny. Następnię dodać go do do danych POST albo w adres na który wysyłasz metodę, zależy od kodu. Szukaj czegoś w stylu sid= lub podobne. Albo zesnifuj przeglądarkę jakie dane są wysyłane podczas tworzenia nowego artykułu.

0

http://img210.imageshack.us/my.php?image=obrazekhk0.png

user image

Coś takiego udało mi się zrobić w zdarzeniu WebBrowser1BeforeNavigate2 efekty widać na obrazku [green] . Ale to okienko pojawia się gdy będąc na stronie wikipedii i edytując jakiś artykuł nacisnę np. Pokaż Podgląd lub zapisz. Ale jak zrobić żeby program robił to sam za pomocą buttona ? Pomocy [!!!]

procedure TForm1.WebBrowser1BeforeNavigate2(ASender: TObject;
  const pDisp: IDispatch; var URL, Flags, TargetFrameName, PostData,
  Headers: OleVariant; var Cancel: WordBool);

  var qaz:OleVariant;


  function OleVariantToMemoryStream(OV: OleVariant): TMemoryStream;
  var
    Data: PByteArray;
    Size: integer;
  begin
    Result := TMemoryStream.Create;
    try
       Size := VarArrayHighBound (OV, 1) - VarArrayLowBound(OV, 1) + 1;
       Data := VarArrayLock(OV) ;
       try
         Result.Position := 0;
         Result.WriteBuffer(Data^, Size) ;
       finally
         VarArrayUnlock(OV) ;
       end;
    except
       Result.Free;
       Result := nil;
    end;
  end;


var
  ms: TMemoryStream;
  ss: TStringStream;
begin
  ss := TStringStream.Create('') ;
  try
    if Length(PostData) > 0 then
    begin
      ms := OleVariantToMemoryStream(PostData) ;
      ms.Position := 0;
      ss.CopyFrom(ms, ms.size) ;
      ss.Position := 0;
      ShowMessage('HEADER:' + Headers + #13#10#13#10 + ss.DataString) ;
    end;
  finally
    ss.Free;
  end;

end;

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