[ Nemanja Avramović @ 24.12.2004. 09:24 ] @
Kako odraditi da moj program posalje temu u npr. ovaj forum. Nije spamovanje foruma, vec me cisto zanima kako bi to moglo.

Otprilike:
1. rucno se regujem na forumu (uradjeno)
...e sad, program treba da uradi sledece
2. logovanje
3. postovanje poruke

E, kako ovo uraditi (ako je npr. POST metoda predvidjena za slanje poruka, kao i za logovanje)?

P.S. Ako postoji neki bolji forum od Pascal / Delphi / Kylix, molim moderatore da sto pre prebace temu tamo :)
[ sasas @ 24.12.2004. 09:50 ] @
Moglo bi sa TWebBrowser komponentom. Ja sam se pomocu iste uspevao logovati na yahoo, i dovlaciti spisak neprocitanih poruka. Nemam nazalost primer (u nastupu besa obrisao projekat :)

Naravno, googlaj 'delphi web form submit' za primere...

ss.

[ bancika @ 24.12.2004. 11:17 ] @
ja sam skoro radio nesto slicno (ne bas za forume, ustvari) ovo sto sam otkucao radi sa svim text poljima, polje za upload fajla, check box, radio button i drop down list...mislim da je dovoljno od mene :)

Code:

function TMainForm.FillForm(WebBrowser: TWebBrowser; FieldName: string; Value: string): Boolean;
var
  i, j, k: Integer;
  FormItem: Variant;
  Filled: boolean;

begin
  Result := False;
  if WebBrowser.OleObject.Document.all.tags('FORM').Length = 0 then
  begin
    Exit;
  end;
  for I := 0 to WebBrowser.OleObject.Document.forms.Length - 1 do
  begin
    FormItem := WebBrowser.OleObject.Document.forms.Item(I);
    for j := 0 to FormItem.Length - 1 do
    begin
      try
        if FormItem.Item(j).Name = FieldName then
         begin
          Filled := False;
          FormItem.Item(j).Style.Color := '#000000'; //font color
          if Trim(Value) <> '' then
           begin
             if (UpperCase(FormItem.Item(j).Type) = 'TEXT') or (UpperCase(FormItem.Item(j).Type) = 'TEXTAREA') or (UpperCase(FormItem.Item(j).Type) = 'PASSWORD') then
              begin
                FormItem.Item(j).Value := Value;
                Filled := True;
              end
             else if (UpperCase(FormItem.Item(j).Type) = 'SELECT-ONE') then
              begin
                for k := 0 to FormItem.Item(j).Options.Length - 1 do
                 if UpperCase(FormItem.Item(j).Options.Item(k).Text) = UpperCase(Value) then
                   begin
                     FormItem.Item(j).Options.Item(k).SetAttribute('selected', 'true');
                     Filled := True;
                   end;
              end
             else if (UpperCase(FormItem.Item(j).Type) = 'FILE') then
               begin
                 FormItem.Item(j).Focus;
                 SendKeys(PChar(Value), True);
                 Filled := True;
               end
             else if (UpperCase(FormItem.Item(j).Type) = 'CHECKBOX') or (UpperCase(FormItem.Item(j).Type) = 'RADIO') then
               begin
                 FormItem.Item(j).SetAttribute('checked', ShortString(Value));
                 Filled := True;
               end;
            Result := True;
          Exit;
         end;
      except
        Exit;
      end;
    end;
  end;
end;
[ bancika @ 24.12.2004. 11:21 ] @
i da, kako se koristi:

prvo reci WebBrowser.Navigate(adresa) i na OnDocumentComplete stavi da ti popunjava formu. Pre toga moras da rucno pogledas kako se zovu polja koja hoces da popunis i stavis njihova imena.
Da bi submitiovao formu nadji ole tip Submit i pozovi metod Click....isto ovako for petljama kao za Fill.
[ Nemanja Avramović @ 24.12.2004. 11:21 ] @
hvala obojici

idem sad u skolu, kad se vratim probacu!
[ Nemanja Avramović @ 24.12.2004. 16:17 ] @
Imam malih problema (verovatno za ovaj prvi treba nesto u uses).......

evo gresaka:
[Error] Unit1.pas(68): Undeclared identifier: 'SendKeys'
[Error] Unit1.pas(79): 'END' expected but 'EXCEPT' found
[Error] Unit1.pas(81): EXCEPT or FINALLY expected

i slike: :)


(kad komentujem prvu gresku prijavi mi drugu, kad komentujem drugu ne prijavljuje mi trecu, zato nema slike za trecu)

p.s. na kraju se vidi deo mog koda (navigate to localhost, ...) <- imam kuci podignut apache.......

i jedno podpitanje: Kako naci posle svega SUBMIT taster i simulirati pritisak na njega?


Thanks to ImageShack for Free Image Hosting
[ Nemanja Avramović @ 24.12.2004. 19:03 ] @
Resio sam svoje probleme sa sledece dve funkcije (i zahvalan sam banciki na gornjoj funkciji puno):

