none
Text von Website in Firefox bekommen RRS feed

  • Frage

  • Guten Tag,

    ich möchte gerne nur einen Wert von einer Website bekommen. Und zwar den Wert rechts, neben dem  Baum: hier 94.

    Ich habe genau 3 Möglichkeiten...

    1. Den Wert über den HTML-Code auslesen, jedoch wird das schwierig und ich weiß nicht, wie ich das umsetzten sollte...

    2. Der Wert wird in einem Cookie gespeichert. Idealerweise lese ich diesen aus und gebe den Wert zum Beispiel in eine TextBox aus, das wäre die beste der 3 Möglichkeiten, jedoch habe ich hier noch weniger Ahnung, wie das geht. Und

    3. den Abschnitt screenshotten und durch eine OCR-Software laufen lassen, geht, ist aber umständlich.

    Habt ihr noch andere Ideen oder Code-beispiele zu den gegebenen Möglichkeiten?

    Vielen Dank,

    Henrik

    Donnerstag, 5. September 2019 15:41

Antworten

  • Ich habe das ganze mal über die Cookies gemacht und eine ConsolenApp erstellt. Für das Beispiel brauchst Du das Nuget Paket Microsoft.EntityFrameworkCore.Sqlite. Ich lese die SQlite Datenbank vom Firefox ein. Diese befindet sich bei mir unter diesem Pfad. Bei dir wird der Pfad etwas anders sein. Der AppData Ordner ist versteckt, Du muss im Explorer einstellen das Du auch versteckte Ordner sehen willst

    Hier der Code

    class Program
    {
        static void Main(string[] args)
        {
            using (var db = new CookiesContext())
            {
                var ecosia = db.moz_cookies.FirstOrDefault(a => a.baseDomain.ToLower() == "ecosia.org" && a.name == "ECFG");
                if (ecosia != null)
                {
                    //Dadrin ist der Wert den Du suchst
                    var ecfg = ecosia.value.Split(':');
                }
            }
        }
    
    }
    
    public class CookiesContext : DbContext
    {
        public DbSet<Moz_Cookie> moz_cookies { get; set; }
    
        protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
        {
            //Der Pfad wird auf deinem System anders sein
            string appData = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData);
            var pathSqlite = System.IO.Path.Combine(appData, "Mozilla\\Firefox\\Profiles\\lfsk6jbk.default-release\\cookies.sqlite");
    
            optionsBuilder.UseSqlite($"Data Source={pathSqlite}");
        }
    }
    
    public class Moz_Cookie
    {
        public int id { get; set; }
        public string baseDomain { get; set; }
        public string originAttributes { get; set; }
        public string name { get; set; }
        public string value { get; set; }
        public string host { get; set; }
        public string path { get; set; }
        public int expiry { get; set; }
        public int lastAccessed { get; set; }
        public int creationTime { get; set; }
        public int isSecure { get; set; }
        public int isHttpOnly { get; set; }
        public int inBrowserElement { get; set; }
        public int sameSite { get; set; }
        public int rawSameSite { get; set; }
    }


    Gruß Thomas
    13 Millionen Schweine landen jährlich im Müll
    Dev Apps von mir: UWP Segoe MDL2 Assets, UI Strings

    • Als Antwort markiert Klaus Günther Samstag, 7. September 2019 09:55
    Samstag, 7. September 2019 00:18
  • Hallo Klaus,

    das eigentliche Problem wird sein: Wie willst Du aus der .NET Anwendung heraus den Zugriff auf die Website so gestalten, dass der Zugriff als ein solcher von dir erkannt wird. Im besten Fall kannst Du das Browsercookie beim Request mitsenden, ggfs. funktioniert das. Der in der Antwort mitgesendete Set-Cookie Wert muss aber auch berücksichtigt und lokal gespeichert werden, da der anscheinend auch dafür zuständig ist, den bisherigen Wert beim nächsten Aufruf zu übergeben.

    Soweit ich das sehen kann, wird dir gewünschte Wert im Cookie ECFG hinter dem Parameternamen t gespeichert. Allerdings ist die Struktur oft unterschiedlich, daher müsste man das parsen und drauf vertrauen, dass sich das nicht ändert.

    Alternativ kannst Du bspw. über das Html Agility Pack den HTML Inhalt parsen und den Inhalt des Elements:

    <span class="pill-text tree-counter-text js-treecount-text">

    auslesen. Aber auch hier ist man darauf angewiesen, dass sich das nicht ändert. Ansonsten muss man die Anwendung entsprechend anpassen.

    So oder so: Das Senden und Empfangen würde ich mit HttpWebRequest (.NET Framework) oder HttpClient (.NET Core) machen. Das Parsen mit dem Html Agility Pack. Da die Browser die Cookies zumeist nicht (mehr) als einzelne Datei(en) ablegen, sondern die bspw. in SQLite Datenbankdateien vorhalten, würde ich das gar nicht erst versuchen.

    ---

    Wenn Du uns verrätst, für was Du diesen Wert eigentlich benötigst, kann man dir evtl. auch einen Vorschlag für die Umsetzung machen.

    P.S.: (Für Thomas): Ein Login braucht es nicht, man muss aber mindestens eine Suche durchgeführt haben, damit der Baum mit der Zahl zu sehen ist.

     


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET (2001-2018)
    https://www.asp-solutions.de/ - IT Beratung, Softwareentwicklung, Remotesupport


    Donnerstag, 5. September 2019 16:08
    Moderator

