Hiç api kullanmadan (Çünkü safya üyeliksiz girişe açık ve veriler açıkta duruyor) resimde koyduğum alandaki veriyi çekemez miyiz (Delphi 7 kullanıyorum)?
Ben bunu php ile kolayca yapıyordum. Delphi ile bir edit içerisinde gösteremez miyim?
Adres: "https://www.binance.com/tr/markets" Mesela resimdeki gibi XRP nin "div.css-1ad2brd" alanındaki "0.00084913" değerini edit içerisinde görmek istiyorum.
Merhaba.
Biraz önce diğer forumda gördüm başlığı aynısını burada da paylaşayım. Diğer foruma pek uğramam ama arama sırasında bir şey denk geldi, sizin başlığı görmüştüm..
* Sizin için çözüm üreten kod aşağıdadır.
Bonus olarak daha da gelişkin -bir defada birden fazla değer- sorgulamak isteyebileceğinizi değerlendirdim.
Parametre olarak set halinde dilediğiniz kadar içeriğin high değerini bir defada string olarak döndürecektir.
function GetBinanceHighValue( const xValues: array of string ): string;
const
aUrl = 'https://www.binance.com/tr/trade/BNB_USDT';
var
aClient : TNetHTTPClient;
sJSON, sSearch : String;
aJSONData : TJSONValue;
aJSONValue : TJSONValue;
i : Integer;
begin
Result := '';
aClient := TNetHTTPClient.Create(nil);
try
aClient.UserAgent := 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36'; // 'Dalvik/2.1.0 (Linux; U; Android 8.0.0; SM-N950F Build/R16NW)';
aClient.Accept := 'text/html';
sJSON := aClient.Get( aUrl ).ContentAsString;
// Parse Section
// ------------------------------------------------------------------------ //
sSearch := '<textarea id="__APP_DATA" style="display: none">';
if pos(sSearch, sJSON ) > 0 then
begin
System.Delete(sJSON, 1, Pos(sSearch, sJSON) + Length(sSearch)-1);
sSearch := '"productMap":';
if pos(sSearch, sJSON ) > 0 then begin
System.Delete(sJSON, 1, Pos(sSearch, sJSON) + Length(sSearch)-1);
sJSON := Copy(sJSON, 1, Pos(',"updateTime":', sJSON)-1);
end;
end;
// -------------------------------------------------------------------------- //
// JSON Parse section
// -------------------------------------------------------------------------- //
aJSONData := JSON.TJSONObject.ParseJSONValue( TEncoding.ASCII.GetBytes( Trim(sJSON) ), 0);
try
if aJSONData <> nil then
begin
for i := Low(xValues) to High(xValues) do begin
if aJSONData.FindValue(xValues[i]) <> nil then
begin
aJSONValue := aJSONData.GetValue<TJSONObject>(xValues[i]);
if aJSONValue.FindValue('high') <> nil then
begin
if Result = ''
then Result := xValues[i] + ': ' + ((aJSONValue as TJSONObject).Get('high').JsonValue as TJSONString).Value
else Result := Result + ', ' + xValues[i] + ': ' + ((aJSONValue as TJSONObject).Get('high').JsonValue as TJSONString).Value;
end;
end;
end;
end else begin
sJSON := '';
MessageDlg('Veri ekranına ulaşılamadı....', mtError, [mbOk], 0 );
end;
finally
aJSONData.Free;
end;
finally
FreeAndNil(aClient);
end;
end;
Buradaki konu işinizi görür düşüncesindeyim. O konuda öneri olarak sunulmuş diğer konulara da göz atmak fayda sağlayabilir.
özellikle @SimaWB hocamın konuları sizi nihai sonuca ulaştıracaktır kanaatindeyim.
Şahsi önerim ise ;
php tarafında kolaylıkla yapabiliyorsanız, php ile json çıktısı alıp delphi tarafında json olarak veriyi istediğiniz alana çekebilirsiniz. bu daha pratik bir yol sunacaktır diye düşünüyorum.
Tabiki yukarıdaki durumdan hariç olarak php kodunun sürekli çalışmasına ve uzaktan erişilmesine olanak sağlanması elbette bir dezavantaj
(05-06-2020, Saat: 13:01)mrmarman Adlı Kullanıcıdan Alıntı: Merhaba.
Biraz önce diğer forumda gördüm başlığı aynısını burada da paylaşayım. Diğer foruma pek uğramam ama arama sırasında bir şey denk geldi, sizin başlığı görmüştüm..
* Sizin için çözüm üreten kod aşağıdadır.
Bonus olarak daha da gelişkin -bir defada birden fazla değer- sorgulamak isteyebileceğinizi değerlendirdim.
Parametre olarak set halinde dilediğiniz kadar içeriğin high değerini bir defada string olarak döndürecektir.
function GetBinanceHighValue( const xValues: array of string ): string;
const
aUrl = 'https://www.binance.com/tr/trade/BNB_USDT';
var
aClient : TNetHTTPClient;
sJSON, sSearch : String;
aJSONData : TJSONValue;
aJSONValue : TJSONValue;
i : Integer;
begin
Result := '';
aClient := TNetHTTPClient.Create(nil);
try
aClient.UserAgent := 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36'; // 'Dalvik/2.1.0 (Linux; U; Android 8.0.0; SM-N950F Build/R16NW)';
aClient.Accept := 'text/html';
sJSON := aClient.Get( aUrl ).ContentAsString;
// Parse Section
// ------------------------------------------------------------------------ //
sSearch := '<textarea id="__APP_DATA" style="display: none">';
if pos(sSearch, sJSON ) > 0 then
begin
System.Delete(sJSON, 1, Pos(sSearch, sJSON) + Length(sSearch)-1);
sSearch := '"productMap":';
if pos(sSearch, sJSON ) > 0 then begin
System.Delete(sJSON, 1, Pos(sSearch, sJSON) + Length(sSearch)-1);
sJSON := Copy(sJSON, 1, Pos(',"updateTime":', sJSON)-1);
end;
end;
// -------------------------------------------------------------------------- //
// JSON Parse section
// -------------------------------------------------------------------------- //
aJSONData := JSON.TJSONObject.ParseJSONValue( TEncoding.ASCII.GetBytes( Trim(sJSON) ), 0);
try
if aJSONData <> nil then
begin
for i := Low(xValues) to High(xValues) do begin
if aJSONData.FindValue(xValues[i]) <> nil then
begin
aJSONValue := aJSONData.GetValue<TJSONObject>(xValues[i]);
if aJSONValue.FindValue('high') <> nil then
begin
if Result = ''
then Result := xValues[i] + ': ' + ((aJSONValue as TJSONObject).Get('high').JsonValue as TJSONString).Value
else Result := Result + ', ' + xValues[i] + ': ' + ((aJSONValue as TJSONObject).Get('high').JsonValue as TJSONString).Value;
end;
end;
end;
end else begin
sJSON := '';
MessageDlg('Veri ekranına ulaşılamadı....', mtError, [mbOk], 0 );
end;
finally
aJSONData.Free;
end;
finally
FreeAndNil(aClient);
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
var
Sonuclar : String;
begin
Sonuclar := GetBinanceHighValue( [ 'ETHUSDT', 'BNBUSDT' ] );
Showmessage( Sonuclar );
end;
Hocam çok teşekkür ederim fakat benim sormak istediğim farklı bir konu idi. Yani bu kodlarla evet veriyi çekebiliyoruz fakat benim istediğim resmini koyduğum sayfadaki verileri çekebilmek. Bir nevi parse tarzı... mrmarman
(05-06-2020, Saat: 13:05)Mr.Developer Adlı Kullanıcıdan Alıntı: Merhabalar,
Buradaki konu işinizi görür düşüncesindeyim. O konuda öneri olarak sunulmuş diğer konulara da göz atmak fayda sağlayabilir.
özellikle @SimaWB hocamın konuları sizi nihai sonuca ulaştıracaktır kanaatindeyim.
Şahsi önerim ise ;
php tarafında kolaylıkla yapabiliyorsanız, php ile json çıktısı alıp delphi tarafında json olarak veriyi istediğiniz alana çekebilirsiniz. bu daha pratik bir yol sunacaktır diye düşünüyorum.
Tabiki yukarıdaki durumdan hariç olarak php kodunun sürekli çalışmasına ve uzaktan erişilmesine olanak sağlanması elbette bir dezavantaj
Cevabınız için teşekkürler. Bu konuyu önce de gördüm ve biraz incelemiştim. Aslında mantık olarak yapmak istediğime benziyor fakat bu şekilde işlem yapamadım.Nasıl yapacağımı da bilemiyorum bir sürü test yaptım sonuca ulaşamadım...Sadece istediğim;Edit1.text alanına resmini koyduğum sayfadaki XRP nin son fiyatını alabilmek.. Diğer arkadaşın verdiği kodla da oluyor fakat benim istediğim sadece sayfadaki o an var olan veriyi çekmek...Umarım anlatabildim...
İlgili sayfaya neden ısrar ettiğinizi anlamakta güçlük çekiyorum.
Size verdiğimiz cevap ile nokta tespiti ilgili veriyi parse ederek döndürüyor. Tek ve aynı veri geliyor...
PHP ile explode ederken de aynı şekilde parse ediyorsunuz buradan içeriği alarak da aynısı yapıyoruz. Amaç veri almak ise bu imkanı size sağladık, umarım istediğiniz sonuca kavuşursunuz.
(05-06-2020, Saat: 13:01)mrmarman Adlı Kullanıcıdan Alıntı: Merhaba.
Biraz önce diğer forumda gördüm başlığı aynısını burada da paylaşayım. Diğer foruma pek uğramam ama arama sırasında bir şey denk geldi, sizin başlığı görmüştüm..
* Sizin için çözüm üreten kod aşağıdadır.
Bonus olarak daha da gelişkin -bir defada birden fazla değer- sorgulamak isteyebileceğinizi değerlendirdim.
Parametre olarak set halinde dilediğiniz kadar içeriğin high değerini bir defada string olarak döndürecektir.
function GetBinanceHighValue( const xValues: array of string ): string;
const
aUrl = 'https://www.binance.com/tr/trade/BNB_USDT';
var
aClient : TNetHTTPClient;
sJSON, sSearch : String;
aJSONData : TJSONValue;
aJSONValue : TJSONValue;
i : Integer;
begin
Result := '';
aClient := TNetHTTPClient.Create(nil);
try
aClient.UserAgent := 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36'; // 'Dalvik/2.1.0 (Linux; U; Android 8.0.0; SM-N950F Build/R16NW)';
aClient.Accept := 'text/html';
sJSON := aClient.Get( aUrl ).ContentAsString;
// Parse Section
// ------------------------------------------------------------------------ //
sSearch := '<textarea id="__APP_DATA" style="display: none">';
if pos(sSearch, sJSON ) > 0 then
begin
System.Delete(sJSON, 1, Pos(sSearch, sJSON) + Length(sSearch)-1);
sSearch := '"productMap":';
if pos(sSearch, sJSON ) > 0 then begin
System.Delete(sJSON, 1, Pos(sSearch, sJSON) + Length(sSearch)-1);
sJSON := Copy(sJSON, 1, Pos(',"updateTime":', sJSON)-1);
end;
end;
// -------------------------------------------------------------------------- //
// JSON Parse section
// -------------------------------------------------------------------------- //
aJSONData := JSON.TJSONObject.ParseJSONValue( TEncoding.ASCII.GetBytes( Trim(sJSON) ), 0);
try
if aJSONData <> nil then
begin
for i := Low(xValues) to High(xValues) do begin
if aJSONData.FindValue(xValues[i]) <> nil then
begin
aJSONValue := aJSONData.GetValue<TJSONObject>(xValues[i]);
if aJSONValue.FindValue('high') <> nil then
begin
if Result = ''
then Result := xValues[i] + ': ' + ((aJSONValue as TJSONObject).Get('high').JsonValue as TJSONString).Value
else Result := Result + ', ' + xValues[i] + ': ' + ((aJSONValue as TJSONObject).Get('high').JsonValue as TJSONString).Value;
end;
end;
end;
end else begin
sJSON := '';
MessageDlg('Veri ekranına ulaşılamadı....', mtError, [mbOk], 0 );
end;
finally
aJSONData.Free;
end;
finally
FreeAndNil(aClient);
end;
end;
(05-06-2020, Saat: 13:01)mrmarman Adlı Kullanıcıdan Alıntı: Merhaba.
Biraz önce diğer forumda gördüm başlığı aynısını burada da paylaşayım. Diğer foruma pek uğramam ama arama sırasında bir şey denk geldi, sizin başlığı görmüştüm..
* Sizin için çözüm üreten kod aşağıdadır.
Bonus olarak daha da gelişkin -bir defada birden fazla değer- sorgulamak isteyebileceğinizi değerlendirdim.
Parametre olarak set halinde dilediğiniz kadar içeriğin high değerini bir defada string olarak döndürecektir.
function GetBinanceHighValue( const xValues: array of string ): string;
const
aUrl = 'https://www.binance.com/tr/trade/BNB_USDT';
var
aClient : TNetHTTPClient;
sJSON, sSearch : String;
aJSONData : TJSONValue;
aJSONValue : TJSONValue;
i : Integer;
begin
Result := '';
aClient := TNetHTTPClient.Create(nil);
try
aClient.UserAgent := 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36'; // 'Dalvik/2.1.0 (Linux; U; Android 8.0.0; SM-N950F Build/R16NW)';
aClient.Accept := 'text/html';
sJSON := aClient.Get( aUrl ).ContentAsString;
// Parse Section
// ------------------------------------------------------------------------ //
sSearch := '<textarea id="__APP_DATA" style="display: none">';
if pos(sSearch, sJSON ) > 0 then
begin
System.Delete(sJSON, 1, Pos(sSearch, sJSON) + Length(sSearch)-1);
sSearch := '"productMap":';
if pos(sSearch, sJSON ) > 0 then begin
System.Delete(sJSON, 1, Pos(sSearch, sJSON) + Length(sSearch)-1);
sJSON := Copy(sJSON, 1, Pos(',"updateTime":', sJSON)-1);
end;
end;
// -------------------------------------------------------------------------- //
// JSON Parse section
// -------------------------------------------------------------------------- //
aJSONData := JSON.TJSONObject.ParseJSONValue( TEncoding.ASCII.GetBytes( Trim(sJSON) ), 0);
try
if aJSONData <> nil then
begin
for i := Low(xValues) to High(xValues) do begin
if aJSONData.FindValue(xValues[i]) <> nil then
begin
aJSONValue := aJSONData.GetValue<TJSONObject>(xValues[i]);
if aJSONValue.FindValue('high') <> nil then
begin
if Result = ''
then Result := xValues[i] + ': ' + ((aJSONValue as TJSONObject).Get('high').JsonValue as TJSONString).Value
else Result := Result + ', ' + xValues[i] + ': ' + ((aJSONValue as TJSONObject).Get('high').JsonValue as TJSONString).Value;
end;
end;
end;
end else begin
sJSON := '';
MessageDlg('Veri ekranına ulaşılamadı....', mtError, [mbOk], 0 );
end;
finally
aJSONData.Free;
end;
finally
FreeAndNil(aClient);
end;
end;
Kullanımı :
procedure TForm1.Button1Click(Sender: TObject);
var
Sonuclar : String;
begin
Sonuclar := GetBinanceHighValue( [ 'ETHUSDT', 'BNBUSDT' ] );
Showmessage( Sonuclar );
end;
@mrmarman hocam,
yazdığınız örneği hemen denedim. Ancak bende
if aJSONValue.FindValue('high') <> nil then
satırındaki findvalue işlemini kabul etmedi. 10.2 den mi kaynaklanıyor bilemedim.
@akissoftware
Konu ve yorumlarınızda Forum Kurallarına riayet etmediğinizi görüyoruz.
Bu konu başlığında yaptığınız tüm alıntı ve kod biçimlendirmeler düzeltilmiştir.
Bir sonraki konu veya yorumlarınızda bu uyarıları dikkate almadığınızda forum kurallarında belirtilen yaptırımlar uygulanacaktır!