Laden...

ipcounter.de "api" klasse(n)

Erstellt von blutiger_anfänger vor 15 Jahren Letzter Beitrag vor 15 Jahren 4.356 Views
B
blutiger_anfänger Themenstarter:in
293 Beiträge seit 2008
vor 15 Jahren
ipcounter.de "api" klasse(n)

Beschreibung:

Der ein oder andere von euch kennt vielleicht den Counterservice www.ipcounter.de
Da ich auf 2-3 Homepages diesen Service in Anspruch nehme und keine Lust habe immer alle Statistikseiten einzeln aufzurufen habe ich 2 Klassen gebastelt, mit denen es möglich ist diverse Infos auszulesen.

Verwendung:

  1. Klasse aufrufen und Anzahl der Versuche übergeben (Manchmal gibt es MySQL Errors auf ipcounter.de, dann klappt das auslesen natürlich nicht. Dafür kann man angeben, wie oft bei einem Fehler versucht werden soll die Statistikdaten erneut aufzurufen... )

IpCounter ipc = new IpCounter(3);

  1. Daten auslesen (Beim aufruf immer die ID des gewünschten Counters mitgeben!):

ipc.Last30DaysGridView(dataGridView1, IPcounter_ID);
// Befüllt & konfiguriert das übergebene dataGridView mit den Statistikdaten der letzten 30 Tage

//Alternativ kann das ganze nun auch als DataTable zurückgegeben werden.
dataGridView1.DataSource = ipc.Last30DaysDataTable(IPcounter_ID);


string[] LastDays = ipc.Last30Days(IPcounter_ID);
//Gibt die Statistikdaten der letzten Tage, als StringArray zurück


string OnlineUsers = ipc.OnlineUsers(IPcounter_ID);
//Gibt die Anzahl der Online User als string zurück

string HitsGesamt = ipc.AllHits(IPcounter_ID);
// Gibt die Anzahl aller Seitenaufrufe als String zurück

string UniqueVisits = ipc.AllUniqueVisitors(IPcounter_ID);
// Gibt die Anzahl aller eindeutigen Besucher als string zurück

IPcounter.cs


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;
using System.IO;
using System.Net;
using System.Windows.Forms;
using System.Data;



namespace MyStats
{
    class IpCounter
    {
        
        string html = string.Empty;
        int ErrorTry;
        int Trys = 0;

        public IpCounter(int AnzahlVersuche)
        {
            this.ErrorTry = AnzahlVersuche;
        }


        public string OnlineUsers(int id)
        {
            try
            {
                HttpWebRequest req = (HttpWebRequest)HttpWebRequest.Create("http://www.ipcounter.de/stats.php?u=" + id.ToString());
                HttpWebResponse res = (HttpWebResponse)req.GetResponse();

                StreamReader sr = new StreamReader(res.GetResponseStream());
                html = sr.ReadToEnd();
                sr.Close();
                sr.Dispose();
                res.Close();

                RegExSolve Solver = new RegExSolve(html);

                string[] ActualItems = Solver.StatsOnline();




                return ActualItems[0].Remove(0, 102);
            }
            catch
            {
                Trys++;

                if (Trys < ErrorTry)
                {
                    OnlineUsers(id);

                    return "error";
                }
                else
                {
                    Trys = 0;

                    return "error";
                }
            }

        }

        public string AllHits(int id)
        {
            try
            {
                HttpWebRequest req = (HttpWebRequest)HttpWebRequest.Create("http://www.ipcounter.de/stats.php?u=" + id.ToString());
                HttpWebResponse res = (HttpWebResponse)req.GetResponse();

                StreamReader sr = new StreamReader(res.GetResponseStream());
                html = sr.ReadToEnd();
                sr.Close();
                sr.Dispose();
                res.Close();

                RegExSolve Solver = new RegExSolve(html);


                string[] SeitenAufrufe = Solver.StatsAll();
                SeitenAufrufe[0] = SeitenAufrufe[0].Remove(0, 89);
                if (SeitenAufrufe[0].Contains("</strong></span></td>") == true)
                {
                    SeitenAufrufe[0] = SeitenAufrufe[0].Replace("</strong></span></td>", "");
                }

                return SeitenAufrufe[0];
            }
            catch
            {
                Trys++;

                if (Trys < ErrorTry)
                {
                    AllHits(id);

                    return "error";
                }
                else
                {
                    Trys = 0;

                    return "error";
                }
            }
        }