Popunjavanje:
Code:

function FillForm(WebBrowser: TWebBrowser; FieldName: string; Value: string): Boolean;
var
  i, j: Integer;
  FormItem: Variant;
begin
Result := False;
if WebBrowser.OleObject.Document.all.tags('FORM').Length = 0 then Exit;
  for I := 0 to WebBrowser.OleObject.Document.forms.Length - 1 do
  begin
  FormItem := WebBrowser.OleObject.Document.forms.Item(I);
    for j := 0 to FormItem.Length - 1 do
    begin
      if (UpperCase(FormItem.Item(j).Type) = 'TEXT') or (UpperCase(FormItem.Item(j).Type) = 'TEXTAREA') or (UpperCase(FormItem.Item(j).Type) = 'PASSWORD') then
      begin
      FormItem.Item(j).Value := Value;
      Result := True;
      end;
    end;
  end;
end;


Submitovanje:
Code:

function SubmitForm(WebBrowser: TWebBrowser): Boolean;
var
  i, j: Integer;
  FormItem: Variant;
begin
Result := False;
if WebBrowser.OleObject.Document.all.tags('FORM').Length = 0 then Exit;
  for I := 0 to WebBrowser.OleObject.Document.forms.Length - 1 do
  begin
  FormItem := WebBrowser.OleObject.Document.forms.Item(I);
    for j := 0 to FormItem.Length - 1 do
    begin
      if (UpperCase(FormItem.Item(j).Type) = 'SUBMIT') then
      begin
      FormItem.Item(j).focus; //selektujemo taster
      keybd_event( Ord(' '), MapvirtualKey( Ord(' '), 0), 0, 0 ); //"pritisnemo" space
      keybd_event( Ord(' '), MapvirtualKey( Ord(' '), 0), KEYEVENTF_KEYUP, 0 ); //"otpustimo" space
      Result := True;
      end;
    end;
  end;
end;


p.s. ovo nece lepo da radi ako ima vise formi na stranici

p.p.s. u attachmentu poruke imate gotov demo (trebace Vam web server i php instalirani, s obzirom da sam radio u PHP-u)

irie
[ Nemanja Avramović @ 24.12.2004. 19:19 ] @
E, tek sad videh tvoju poruku (u isto vreme smo pisali). Evo bolje funkcije za submit:
Code:

function SubmitForm(WebBrowser: TWebBrowser): Boolean;
var
  i, j: Integer;
  FormItem: Variant;
begin
Result := False;
if WebBrowser.OleObject.Document.all.tags('FORM').Length = 0 then Exit;
  for I := 0 to WebBrowser.OleObject.Document.forms.Length - 1 do
  begin
  FormItem := WebBrowser.OleObject.Document.forms.Item(I);
    for j := 0 to FormItem.Length - 1 do
    begin
      if (UpperCase(FormItem.Item(j).Type) = 'SUBMIT') then
      begin
      FormItem.Item(j).click;
      Result := True;
      end;
    end;
  end;
end;
[ bancika @ 24.12.2004. 20:19 ] @
pa da, reko sam ti da je bolje da koristis click metod.
nema na cemu
Za sendKey ti treba SndKey32 unit. Microsoft je zabranio izmenu Value polja za FILE objekat (zbog navodne zloupotrebe) pa mora ovako na silu da se ukuca vrednost u njega.
[ Nemanja Avramović @ 25.12.2004. 00:00 ] @
Ma ok, meni (zasad) treba samo za text polja (textarea i password, naravno)...

Irie
[ SFilip @ 01.01.2005. 22:02 ] @
a kako skinuti sadrzaj nekog sajta(recimo presnimiti sve odgovore sa ove teme u txt fajlove)?
[ Nemanja Avramović @ 02.01.2005. 10:45 ] @
bilo koju stranicu mozes "dovuci" sa NMHTTP komponentom, a sad, parsiranje da izvuces samo tekstove poruka...... dunno
[ SFilip @ 02.01.2005. 14:00 ] @
mozes li da mi das link za download te komponente?
BTW isprobao sam tvoju funkciju FillForm, ali ne radi kako treba: uvek popuni sve textbox-ove na strani istim tekstom-nije vazno sta upisem pod FieldName.
[ Nemanja Avramović @ 02.01.2005. 14:23 ] @
NMHTTP dobijas uz Delphi (6) i nalazi se na kartici... ne znam :) ili Internet, ili tako nesto; ili Indy........

Code:

  NMHTTP1.InputFileMode := FALSE;
  NMHTTP1.OutputFileMode := FALSE;
  NMHTTP1.ReportLevel := Status_Basic;
  NMHTTP1.Get('http://domen.com/fajl.txt');
  Memo1.Text := NMHTTP1.Body;


A FillForm? Ja sam je probao samo na stranicama sa jednim tekstualnim poljem :( i radila je.... videcu..........

irie

edit: @bancika: posto si ti dao osnovu ove funkcije, pogledaj po kodu samo da li radi....