Konuyu Oyla:
  • Derecelendirme: 0/5 - 0 oy
  • 1
  • 2
  • 3
  • 4
  • 5
Webden veri alma
#1
İyi günler.

FMX tarafında WebBrowser1 verileri nasıl alabilirim?

web sayfası bana özel sayfa tamamen boş sadece, textler var


Örnek: User, pasw, Lasdate alalardaki verileri döngü ile alacağım herhangi bir div veya span içinde değil textler boş html.

Ahmet 12345 20.12.2023
Ayşe 12345 20.12.2023
Nuray 12345 20.12.2023


procedure TMainForm.Button2Click(Sender: TObject);
var
  i: Integer;
begin
  for I := 0 to WebBrowser1.Document.Length - 1 do
  begin

   end;
  end;
end;
Cevapla
#2
FMX yapıda platform gereği; TWebBrowser ile değil de
// System.Net.HttpClientComponent unitindedir...

TNetHTTPClient

ile verileri çekmeyi düşünmek isteyebilirsiniz. 

Örnek :
uses System.Net.HttpClientComponent, System.Net.HttpClient;

function MakeRequest(aUrl: string): string;
var
  LClient   : System.Net.HttpClientComponent.TNetHTTPClient;
  LResponse : System.Net.HttpClient.IHTTPResponse;
begin
  LClient := TNetHTTPClient.Create(nil);
  try
    LClient.UserAgent  := 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/107.0.0.0 Safari/537.36';
    LClient.Accept     := 'text/html';
    LResponse := LClient.Get(aUrl);
    // 404 not forund
    // 200 OK
    case LResponse.StatusCode of
    200: // success
      Result := LResponse.ContentAsString;
    404: // not found
      Result := '[ERROR] Page not found...';
    else
      Result := '[ERROR]' + sLineBreak + LResponse.ContentAsString;
    end;
  finally
    FreeAndNil(LClient);
  end;
end;

Kullanımı :
procedure TForm1.Button1Click(Sender: TObject);
var
  LContent : string;
begin
  LContent := MakeRequest('https://www.google.com.tr');
  // ...

end;
Saygılarımla
Muharrem ARMAN

guplouajuixjzfm15eqb.gif
Cevapla
#3
(20-12-2022, Saat: 12:35)Husv Adlı Kullanıcıdan Alıntı: İyi günler.

FMX tarafında WebBrowser1 verileri nasıl alabilirim?

web sayfası bana özel sayfa tamamen boş sadece, textler var


Örnek: User, pasw, Lasdate alalardaki verileri döngü ile alacağım herhangi bir div veya span içinde değil textler boş html.

Ahmet 12345 20.12.2023
Ayşe 12345 20.12.2023
Nuray 12345 20.12.2023


procedure TMainForm.Button2Click(Sender: TObject);
var
  i: Integer;
begin
  for I := 0 to WebBrowser1.Document.Length - 1 do
  begin

   end;
  end;
end;

unit Unit1;

interface

uses
 System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants,
 FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs,
 FMX.Memo.Types, FMX.StdCtrls, FMX.Controls.Presentation, FMX.ScrollBox,
 FMX.Memo, FMX.WebBrowser, IdContext, IdCustomHTTPServer, IdBaseComponent,
 IdComponent, IdCustomTCPServer, IdHTTPServer;

type
 TForm1 = class(TForm)
   WebBrowser1: TWebBrowser;
   Memo1: TMemo;
   Button1: TButton;
   Timer1: TTimer;
   IdHTTPServer1: TIdHTTPServer;
   procedure FormCreate(Sender: TObject);
   procedure Button1Click(Sender: TObject);
   procedure Timer1Timer(Sender: TObject);
   procedure IdHTTPServer1CommandGet(AContext: TIdContext;
     ARequestInfo: TIdHTTPRequestInfo;
     AResponseInfo: TIdHTTPResponseInfo);
 private
   { Private declarations }
 public
   { Public declarations }
 end;

var
 Form1: TForm1;

implementation

{$R *.fmx}


uses FMX.Platform, System.Rtti, IdGlobal;


procedure TForm1.FormCreate(Sender: TObject);
begin
webbrowser1.Navigate('https://www.google.com');
end;


procedure TForm1.IdHTTPServer1CommandGet(AContext: TIdContext;  ARequestInfo: TIdHTTPRequestInfo; AResponseInfo: TIdHTTPResponseInfo);
begin
memo1.lines.add('! IdHTTPServer1CommandGet');

if ARequestInfo.CommandType=THTTPCommandType.hcPOST then
begin 
 memo1.lines.add('POST: '+ ReadStringFromStream( ARequestInfo.PostStream, -1, IndyTextEncoding_UTF8 ) );
 
end;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
timer1.enabled:=False;
Button1Click(Sender);
end;

procedure TForm1.Button1Click(Sender: TObject);
var
 uClipBoard : IFMXClipboardService;
 Value : TValue;
 Text : string;
 
begin
 WebBrowser1.EvaluateJavaScript( ' var veri=document.documentElement.outerHTML; '+
                                 ' xmlhttp = new XMLHttpRequest(); xmlhttp.open("POST", "http://127.0.0.1:8090", true); xmlhttp.send(veri); ');
end;



end.