        public string AllUniqueVisitors(int id)
        {
            try
            {
                HttpWebRequest req = (HttpWebRequest)HttpWebRequest.Create("http://www.ipcounter.de/stats.php?u=" + id.ToString());
                HttpWebResponse res = (HttpWebResponse)req.GetResponse();

                StreamReader sr = new StreamReader(res.GetResponseStream());
                html = sr.ReadToEnd();
                sr.Close();
                sr.Dispose();
                res.Close();

                RegExSolve Solver = new RegExSolve(html);


                string[] SeitenAufrufe = Solver.StatsUniqueAll();
                SeitenAufrufe[0] = SeitenAufrufe[0].Remove(0, 106);
                if (SeitenAufrufe[0].Contains("</strong></span></td>") == true)
                {
                    SeitenAufrufe[0] = SeitenAufrufe[0].Replace("</strong></span></td>", "");
                }
                return SeitenAufrufe[0];
            }
            catch
            {
                Trys++;

                if (Trys < ErrorTry)
                {
                    AllUniqueVisitors(id);

                    return "error";
                }
                else
                {
                    Trys = 0;

                    return "error";
                }
            }

            
        }



        public string[] Last30Days(long id)
        {
            string[] error = new string[1];
            error[0] = "error";
            try
            {
                HttpWebRequest req = (HttpWebRequest)HttpWebRequest.Create("http://www.ipcounter.de/stats.php?u=" + id.ToString() + "&a=balken");
                HttpWebResponse res = (HttpWebResponse)req.GetResponse();

                StreamReader sr = new StreamReader(res.GetResponseStream());
                html = sr.ReadToEnd();
                sr.Close();
                sr.Dispose();
                res.Close();
            }
            catch
            {
                Trys++;

                if (Trys < ErrorTry)
                {
                    Last30Days(id);
                    
                    return error;
                }
                else
                {
                    Trys = 0;
                    
                    return error;
                }
            }

            RegExSolve Solver = new RegExSolve(html);

            string[] Days = Solver.Stats30Days();
            if (Days.Length != 128)
            {
                Trys++;

                if (Trys < ErrorTry)
                {
                    Last30Days(id);
                    
                    return error;
                }
                else
                {
                    Trys = 0;
                    
                    return error;
                }
            }
            else
            {
                int count = 0;
                foreach (string item in Days)
                {
                    Days[count] = item.Replace("<strong>", "").Replace("</strong>", "").Replace("<td class=\"col1\" style=\"text-align: right;\">", "").Replace("</td>", "").Replace("<td class=\"col0\">", "").Replace("<td class=\"col1\" style=\"text-align: center\">", "").Replace("<td class=\"col0\" style=\"text-align: center\">", ""); ;
                    count++;
                }

                Trys = 0;
                return Days;
            }
        }



