KotaTakip - (OpenSource/Açık Kaynaklı) TurkSat Kablo Internet Hizmeti alanlar için

Paket programlarınızın tanıtımını bu forumda yapabilirsiniz. Bu foruma soru sormayın!
Cevapla
Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4740
Kayıt: 09 Ara 2003 08:13
Konum: İstanbul
İletişim:

KotaTakip - (OpenSource/Açık Kaynaklı) TurkSat Kablo Internet Hizmeti alanlar için

Mesaj gönderen mrmarman »

Resim

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. :D
- Görseli geliştirilebilir, motor hazır dileyen dilediği şekilde yapılandırabilir şekilde fonksiyonlara böldüm. :idea:

- 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. :idea:
- 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 );
şeklinde verebilirsiniz. :idea:
- 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.
Edit : Kod güncellendi.
En son mrmarman tarafından 22 Eki 2015 07:00 tarihinde düzenlendi, toplamda 2 kere düzenlendi.
Resim
Resim ....Resim
nguzeller
Üye
Mesajlar: 109
Kayıt: 19 Oca 2004 03:29

Re: KotaTakip - (OpenSource/Açık Kaynaklı) TurkSat Kablo Internet Hizmeti alanlar için

Mesaj gönderen nguzeller »

öncelikle bu paylaşım için teşekker ediyorum. delphi 10 ile yapayım edim resimdeki çizile yerlerde hatalar çıktı fazla araştırmadım sorunu aynı sorunu yaşayabilir diye resimi burada paylaşacam

Resim
Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4740
Kayıt: 09 Ara 2003 08:13
Konum: İstanbul
İletişim:

Re: KotaTakip - (OpenSource/Açık Kaynaklı) TurkSat Kablo Internet Hizmeti alanlar için

Mesaj gönderen mrmarman »

Merhaba.

Hatalara baktığımda DateUtils 'i unite eklemeyi ihmal ettiğiniz görünüyor.
Size hazır projeyi paketleyip bu mesaj ekinde veriyorum. İnceleyebilirsiniz.

Login bilgilerini kendinizinki ile değiştirin.
Göreceğiniz üzere hata kontrolü koymadım onu da dilerseniz basitçe ekleyebilirsiniz. :idea:

EDIT: Kod eklemeleri yapıldı.
Dosya ekleri
KabloNet_Kota_XE10.rar
KabloNET Kota Kaynak Kodları içeren proje paketidir.
(85.58 KiB) 200 kere indirildi
En son mrmarman tarafından 13 Eyl 2015 09:23 tarihinde düzenlendi, toplamda 2 kere düzenlendi.
Resim
Resim ....Resim
nguzeller
Üye
Mesajlar: 109
Kayıt: 19 Oca 2004 03:29

Re: KotaTakip - (OpenSource/Açık Kaynaklı) TurkSat Kablo Internet Hizmeti alanlar için

Mesaj gönderen nguzeller »

teşekkur ediyorum elinize sağlık güzel bir program olmuş
Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4740
Kayıt: 09 Ara 2003 08:13
Konum: İstanbul
İletişim:

Re: KotaTakip - (OpenSource/Açık Kaynaklı) TurkSat Kablo Internet Hizmeti alanlar için

Mesaj gönderen mrmarman »

Gün devrettiğinde Chart içeriğinin güncellenmesi gerekiyordu ihmal etmişim. Geçen akşam kontrol ederken farkettim.

İlk mesajdaki kodu da değiştirdim aşağıdaki eklemeleri görebilirsiniz.

Eklenen kısım
(1) Bir Global Variable ile sistem tarihi tutulur,
(2) Timer ile bakılırken sistem tarihindeki gün ile system saat tarihindeki gün farklı olduğunda yeniden chart ayarlanır.
(3) Chart ayarlama kısmına eklenen eski serileri FREE etmeyi unutmuyoruz...

Kod: Tümünü seç

procedure ChartHazirla( Chart:TChart );
...
...
begin
  While Chart.SeriesCount > 0
    do Chart.Series[Chart.SeriesCount-1].Free; // Önce var olanı (sondan başa) siliyoruz...

Kod: Tümünü seç

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;

Kod: Tümünü seç

procedure TForm1.Timer1Timer(Sender: TObject);
...
...
    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;
Resim
Resim ....Resim
nguzeller
Üye
Mesajlar: 109
Kayıt: 19 Oca 2004 03:29

Re: KotaTakip - (OpenSource/Açık Kaynaklı) TurkSat Kablo Internet Hizmeti alanlar için

Mesaj gönderen nguzeller »

güncelleme için teşekkür ediyorum yazılım içinde
Cevapla