Alle Antworten

  • Hallo Henrik,

    eine HTML Datei ist eine XML Datei. Darin nach etwas zu suchen ist z.B. mit dem Html Agility Pack nicht wirklich schwer. Im Internet findet man dazu viele Anleitungen.

    Problematisch ist aber das der Baum und die Zahl bei mir nicht zu sehen ist. Wahrscheinlich bedarf es eines Logins und das ist ein problem das man nicht so einfach lösen kann. Dafür muss die Website genau analysiert werden.


    Gruß Thomas
    13 Millionen Schweine landen jährlich im Müll
    Dev Apps von mir: UWP Segoe MDL2 Assets, UI Strings

    Donnerstag, 5. September 2019 16:07
  • Hallo Klaus,

    das eigentliche Problem wird sein: Wie willst Du aus der .NET Anwendung heraus den Zugriff auf die Website so gestalten, dass der Zugriff als ein solcher von dir erkannt wird. Im besten Fall kannst Du das Browsercookie beim Request mitsenden, ggfs. funktioniert das. Der in der Antwort mitgesendete Set-Cookie Wert muss aber auch berücksichtigt und lokal gespeichert werden, da der anscheinend auch dafür zuständig ist, den bisherigen Wert beim nächsten Aufruf zu übergeben.

    Soweit ich das sehen kann, wird dir gewünschte Wert im Cookie ECFG hinter dem Parameternamen t gespeichert. Allerdings ist die Struktur oft unterschiedlich, daher müsste man das parsen und drauf vertrauen, dass sich das nicht ändert.

    Alternativ kannst Du bspw. über das Html Agility Pack den HTML Inhalt parsen und den Inhalt des Elements:

    <span class="pill-text tree-counter-text js-treecount-text">

    auslesen. Aber auch hier ist man darauf angewiesen, dass sich das nicht ändert. Ansonsten muss man die Anwendung entsprechend anpassen.

    So oder so: Das Senden und Empfangen würde ich mit HttpWebRequest (.NET Framework) oder HttpClient (.NET Core) machen. Das Parsen mit dem Html Agility Pack. Da die Browser die Cookies zumeist nicht (mehr) als einzelne Datei(en) ablegen, sondern die bspw. in SQLite Datenbankdateien vorhalten, würde ich das gar nicht erst versuchen.

    ---

    Wenn Du uns verrätst, für was Du diesen Wert eigentlich benötigst, kann man dir evtl. auch einen Vorschlag für die Umsetzung machen.

    P.S.: (Für Thomas): Ein Login braucht es nicht, man muss aber mindestens eine Suche durchgeführt haben, damit der Baum mit der Zahl zu sehen ist.

     


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET (2001-2018)
    https://www.asp-solutions.de/ - IT Beratung, Softwareentwicklung, Remotesupport


    Donnerstag, 5. September 2019 16:08
    Moderator
  • Ok man muss erstmal etwas suchen bevor der Baum erscheint. Also kein Login. Damit auch kein Problem

    Gruß Thomas
    13 Millionen Schweine landen jährlich im Müll
    Dev Apps von mir: UWP Segoe MDL2 Assets, UI Strings

    Donnerstag, 5. September 2019 16:12
  • Hallo,

    ich möchte gerne die Werte sammeln und übersichtlich in einer Chart anzeigen lassen, bswpw. wöchentlich, monatlich usw., damit ich sehen kann, wie viele Suchanfragen ich so abschicke...

    Ich weiß nur nicht, wie das ist, wenn man den Link nachher nimmt (ecosia.org), ob er dann nicht immer 0 als Zähler hat...

    hast du ein Beispiel für winforms?


    • Bearbeitet Klaus Günther Donnerstag, 5. September 2019 16:22 Änderung
    Donnerstag, 5. September 2019 16:18
  • Hallo Klaus,

    Sinn und Zweck des Forums ist es ja nicht, dir alle Arbeit abzunehmen und dir für diese doch sehr spezielle Anfrage (damit meine ich, dass das nur für dich was ist und in dieser speziellen Form andere nur bedingt interessieren dürfte) ein vollständiges Beispiel zu programmieren.

    Ohne das Cookie wird da auch immer 0 kommen, daher meine obenstehenden Anmerkungen.

    Probier es doch erstmal selbst (HttpWebRequest, HttpWebResponse und das Html Agility Pack hast Du ja schon genannt bekommen) und wenn Du dann nicht weiterkommst, meld dich nochmal hier, poste deinen Code und wir schauen, wo man was ergänzen/anpassen muss.


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET (2001-2018)
    https://www.asp-solutions.de/ - IT Beratung, Softwareentwicklung, Remotesupport


    Donnerstag, 5. September 2019 16:24
    Moderator
  • Jaa, es ging ja auch gar nicht darum, mir hier jetzt ein komplettes fertiges Beispiel zu posten...

    Sondern es ging darum, den HTML Wertzu parsen, mit dem Agillity Pack. Damit müsste es ja eigentlich klappen, oder ist dann der Zähler auch immer null und wir müssen an den ECFG Wert t vom Cookie ran?

    <span class="pill-text tree-counter-text js-treecount-text">

    Donnerstag, 5. September 2019 16:43
  • "Soweit ich das sehen kann, wird dir gewünschte Wert im Cookie ECFG hinter dem Parameternamen t gespeichert. Allerdings ist die Struktur oft unterschiedlich, daher müsste man das parsen und drauf vertrauen, dass sich das nicht ändert."

    Wie schaffe ich es denn, den ECFG-Cookie-Wert zu parsen? Geht das auch mit dem HTML Agillity Pack?

    Freitag, 6. September 2019 16:23
  • Hey,

    also, ich habe nun ein Beispiel da:

     var html = "http://www.ecosia.org";
    
                HtmlWeb web = new HtmlWeb();
    
                var htmlDoc = web.Load(html);
    
                var node = htmlDoc.DocumentNode.SelectSingleNode("/html/body/div/div/div/header/div[1]/button/span[2]");
                textBox1.Text = node.InnerText;

    Doch leider gibt er immer node = null als Fehler zurück. Und leider weiß ich auch nicht, wie du das meinst mit dem WebRequest.

    Magst du mir vielleicht bitte helfen?
    Danke

    Freitag, 6. September 2019 21:17
  • Ich habe das ganze mal über die Cookies gemacht und eine ConsolenApp erstellt. Für das Beispiel brauchst Du das Nuget Paket Microsoft.EntityFrameworkCore.Sqlite. Ich lese die SQlite Datenbank vom Firefox ein. Diese befindet sich bei mir unter diesem Pfad. Bei dir wird der Pfad etwas anders sein. Der AppData Ordner ist versteckt, Du muss im Explorer einstellen das Du auch versteckte Ordner sehen willst

    Hier der Code

    class Program
    {
        static void Main(string[] args)
        {
            using (var db = new CookiesContext())
            {
                var ecosia = db.moz_cookies.FirstOrDefault(a => a.baseDomain.ToLower() == "ecosia.org" && a.name == "ECFG");
                if (ecosia != null)
                {
                    //Dadrin ist der Wert den Du suchst
                    var ecfg = ecosia.value.Split(':');
                }
            }
        }
    
    }
    
    public class CookiesContext : DbContext
    {
        public DbSet<Moz_Cookie> moz_cookies { get; set; }
    
        protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
        {
            //Der Pfad wird auf deinem System anders sein
            string appData = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData);
            var pathSqlite = System.IO.Path.Combine(appData, "Mozilla\\Firefox\\Profiles\\lfsk6jbk.default-release\\cookies.sqlite");
    
            optionsBuilder.UseSqlite($"Data Source={pathSqlite}");
        }
    }
    
    public class Moz_Cookie
    {
        public int id { get; set; }
        public string baseDomain { get; set; }
        public string originAttributes { get; set; }
        public string name { get; set; }
        public string value { get; set; }
        public string host { get; set; }
        public string path { get; set; }
        public int expiry { get; set; }
        public int lastAccessed { get; set; }
        public int creationTime { get; set; }
        public int isSecure { get; set; }
        public int isHttpOnly { get; set; }
        public int inBrowserElement { get; set; }
        public int sameSite { get; set; }
        public int rawSameSite { get; set; }
    }


    Gruß Thomas
    13 Millionen Schweine landen jährlich im Müll
    Dev Apps von mir: UWP Segoe MDL2 Assets, UI Strings

    • Als Antwort markiert Klaus Günther Samstag, 7. September 2019 09:55
    Samstag, 7. September 2019 00:18
  • Super, vielen vielen Dank!

    Habe alles hinbekommen, den string noch auszulesen, klappte super.

    Danke an alle

    Samstag, 7. September 2019 08:08
  • Ich habe genau 3 Möglichkeiten...

    1. Den Wert über den HTML-Code auslesen, jedoch wird das schwierig und ich weiß nicht, wie ich das umsetzten sollte...

    2. Der Wert wird in einem Cookie gespeichert. Idealerweise lese ich diesen aus und gebe den Wert zum Beispiel in eine TextBox aus, das wäre die beste der 3 Möglichkeiten, jedoch habe ich hier noch weniger Ahnung, wie das geht. Und

    3. den Abschnitt screenshotten und durch eine OCR-Software laufen lassen, geht, ist aber umständlich.

    Habt ihr noch andere Ideen oder Code-beispiele zu den gegebenen Möglichkeiten?

    Da du Firefox nutzt: Eventuell wären die Telemetry Daten zu Suchanfragen im Firefox eine Möglichkeit diesen Wert zu ermitteln, dies wäre dann unabhängig von Änderung im Cookie oder auf der Webseite und umfasst auch Suchen, die nicht mit Ecosia gemacht werden. Da ich kein Firefox nutze (bzw. sehr selten), bin ich mir allerdings nicht sicher ob die Daten im Firefox ausreichend sind. Hier die Doku: Search Data

    Update: Die verfügbaren Daten, so nach kurzer Prüfung, umfassen nicht die Sucheingaben auf der Webseite selbst - reichen demnach nicht.


    - Gruß Florian


    • Bearbeitet Florian Haupt Mittwoch, 11. September 2019 09:53 Update
    Mittwoch, 11. September 2019 08:38
  • Hey,

    danke für deine Antwort. Ich muss sagen, dass das aktuell nicht mehr so mein größtes Problem ist.

    Eher, dass ich nicht weiß, wie ich 2 verschiedene Werte zwischen 2 Computern synchronisieren kann und jeweils mit einer Anwendung auf PC1 und einer auf PC2 auslesen kann...

    Geht das irgendwie zum Beispiel über OneDrive?

    Mittwoch, 11. September 2019 14:25
  • Hallo Klaus,

    das hat aber mit der eigentlichen Frage nichts mehr zu tun, oder?

    Falls nicht, erstell bitte einen neuen Thread und poste mehr Details zu deiner neuen Fragestellung. Bspw. Was genau willst Du wie synchroniseren? Wo kommen die Werte her? Wann sollen die Werte synchronisiert werden?


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET (2001-2018)
    https://www.asp-solutions.de/ - IT Beratung, Softwareentwicklung, Remotesupport

    Mittwoch, 11. September 2019 15:03
    Moderator