        public DataTable Last30DaysDataTable(long id)
        {
            
            DataTable Stats = new DataTable("30TageRueckblick");

            DataColumn[] ipcColumns = new DataColumn[4];
            ipcColumns[0] = new DataColumn("Tag");
            ipcColumns[1] = new DataColumn("Datum");
            ipcColumns[2] = new DataColumn("UniqueVisits");
            ipcColumns[3] = new DataColumn("Hits");

            Stats.Columns.AddRange(ipcColumns);


            try
            {
                HttpWebRequest req = (HttpWebRequest)HttpWebRequest.Create("http://www.ipcounter.de/stats.php?u=" + id.ToString() + "&a=balken");
                HttpWebResponse res = (HttpWebResponse)req.GetResponse();

                StreamReader sr = new StreamReader(res.GetResponseStream());
                html = sr.ReadToEnd();
                sr.Close();
                sr.Dispose();
                res.Close();
            }
            catch
            {
                Trys++;

                if (Trys < ErrorTry)
                {
                    Last30Days(id);

                    Stats.Reset();

                    ipcColumns = new DataColumn[4];
                    ipcColumns[0] = new DataColumn("Wochentag");
                    ipcColumns[1] = new DataColumn("Datum");
                    ipcColumns[2] = new DataColumn("UniqueVisits");
                    ipcColumns[3] = new DataColumn("Hits");

                    Stats.Columns.AddRange(ipcColumns);

                    DataRow dr = Stats.NewRow();
                    dr[0] = "Error";
                    dr[1] = "Error";
                    dr[2] = "Error";
                    dr[3] = "Error";
                    return Stats;
                }
                else
                {
                    Trys = 0;

                    Stats.Reset();

                    ipcColumns = new DataColumn[4];
                    ipcColumns[0] = new DataColumn("Wochentag");
                    ipcColumns[1] = new DataColumn("Datum");
                    ipcColumns[2] = new DataColumn("UniqueVisits");
                    ipcColumns[3] = new DataColumn("Hits");

                    Stats.Columns.AddRange(ipcColumns);

                    DataRow dr = Stats.NewRow();
                    dr[0] = "Error";
                    dr[1] = "Error";
                    dr[2] = "Error";
                    dr[3] = "Error";
                    return Stats;
                }
            }

            RegExSolve Solver = new RegExSolve(html);

            string[] Days = Solver.Stats30Days();
            
            
            

            if (Days.Length != 128)
            {
                Trys++;

                if (Trys < ErrorTry)
                {
                    Last30Days(id);

                    Stats.Reset();

                    ipcColumns = new DataColumn[4];
                    ipcColumns[0] = new DataColumn("Wochentag");
                    ipcColumns[1] = new DataColumn("Datum");
                    ipcColumns[2] = new DataColumn("UniqueVisits");
                    ipcColumns[3] = new DataColumn("Hits");

                    Stats.Columns.AddRange(ipcColumns);

                    DataRow dr = Stats.NewRow();
                    dr[0] = "Error";
                    dr[1] = "Error";
                    dr[2] = "Error";
                    dr[3] = "Error";
                    return Stats;
                }
                else
                {
                    Trys = 0;

                    Stats.Reset();

                    ipcColumns = new DataColumn[4];
                    ipcColumns[0] = new DataColumn("Wochentag");
                    ipcColumns[1] = new DataColumn("Datum");
                    ipcColumns[2] = new DataColumn("UniqueVisits");
                    ipcColumns[3] = new DataColumn("Hits");

                    Stats.Columns.AddRange(ipcColumns);

                    DataRow dr = Stats.NewRow();
                    dr[0] = "Error";
                    dr[1] = "Error";
                    dr[2] = "Error";
                    dr[3] = "Error";
                    return Stats;
                }
            }
            else
            {
                int count = 0;
                
                
                while (count < 128)
                {
                    string item1 = Days[count].Replace("<strong>", "").Replace("</strong>", "").Replace("<td class=\"col1\" style=\"text-align: right;\">", "").Replace("</td>", "").Replace("<td class=\"col0\">", "").Replace("<td class=\"col1\" style=\"text-align: center\">", "").Replace("<td class=\"col0\" style=\"text-align: center\">", ""); ;
                    string item2 = Days[count + 1].Replace("<strong>", "").Replace("</strong>", "").Replace("<td class=\"col1\" style=\"text-align: right;\">", "").Replace("</td>", "").Replace("<td class=\"col0\">", "").Replace("<td class=\"col1\" style=\"text-align: center\">", "").Replace("<td class=\"col0\" style=\"text-align: center\">", ""); ;
                    string item3 = Days[count + 2].Replace("<strong>", "").Replace("</strong>", "").Replace("<td class=\"col1\" style=\"text-align: right;\">", "").Replace("</td>", "").Replace("<td class=\"col0\">", "").Replace("<td class=\"col1\" style=\"text-align: center\">", "").Replace("<td class=\"col0\" style=\"text-align: center\">", ""); ;
                    string item4 = Days[count + 3].Replace("<strong>", "").Replace("</strong>", "").Replace("<td class=\"col1\" style=\"text-align: right;\">", "").Replace("</td>", "").Replace("<td class=\"col0\">", "").Replace("<td class=\"col1\" style=\"text-align: center\">", "").Replace("<td class=\"col0\" style=\"text-align: center\">", ""); ;
                    
                    DataRow datrow =  Stats.NewRow();
                    datrow[0] = item1;
                    datrow[1] = item2;
                    datrow[2] = item3;
                    datrow[3] = item4;
                   
                    Stats.Rows.Add(datrow);
                    
                    count = count + 4;
                   
                }

                Trys = 0;
                return Stats;
            }
        }


