Feedback

C# - Aktuelle Version eines Programms mittels Wikipedia ermitteln

Veröffentlicht von am 8/12/2010
(1 Bewertungen)
Mit Hilfe dieser Klasse lässt sich die aktuelle Version eines Programmes ermitteln.
Im Falle von Firefox würde zum jetzigen Zeitpunkt "3.6.8" zurückgeliefert werden.

Die Informationen werden aus Wikipedia ausgelesen.
class wikipediaReader
    {
        private string basicWikiLink = "http://de.wikipedia.org/wiki/";
        private string appName;
        private const string startSequence = "<td valign=\"top\"><b>Aktuelle&#160;<a href=\"/wiki/Version_(Software)\" title=\"Version (Software)\">Version</a></b></td>";

        public wikipediaReader(string appName)
        {
            this.appName = appName;
        }

        public string getNewestAppVersion()
        {
            try
            {
                string version = basicQuery();
                return basicQuery();
            }
            catch (Exception e)
            {
                return "Die aktuelle Version konnte nicht ermittelt werden";
            }           
        }

        private string extendedQuery(string source)
        {
            if (source.IndexOf("<ul class=\"mw-search-results\">") > 0) {
                source = source.Substring(source.IndexOf("<ul class=\"mw-search-results\">")); }
            else{
                source = source.Substring(source.IndexOf("<ul"));}

            source = source.Substring(source.IndexOf("href="));
            source = source.Substring(source.IndexOf('"')+1);
            source = source.Substring(0,source.IndexOf('"'));
           
            string url = "http://de.wikipedia.org" + source;

            HttpWebRequest myHttpWebRequest = (HttpWebRequest)WebRequest.Create(url);
            myHttpWebRequest.UserAgent = "Mozilla/5.0 (Windows; U; Windows NT 5.1; de; rv:1.9.0.10) Gecko/2009042316 Firefox/3.0.10"; // Als Firefox ausgeben - Wikipedia aktzeptiert keine Requests von unbekannten UserAgents

            // WebResponse vom WebRequest erstellen
            HttpWebResponse wResponse = (HttpWebResponse)myHttpWebRequest.GetResponse();

            // StreamReader initiieren, um den Inhalt der URL zu lesen
            StreamReader sr = new StreamReader(wResponse.GetResponseStream(), Encoding.ASCII);
            StringBuilder contentBuilder = new StringBuilder();
            while (-1 != sr.Peek())
            {
                // Zeile für Zeile auslesen
                contentBuilder.Append(sr.ReadLine());
            }

            // Zuweisung des StringBuilder auf String
            string strSource = contentBuilder.ToString();

            // Response abschließen
            wResponse.Close();

            // Request beenden
            myHttpWebRequest.Abort();

            return strSource;
        }


        /* Liefert die aktuellste Version des übergebenen Programms zurück. Zunächst wird geprüft, ob
         *  basicWikiLink + this.appName zu einem gültigen Softwareartikel führt. Falls das nicht der Fall ist,
         *  wird der erste vorgeschlagene Link aufgerufen und nach der Versionsnummer gesucht.
         */
        private string basicQuery()
        {
            HttpWebRequest myHttpWebRequest = (HttpWebRequest)WebRequest.Create(this.basicWikiLink + this.appName);
            myHttpWebRequest.UserAgent = "Mozilla/5.0 (Windows; U; Windows NT 5.1; de; rv:1.9.0.10) Gecko/2009042316 Firefox/3.0.10"; // Als Firefox ausgeben - Wikipedia aktzeptiert keine Requests von unbekannten UserAgents
            
            // WebResponse vom WebRequest erstellen
            HttpWebResponse wResponse = (HttpWebResponse)myHttpWebRequest.GetResponse();

            // StreamReader initiieren, um den Inhalt der URL zu lesen
            StreamReader sr = new StreamReader(wResponse.GetResponseStream(), Encoding.ASCII);
            StringBuilder contentBuilder = new StringBuilder();
            while (-1 != sr.Peek())
            {
                // Zeile für Zeile auslesen
                contentBuilder.Append(sr.ReadLine());
            }

            // Zuweisung des StringBuilder auf String
            string  strSource = contentBuilder.ToString();

            // Response abschließen
            wResponse.Close();

            // Request beenden
            myHttpWebRequest.Abort();
   
            /* Wenn der String nicht enthalten ist, ist die geöffnete Seite kein Artikel über Software */
            if(!strSource.Contains(startSequence)){
                strSource = this.extendedQuery(strSource); /* Falls mehrere Einträge zum Suchwort existieren, wähle den ersten Artikel */
       
                if (!strSource.Contains(startSequence))
                {
                    return "Aktuelle Version nicht verfügbar";
                }

            }
                strSource = strSource.Substring(strSource.IndexOf(startSequence)); // Dokument ab Beginn der Version Zeile
                strSource = strSource.Substring(0,strSource.IndexOf("</tr>")); // Nur die Version Zeile
                strSource = strSource.Substring(strSource.IndexOf("</td>")); // Titel wegschneiden
                strSource = strSource.Substring(strSource.IndexOf("<td>") + 4); // Begínn des Feldes, dass den Versionstring enthält

                int index = 0;
                for (int i = 0; i < strSource.Length; i++)
                {
                    char actChar = Convert.ToChar(strSource.Substring(i, 1));
                    if (actChar != ' ' && !Char.IsNumber(actChar) && actChar != '.')
                    {
                        index = i;
                        break;
                    }
                }
                       
                strSource = strSource.Substring(0,index); // Nur das VersionFeld
                
            return strSource;
        }
Abgelegt unter wikipedia, programm, version, aktuell, ermitteln.

2 Kommentare zum Snippet

Nab4Ever schrieb am 8/12/2010:
Ergänzung: Ich habe den Wikipedia Support diesbezüglich angeschrieben - Diese Vorgehensweise ist aus ihrer Sicht legitim. Es ist kein Quellennachweis notwendig, da die Versionsnummer nicht die notwendige Schöpfungshöhe erreicht.
Firendeath schrieb am 8/12/2010:
Hi,
schönes Snippet...
aber ich hätte da noch 2 kleine Anmerkungen.
1tens:

string version = basicQuery();
return basicQuery();

Wieso rufst du an dieser Stelle 2 mal ein Funktion auf die dir höchstwahrscheinlich den selben Wert zurückgibt ?
Ich würd das so schreiben:
return basicQuery();


2tens:
catch (Exception e)

Exception kann ALLES sein,
bitte Prezisieren.

Ansonsten tolles Snippet,
Danke =)
 

Logge dich ein, um hier zu kommentieren!