object Form1: TForm1
 Left = 0
 Top = 0
 Caption = 'Form1'
 ClientHeight = 708
 ClientWidth = 490
 Position = ScreenCenter
 FormFactor.Width = 320
 FormFactor.Height = 480
 FormFactor.Devices = [Desktop]
 OnCreate = FormCreate
 DesignerMasterStyle = 3
 object WebBrowser1: TWebBrowser
   Align = Top
   Size.Width = 490.000000000000000000
   Size.Height = 181.000000000000000000
   Size.PlatformDefault = False
   WindowsEngine = EdgeIfAvailable
 end
 object Memo1: TMemo
   Touch.InteractiveGestures = [Pan, LongTap, DoubleTap]
   DataDetectorTypes = []
   Align = Top
   Position.Y = 181.000000000000000000
   Size.Width = 490.000000000000000000
   Size.Height = 224.000000000000000000
   Size.PlatformDefault = False
   TabOrder = 1
   Viewport.Width = 482.000000000000000000
   Viewport.Height = 216.000000000000000000
 end
 object Button1: TButton
   Align = Client
   Size.Width = 490.000000000000000000
   Size.Height = 303.000000000000000000
   Size.PlatformDefault = False
   TabOrder = 2
   Text = 'Button1'
   OnClick = Button1Click
 end
 object Timer1: TTimer
   Interval = 3000
   OnTimer = Timer1Timer
   Left = 400
   Top = 489
 end
 object IdHTTPServer1: TIdHTTPServer
   Active = True
   Bindings = <
     item
       IP = '127.0.0.1'
       Port = 8090
     end>
   DefaultPort = 8090
   OnCommandGet = IdHTTPServer1CommandGet
   Left = 16
   Top = 433
 end
end



Screenshot-2022-12-21-01-51-43-895-com-e...oject1.png

(20-12-2022, Saat: 20:39)mrmarman Adlı Kullanıcıdan Alıntı: FMX yapıda platform gereği; TWebBrowser ile değil de
// System.Net.HttpClientComponent unitindedir...

TNetHTTPClient

ile verileri çekmeyi düşünmek isteyebilirsiniz. 

Örnek :
uses System.Net.HttpClientComponent, System.Net.HttpClient;

function MakeRequest(aUrl: string): string;
var
  LClient   : System.Net.HttpClientComponent.TNetHTTPClient;
  LResponse : System.Net.HttpClient.IHTTPResponse;
begin
  LClient := TNetHTTPClient.Create(nil);
  try
    LClient.UserAgent  := 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/107.0.0.0 Safari/537.36';
    LClient.Accept     := 'text/html';
    LResponse := LClient.Get(aUrl);
    // 404 not forund
    // 200 OK
    case LResponse.StatusCode of
    200: // success
      Result := LResponse.ContentAsString;
    404: // not found
      Result := '[ERROR] Page not found...';
    else
      Result := '[ERROR]' + sLineBreak + LResponse.ContentAsString;
    end;
  finally
    FreeAndNil(LClient);
  end;
end;

Kullanımı :
procedure TForm1.Button1Click(Sender: TObject);
var
  LContent : string;
begin
  LContent := MakeRequest('https://www.google.com.tr');
  // ...

end;

fikir vermesi açısından yaptım, biraz ters oldu ama sanırım yapabileceğimiz android tarafında en fazla bu şekilde olacakdır, sizin bunu daha güzel bir hale getireceğinize eminim.

js ile  "document.documentElement.outerHTML" clipboard a write denedim ilginç bir şekilde yazamadı, araştırmak lasım, o şekilde soket serversiz daha kolay olurdu.
esasında executejavascript in return değeri kaldırılmış, procedure ye çevirilmiş oysaki oradan evulate yapılabilinirdi.

bu yapı ile yine js kullanılarak sayfa içi görsel aksiyonlardan sonra, fmx uygulamaya bir işlem yaptırmak için trigger da yaptırılabilir.
Cevapla
#4
(20-12-2022, Saat: 20:39)mrmarman Adlı Kullanıcıdan Alıntı: FMX yapıda platform gereği; TWebBrowser ile değil de
// System.Net.HttpClientComponent unitindedir...

TNetHTTPClient

ile verileri çekmeyi düşünmek isteyebilirsiniz. 

Örnek :
uses System.Net.HttpClientComponent, System.Net.HttpClient;

function MakeRequest(aUrl: string): string;
var
  LClient   : System.Net.HttpClientComponent.TNetHTTPClient;
  LResponse : System.Net.HttpClient.IHTTPResponse;
begin
  LClient := TNetHTTPClient.Create(nil);
  try
    LClient.UserAgent  := 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/107.0.0.0 Safari/537.36';
    LClient.Accept     := 'text/html';
    LResponse := LClient.Get(aUrl);
    // 404 not forund
    // 200 OK
    case LResponse.StatusCode of
    200: // success
      Result := LResponse.ContentAsString;
    404: // not found
      Result := '[ERROR] Page not found...';
    else
      Result := '[ERROR]' + sLineBreak + LResponse.ContentAsString;
    end;
  finally
    FreeAndNil(LClient);
  end;
end;

Kullanımı :
procedure TForm1.Button1Click(Sender: TObject);
var
  LContent : string;
begin
  LContent := MakeRequest('https://www.google.com.tr');
  // ...

end;



Teşşekkür ederim

@mrmarman @vedat35
Cevapla


Konu ile Alakalı Benzer Konular
Konular Yazar Yorumlar Okunma Son Yorum
  CSV'ye veri aktarma Altıner 5 375 28-03-2024, Saat: 11:49
Son Yorum: Mr.X
  Web ipnut alanına veri girme Altıner 4 431 12-03-2024, Saat: 21:26
Son Yorum: Altıner
  Android Fmx uzak veri tabanından veri çekmek erkutolga 12 1.760 22-11-2023, Saat: 10:27
Son Yorum: Mesut
  Android WiFi network ismini alma 41linea41 4 605 02-10-2023, Saat: 11:57
Son Yorum: 41linea41
  Mobil App. ile MQTT brokera bağlanma ve Veri çekme yemre 3 917 27-04-2023, Saat: 13:56
Son Yorum: yemre



Konuyu Okuyanlar: 1 Ziyaretçi