        public void Last30DaysGridView(DataGridView datagridview_name, long IPcounterID)
        {
            datagridview_name.Rows.Clear();
            string[] StatsTage = Last30Days(IPcounterID);

            if (datagridview_name.ColumnCount != 4 || datagridview_name.Columns[0].HeaderText != "Tag" || datagridview_name.Columns[1].HeaderText != "Datum" || datagridview_name.Columns[2].HeaderText != "Unique" || datagridview_name.Columns[3].HeaderText != "Hits")
            {
                datagridview_name.Columns.Clear();
                datagridview_name.Columns.Add("Tage", "Tag");
                datagridview_name.Columns.Add("Datum", "Datum");
                datagridview_name.Columns.Add("Unique", "Unique");
                datagridview_name.Columns.Add("Hits", "Hits"); 
            }

            datagridview_name.AllowUserToAddRows = false;
            datagridview_name.AllowUserToDeleteRows = false;
            datagridview_name.AllowUserToResizeColumns = false;
            datagridview_name.AllowUserToResizeRows = false;
            datagridview_name.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.ColumnHeader;
            datagridview_name.BorderStyle = BorderStyle.Fixed3D;
            datagridview_name.ColumnHeadersHeightSizeMode = DataGridViewColumnHeadersHeightSizeMode.DisableResizing;
            datagridview_name.MultiSelect = false;
            datagridview_name.ReadOnly = true;
            datagridview_name.ScrollBars = ScrollBars.Vertical;
            datagridview_name.SelectionMode = DataGridViewSelectionMode.FullRowSelect;
            datagridview_name.ShowCellToolTips = false;
            datagridview_name.ShowEditingIcon = false;

            if (StatsTage[0] != "error")
            {
                int typec = 1;
                int rowc = 0;
                datagridview_name.Rows.Add();

                foreach (string item in StatsTage)
                {
                    if (typec == 5)
                    {
                        datagridview_name.Rows.Add();
                        typec = 1;
                        rowc++;
                    }

                    if (typec == 1)
                    {
                        datagridview_name.Rows[rowc].Cells[0].Value = item;
                    }
                    if (typec == 2)
                    {
                        datagridview_name.Rows[rowc].Cells[1].Value = item;
                    }
                    if (typec == 3)
                    {
                        datagridview_name.Rows[rowc].Cells[2].Value = item;
                    }
                    if (typec == 4)
                    {
                        datagridview_name.Rows[rowc].Cells[3].Value = item;
                    }
                    typec++;

                }
            }
            else
            {
              
                datagridview_name.Columns.Clear();
                datagridview_name.Columns.Add("Tage", "Error");
                datagridview_name.Columns.Add("Datum", "Error");
                datagridview_name.Columns.Add("Unique", "Error");
                datagridview_name.Columns.Add("Hits", "Error"); 

            }
        }

    }
}

RegExSolve.cs


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;

namespace MyStats
{
    class RegExSolve
    {
        
        string HTML;


        public RegExSolve(string html)
        {
           this.HTML = html;
        }

        public string[] StatsOnline()
        {
            Regex RegExPattern = new Regex(@"((<td width=""80"">Online:</td>\n      <td align=""right"" width=""70""><span style=""font-size: 12px;""><strong>)+[0-9]+)");
            MatchCollection ResultCollection = RegExPattern.Matches(this.HTML);

            string[] Results = new string[ResultCollection.Count];
            for (int x = 0; x < ResultCollection.Count; x++)
                Results[x] = ResultCollection[x].ToString();

            return Results;
        }


        public string[] StatsAll()
        {
            Regex RegExPattern = new Regex(@"((<td>Seitenaufrufe:</td>\n        <td align=""right""><span style=""font-size: 12px;""><strong>)+(.)*[0-9]+(.)*)");
            MatchCollection ResultCollection = RegExPattern.Matches(this.HTML);

            string[] Results = new string[ResultCollection.Count];
            for (int x = 0; x < ResultCollection.Count; x++)
                Results[x] = ResultCollection[x].ToString();

            return Results;
        }

        public string[] StatsUniqueAll()
        {
            Regex RegExPattern = new Regex(@"((<td width=""80"">Besucher:</td>\n        <td align=""right"" width=""70""><span style=""font-size: 12px;""><strong>)+(.)*[0-9]+(.)*)");
            MatchCollection ResultCollection = RegExPattern.Matches(this.HTML);

            string[] Results = new string[ResultCollection.Count];
            for (int x = 0; x < ResultCollection.Count; x++)
                Results[x] = ResultCollection[x].ToString();

            return Results;
        }
        

        public string[] Stats30Days()
        {
            Regex RegExPattern = new Regex(@"(((<td class=""col0"">)+((Mo,)|(Di,)|(Mi,)|(Do,)|(Fr,)|(<strong>Sa</strong>,)|(<strong>So</strong>,))+(</td>)+)|((<td class=""col1"" style=""text-align: right;"">)+[0-9.]+(</td>)+)|((<td class=""col1"" style=""text-align: center"">)+[0-9.]+(</td>)+)|((<td class=""col0"" style=""text-align: center"">)+[0-9.]+(</td>)+))");
            MatchCollection ResultCollection = RegExPattern.Matches(this.HTML);

            string[] Results = new string[ResultCollection.Count];
            for (int x = 0; x < ResultCollection.Count; x++)
                Results[x] = ResultCollection[x].ToString();

            return Results;
        }
    }
}

