
Herkese merhaba.
- Bir çalışma yapmıştım. Onu paylaşayım istedim.
- Geçtiğimiz ay TTNet ADSL'den çıktım TurkSat Kablo TV ve UyduNET internet hizmetine geçiş yaptım.
- Off topic: Hem 25 Mbit/50 GB Adil Kullanım Kotası ile aldım çok da hesaplı oldu.

- Görseli geliştirilebilir, motor hazır dileyen dilediği şekilde yapılandırabilir şekilde fonksiyonlara böldüm.

- Aynı şekilde TurkSat Kablo üzerinden Internet Hizmeti alanlar için paylaşıyorum.
- Açık kaynak dağıtıyorum, içinde kendi login ve parola bilgileriniz olacağından kendiniz derleyip kullanın. Güven ilişkisini kırmak istemem.

- Bu çalışmada merak edenler için Web üzerinden LOGIN olmak, gelen HTML içeriği PARSE işlemi ve TChart kullanımına ilişkin örnek teşkil edecektir.
- Login bilgilerinizi kod içerisindeki BitBtn1 clik eyleminde,
Kod: Tümünü seç
KabloTVLogin( '1234567', 'ab.1234567', WebBrowser1 );

- Tema XE8 içindeki proje özelliklerindeki hazır temalardan.
- NOT:
(1) Timer Interval 500 olarak ayarlı. Geri sayım için 1/2 saniye derecesinde hassasiyet iş görüyor.
(2) ekleyeceğiniz üstteki TChart'lar olan Chart1 ve alttaki Chart2 için ayarlama kod içerisinden yapılıyor. Sadece forma iki tane bırakmanız yeterli.
(3) gelen değerler GB ise değerlerini 1024 ile çarpıp MB cinsine dönüştürüyoruz. Orada görünen değerler böyle daha okunur oluyor. Çünkü (5) dakikada bir yeniden otomatik sorgulanıyor. Netten film seyrederken falan değişikliği görebilirsiniz.
(4) Bir kere login oluyor, login timeout olmadan (kaç dakika bilmiyorum ama 5 dakikada bir sorgulamak yeterli aralığı veriyor) sadece kota bilgilerini yenileyerek değerleri ve dolayısıyla grafiği tazeliyor.
(5) Aklıma gelenlerden fazlalık olarak xstrGunlukURL global değişkeni kaldı, onu daha sonra kullanmak için yedeklemiştim onu kaldırabilirsiniz.
Kod: Tümünü seç
{$R *.dfm}
Uses DateUtils;
Const
strTurkSatKablo = 'https://online.turksatkablo.com.tr/';
strKota = 'https://online.turksatkablo.com.tr/MusteriKotaDonem.aspx#Hizmet-Islemleri';
Type
tBilgi = Record
HizmetID
,Donem
,Download
,Upload
,GunlukKullanim : String;
end;
Var
xTamam : Boolean = False;
xboolIslemYapiliyor : Boolean = False;
xstrGunlukURL : String = '';
xSystemTarih : TDateTime = 0;
Procedure GunlukDetay( strUrl : String; WebBrowser:TWebBrowser;ListView:TListView );
Var
strGelen, strBlok, strAra : String;
icerik : tBilgi;
begin
WebBrowser.Navigate( strURL );
while WebBrowser.ReadyState <> READYSTATE_COMPLETE do begin
Sleep(1);
Application.ProcessMessages;
end;
// <THEAD>
strGelen := WebBrowser.OleObject.Document.Body.OuterHTML;
strAra := '<THEAD>';
strBlok := strGelen;
System.Delete(strBlok, 1, Pos(strAra, strBlok)+ Length(strAra)-1);
strBlok := Copy( strBlok, 1, Pos('</TBODY>', strBlok)-1 );
ListView.Items.Clear;
while Pos('<TR>', strBlok) > 0 do
begin
FillChar( icerik, sizeOf(icerik), 0 );
strAra := '<TR>';
System.Delete(strBlok, 1, Pos(strAra, strBlok)+ Length(strAra)-1);
strAra := '<TD';
System.Delete(strBlok, 1, Pos(strAra, strBlok)+ Length(strAra)-1);
strAra := '>';
System.Delete(strBlok, 1, Pos(strAra, strBlok)+ Length(strAra)-1);
icerik.Donem := Copy(strBlok, 1, Pos('<', strBlok)-1);
strAra := '<TD>';
System.Delete(strBlok, 1, Pos(strAra, strBlok)+ Length(strAra)-1);
icerik.Download := Copy(strBlok, 1, Pos('<', strBlok)-1);
System.Delete(strBlok, 1, Pos(strAra, strBlok)+ Length(strAra)-1);
icerik.Upload := Copy(strBlok, 1, Pos('<', strBlok)-1);
With ListView.Items.Add do begin
Caption := '';
SubItems.Add( icerik.HizmetID );
SubItems.Add( icerik.Donem );
SubItems.Add( icerik.Download );
SubItems.Add( icerik.Upload );
SubItems.Add( icerik.GunlukKullanim );
end;
end;
end;
Procedure KabloTVLogin( strLogin, strPass: String; WebBrowser:TWebBrowser );
begin
WebBrowser.Navigate( strTurkSatKablo );
while WebBrowser.ReadyState <> READYSTATE_COMPLETE do begin
Sleep(1);
Application.ProcessMessages;
end;
WebBrowser.OleObject.Document.GetElementByID('KullaniciID').Value := strLogin;
WebBrowser.OleObject.Document.GetElementByID('KullaniciSifre').Value := strPass;
WebBrowser.OleObject.Document.GetElementByID('Button1').Click;
xTamam := False;
while NOT xTamam do begin
Sleep(1);
Application.ProcessMessages;
end;
end;
Procedure KotaDetay( WebBrowser:TWebBrowser; ListView:TListView );
Var
strGelen, strBlok, strAra : String;
icerik : tBilgi;
begin
WebBrowser.Navigate( strKota );
while WebBrowser.ReadyState <> READYSTATE_COMPLETE do begin
Sleep(1);
Application.ProcessMessages;
end;
strGelen := WebBrowser.OleObject.Document.Body.OuterHTML;
strAra := '<THEAD>';
strBlok := strGelen;
System.Delete(strBlok, 1, Pos(strAra, strBlok)+ Length(strAra)-1);
strBlok := Copy( strBlok, 1, Pos('</TBODY>', strBlok)-1 );
ListView.Items.Clear;
while Pos('<TR sizcache="0"', strBlok) > 0 do
begin
FillChar( icerik, sizeOf(icerik), 0 );
strAra := '<TR sizcache="0"';
System.Delete(strBlok, 1, Pos(strAra, strBlok)+ Length(strAra)-1);
strAra := '<TD>';
System.Delete(strBlok, 1, Pos(strAra, strBlok)+ Length(strAra)-1);
icerik.HizmetID := Copy(strBlok, 1, Pos('<', strBlok)-1);
System.Delete(strBlok, 1, Pos(strAra, strBlok)+ Length(strAra)-1);
icerik.Donem := Copy(strBlok, 1, Pos('<', strBlok)-1);
System.Delete(strBlok, 1, Pos(strAra, strBlok)+ Length(strAra)-1);
icerik.Download := Copy(strBlok, 1, Pos('<', strBlok)-1);
System.Delete(strBlok, 1, Pos(strAra, strBlok)+ Length(strAra)-1);
icerik.Upload := Copy(strBlok, 1, Pos('<', strBlok)-1);
strAra := '<TD';
System.Delete(strBlok, 1, Pos(strAra, strBlok)+ Length(strAra)-1);
strAra := '<A href="';
System.Delete(strBlok, 1, Pos(strAra, strBlok)+ Length(strAra)-1);
icerik.GunlukKullanim := Copy(strBlok, 1, Pos('">', strBlok)-1);
icerik.GunlukKullanim := StringReplace( icerik.GunlukKullanim, '&', '&', [rfReplaceAll] );
With ListView.Items.Add do begin
Caption := '';
SubItems.Add( icerik.HizmetID );
SubItems.Add( icerik.Donem );
SubItems.Add( icerik.Download );
SubItems.Add( icerik.Upload );
SubItems.Add( icerik.GunlukKullanim );
end;
end;
end;
procedure ChartHazirla( Chart:TChart );
Const
Aylar : Array[1..12] of String = ( 'Ock', 'Şub', 'Mrt',
'Nis', 'May', 'Haz',
'Tem', 'Ağu', 'Eyl',
'Ekm', 'Kas', 'Ara' );
Renkler : Array[1..12] of Integer = ( clRed, clYellow, clBlue,
clAqua, clPurple, clTeal,
clBlack, clRed, clYellow,
clBlue, clAqua, clPurple );
Var
i : Word;
begin
While Chart.SeriesCount > 0
do Chart.Series[Chart.SeriesCount-1].Free; // Önce var olanı (sondan başa) siliyoruz...
case Chart.Tag of
1: begin
Chart.Title.Caption := 'KabloNet Aylık Kullanım Tablosu';
Chart.AddSeries( TBarSeries.Create(nil) );
Chart.Legend.TextStyle := ltsRightValue;
Chart.Legend.FirstValue := 0;
if MonthOf(Now) > 5 then
Chart.Legend.FirstValue := MonthOf(Now) - 5; // Bulunduğumuz ay odaklı..
with Chart.Series[0] as TBarSeries do
begin
BarWidthPercent := 50;
ParentChart.View3D := False;
end;
for i := 1 to 12 do
Chart.Series[0].AddXY( i, 0, Aylar[i], Renkler[i] );
end;
2: begin
Chart.Title.Caption := 'Güncel (Günlük) Kullanım Tablosu';
Chart.AddSeries( TLineSeries.Create(nil) );
Chart.Legend.TextStyle := ltsRightValue;
Chart.Legend.FirstValue := 0;
if DayOf(Now) > 7 then
Chart.Legend.FirstValue := DayOf(Now) - 7; // Bulunduğumuz gün odaklı..
with Chart.Series[0] as TLineSeries do
begin
ParentChart.View3D := False;
end;
for i := 1 to DateUtils.DaysInMonth( Now ) do
Chart.Series[0].AddXY( i, 0, Format('%.2d', [i]), clRed );
end;
end;
end;
procedure ChartDegerlendir( Chart:TChart; iAy: Integer; iDeger :Double );
begin
Chart.Series[0].YValue[iAy-1] := iDeger;
end;
procedure KotaBilgileri( WebBrowser:TWebBrowser; ListView:TListView; Chart1, Chart2 : TChart);
Var
i : Integer;
iGun, iAy : Integer;
dDeger : Double;
strBirim : String;
begin
KotaDetay( WebBrowser, ListView );
xstrGunlukURL := strTurkSatKablo + ListView.Items[0].SubItems[4];
for i := 0 to ListView.Items.Count - 1 do
begin
iAy := StrToInt ( Copy( ListView.Items[i].SubItems[1], 1, 2 ) );
dDeger := StrToFloat( Copy( ListView.Items[i].SubItems[2], 1, Pos(' ', ListView.Items[i].SubItems[2] )-1) );
strBirim := ListView.Items[i].SubItems[2];
system.Delete( strBirim, 1, Pos(' ', ListView.Items[i].SubItems[2] ));
strBirim := Trim( strBirim );
if UpperCase( strBirim ) = 'GB' then dDeger := dDeger * 1024;
ChartDegerlendir( Chart1, iAy, dDeger );
end;
GunlukDetay( xstrGunlukURL, WebBrowser, ListView );
for i := 0 to ListView.Items.Count - 1 do
begin
iGun := StrToInt ( Copy( ListView.Items[i].SubItems[1], 1, 2 ) );
dDeger := StrToFloat( Copy( ListView.Items[i].SubItems[2], 1, Pos(' ', ListView.Items[i].SubItems[2] )-1) );
strBirim := ListView.Items[i].SubItems[2];
system.Delete( strBirim, 1, Pos(' ', ListView.Items[i].SubItems[2] ));
strBirim := Trim( strBirim );
if UpperCase( strBirim ) = 'GB' then dDeger := dDeger * 1024;
ChartDegerlendir( Chart2, iGun, dDeger );
end;
end;
procedure TForm1.BitBtn1Click(Sender: TObject);
begin
TBitBtn(Sender).Enabled := False;
KabloTVLogin( '1234567', 'ab.1234567', WebBrowser1 );
KotaBilgileri( WebBrowser1, ListView1, Chart1, Chart2 );
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
Chart1.Tag := 1;
Chart2.Tag := 2;
// aşağıdaki hazırlık artık TimerOnTimer ile yapılacak
//ChartHazirla( Chart1 );
//ChartHazirla( Chart2 );
end;
procedure TForm1.Timer1Timer(Sender: TObject);
Function mSnToSaat( MiliSaniye : LongInt ): TTime;
Var
Sa, Dk, Sn, mSn : LongInt;
Begin
mSn := MiliSaniye Mod 1000;
Sn := MiliSaniye Div 1000;
Dk := Sn Div 60;
Sa := Dk Div 60;
Sn := Sn - ( Dk * 60 );
Dk := Dk - ( Sa * 60 );
Result := EncodeTime(Sa, Dk, Sn, msn);
end;
{$j+}
Const
iGeriSaySn : Integer = 1;
{$j-}
begin
if xboolIslemYapiliyor then exit;
dec(iGeriSaySn);
StatusBar1.Panels[0].Text := Format('%s', [ TimeToStr( mSnToSaat( iGeriSaySn*1000 div 2) ) ]);
if iGeriSaySn = 0 then
begin
xboolIslemYapiliyor := True;
iGeriSaySn := 60*5*2;
if DateUtils.DayOf( xSystemTarih ) <> DateUtils.DayOf(now) then
begin // gün devir olmuş, chart üzerindeki gün ve ay bilgileri bir sıra yukarı kaysın
xSystemTarih := Now;
ChartHazirla( Chart1 );
ChartHazirla( Chart2 );
end;
if BitBtn1.Enabled
then BitBtn1Click(BitBtn1)
else KotaBilgileri( WebBrowser1, ListView1, Chart1, Chart2 );
xboolIslemYapiliyor := False;
end;
end;
procedure TForm1.WebBrowser1DocumentComplete(ASender: TObject;
const pDisp: IDispatch; const URL: OleVariant);
Const
strLoginOk = 'https://online.turksatkablo.com.tr/Faturalar.aspx#Fatura-Islemleri';
strKotaOk = 'https://online.turksatkablo.com.tr/MusteriKotaDonem.aspx#Hizmet-Islemleri';
begin
if URL = strLoginOk then xTamam := True;
end;
end.