Noch eine kleine Anmerkung zum Schluss - das ist das erste Snippet, was ich in der Form irgendwo poste. Sollten mir Fehler unterlaufen sein, oder ihr habt generell Verbesserungsvorschläge, dann bin ich natürlich jederzeit für (konstruktive) Kritik offen!

Liebe Grüße,
ein blutiger_anfänger

Schlagwörter: ipcounter.de regex statistik

Wenn ich nicht hier bin, findest du mich auf code-bude.net.

691 Beiträge seit 2007
vor 15 Jahren

Moin.

Also ich fände es schöner, wenn du statt mit einem StringArray mit einer DataTable arbeitest.

Du übergibst der Klasse eine Referenz auf das DataGridView, manipulierst dieses und befüllst es anschließend. Ein besseres Ansatz wäre dort meines Erachtens, das du ein Extra Control erstellst, das von DataGridView ableitet und die IPcounter_ID im Konstruktor entgegennimmt.
Dadurch könntest du auch das Errorhandling schön gestalten, für den Fall das der Service nicht verfügbar ist (in dem DataGridView dann darstellen, das der Service aktuell nicht verfügbar ist)

mit freundlichen Grüßen,
Tomot

Projekte: www.gesellschaftsspieler-gesucht.de

B
blutiger_anfänger Themenstarter:in
293 Beiträge seit 2008
vor 15 Jahren

Erst einmal vielen Dank für dein Feedback. Der 30 Tage Rückblick lässt sich nun auch als DataTable ausgeben.
Jedoch würde ich mich freuen, wenn du mir deine Idee mit dem UserControl nochmal erklärst, da konnt ich dir leider noch nicht ganz folgen.
Ein vom DataGridView abgeleitetes und angepasstes Control hatte ich jetzt zw8ar auch nochmal gebastelt, aber ich sehe da einfach keinen Vorteil drin?

Es ist doch am Ende viel einfach sich ein DatagridView zu nehmen und meine Klasse konfiguriert es dann richtig, als wenn der User erst extra das neue Control hinzufügen muss, oder nicht?
Klär' mich bitte mal einer auf... 😉

liebe Grüße,
ein blutiger_anfänger

Wenn ich nicht hier bin, findest du mich auf code-bude.net.

691 Beiträge seit 2007
vor 15 Jahren

Es ist doch am Ende viel einfach sich ein DatagridView zu nehmen und meine Klasse konfiguriert es dann richtig, als wenn der User erst extra das neue Control hinzufügen muss, oder nicht?

Um es objektorientierter zu gestalten, solltest du die GUI und die Logik deiner Klasse, so wie sie die Daten bereitstellt und anzeigt von einander trennen. Das ermöglicht unter anderem, das die GUI austauschbar wird. Wenn du eine DataTable in der Logikklasse bereitstellst, brauchst du sie nur an die DataSource deiner GridView zu binden.

Hier mal in Pseudocode:


ipCounterLogic ipl = new ipCounterLogic(ID);
ipCounterDataGridView blub = new ipCounterDataGridView();
blub.DataSource = ipl.ipCounterDataGridView(ipl.Last30DaysDataTable);

Durch die Trennung von GUI und Logik wird ein leichtes, die GUI austauschbar zu machen. Beispielsweise gegen ein Tortendiagramm.

Da du die Statistik von dem Counteranbieter sowieso in einem DataGridView anzeigen lassen willst, spricht doch im Grunde nichts gegen ein eigenes Control? Ein weiterer Vorteil wäre, das du von deinem eigenen DataGridView bei Bedarf auch ableiten kannst, um gewisse Implementationen nachzureichen. Dahingegen können bei einem erweiterten DataGridView, bei dem über deine Klasse Properties gesetzt werden, Probleme entstehen, je nach Implementierung.

Ich gestehe, so ganz überzeugend mag mein Argument nicht sein, aber ich bin der festen Überzeugung, das dies der Usability hilft. Vielleicht fällt ja jemand anderm ein besseres Argument ein.

mit freundlichen Grüßen,
Tomot

Projekte: www.gesellschaftsspieler-gesucht.de

49.485 Beiträge seit 2005
vor 15 Jahren

Vielleicht fällt ja jemand anderm ein besseres Argument ein.

Allerdings bitte nicht in diesem Thread, den dafür gibt es geeignetere Unterforen als ".NET-Komponenten und C#-Snippets"