C++ - Begriffe aus angezeigter Chrome Webseite suchen und finden



  • Hallo meine lieben,

    ich bin neu hier im Forum. Meine C++ Kenntnisse beschränken sich auf die Basics.
    Oft habe ich gelesen, um programmieren zu lernen und Spaß daran zu haben, sollte man sich immer kleine Ziele setzen und diese programmieren. Ich bin sehr motiviert allerdings komme ich momentan nicht weiter.

    Ich möchte mit meinem Programm auf einer angezeigte Seite in Chrome nach Begriffen/strings oder Zahlen suchen. Zum Beispiel in einem Wikipedia Artikel. Wie gehe ich vor?
    Eine kurze Antwort mit dem Prinzip der Verwirklichung und eine Empfehlung der Vorgehensweise reicht aus, bevor ich keine Hilfe bekomme^^

    Vielen Dank schonmal für die Hilfe.



  • Hi xano,

    sehr gut, dass du so motiviert bist 😉 Diese Aufgabe ist als Anfänger jedoch zu hoch gegriffen. C++ kennt kein Netzwerkzeug. Um das zu erreichen was du willst, brauchst du externe Librarys:

    1. Als erstes brauchst du eine Lib, mit der du eine Webpage herunterladen kannst. Da gibt es sehr viele. Für die Hardcorler z.B. boost.asio oder nun boost.beast. Dann gibts noch libcurl/curlpp, cpr, urdl, SFML oder - was ich nutze - Cinder ...und noch viele mehr.

    2. Nun hast du schön deine Webpage heruntergeladen. Jetzt hast du das Problem, dass es sehr wahrscheinlich HTML-Tag Fehler gibt. Du brauchst jetzt eine Lib, die den HTML-Code XML konform macht. Da gibts z.B: arabica.Taggle oder tidy-html5.

    3. Jetzt hast du deine Webpage im XML Format und kannst sie mit einem XML Parser durchforsten. Da gibt es auch viele, rapidxml (wird nicht mehr weiterentwickelt), tinyxml2 und pugixml. Ich nehme immer pugixml, weil es XPath unterstüzt und ich somit schnell und einfach an bestimmte Elemente komme.

    Wie du siehst, ist es doch eine kleine Herausforderung.

    Achja, da gibts die Leute, die HTML und XML mit Regex parsen wollen. Das geht nicht.



  • Hi Out,

    vielen dank für die Antwort, jetzt weiß ich schonmal Bescheid wie ich vorgehe.

    Was ich mir dachte war das Auslesen des Speichers der angezeigten Seite. Wäre dies nicht möglich?

    Kann man denn auch später die gefundenen Begriffe im Browser optisch markieren? Zum Beispiel in dem man die Positionen der Begriffe mit einer Art Draw Befehl markiert? oder kann man vielleicht direkt css befehle mit meinem programm anwenden sodass ich möglichkeiten zur markierung bekomme?



  • Wenn ein externes Programm auf den Inhalt von Chrome zugreifen könnte, wäre das sehr bedenklich.
    (ein hohes Sicherheitsrisiko)

    Du möchtest ein Chrome Addon programmieren.

    Wie das geht, sagt dir Google, da es der Hersteller von Chrome ist.



  • Hi DirkB,

    danke für deine Teilnahme.

    Gibt es nicht die Möglichkeit, dass ein Programm außerhalb von Chrome darauf zugreift? Ich möchte gerne mit einer Programmiersprache so gut wie alles erledigen können.



  • xano schrieb:

    Gibt es nicht die Möglichkeit, dass ein Programm außerhalb von Chrome darauf zugreift?

    Ich finde das nicht so prickelnd, wenn ein anderes Programm mir beim Online-Banking zuschaut.
    Andere auch nioht.

    Und wenn das geht, dann brauchst du gar nicht erst anfangen, weil dann noch kaum einer Chrome benutzt.

    Aber du kannst deinen eigenen Browser schreiben. Das hat ja out schon in groben Zügen beschrieben.

    xano schrieb:

    Ich möchte gerne mit einer Programmiersprache so gut wie alles erledigen können.

    Wenn man nur einen Hammer hat, sieht alles wie ein Nagel aus.
    Nimm die Programmiersprache, die am Besten für dein Problem geeignet ist.

    PS. Das mit dem Ende von Chrome nehme ich zurück. Der IE hat auch laange überlebt.



  • Ja sicher geht das. Ich bin 99,999% sicher, dass du zumindest ohne Probleme mit ReadProcessMemory/WriteProcessMemory (unter Windows) auf Chrome zugreifen kannst, und es da keinen "Schutzmechanismus" gibt, weil das völlig sinnlos wäre.
    Allerdings wäre auch das Vorgehen hier auch nicht sinnvoll, weil man damit nicht weit kommt.

    An sich gibt´s schon verschiedene Möglichkeiten, mit dem Browser zu reden, z.B. das Remote Debugging Protokoll. Oder schau dir mal Projekte wie ChromeDriver an.

    Allerdings ist das auch alles zu kompliziert und nicht direkt das, was du willst. Ich denke, ganz so einfach wie mit dem Internet Explorer kriegst du das nicht hin. Mir fällt zumindest keine elegantere Lösung ein, als ein AddOn. Und das kann wiederum mit einem externen Prozess kommunizieren.

    Ich würde aber nicht mit so einem Projekt anfangen, dafür brauchst du zu viel Spezialwissen, lern erstmal richtig programmieren.



  • Hi, danke für die Antwort. Es hätte mich auch gewundert wenn man mit c++ nicht mal auf Speicher eines anderen Programms zugreifen könnte und das hat mich auch etwas demotiviert eben.

    Was meinst du mit richtig programmieren lernen? Die Basics wie Grammatik kenne ich.


  • Mod

    xano schrieb:

    Hi, danke für die Antwort. Es hätte mich auch gewundert wenn man mit c++ nicht mal auf Speicher eines anderen Programms zugreifen könnte und das hat mich auch etwas demotiviert eben.

    Zwischen 'Können' und 'Nützlich sein' ist in diesem Fall aber ein riesiger Unterschied. Mit dem Ansatz wirst du nicht zum Ziel kommen. Denn nur weil die Information prinzipiell irgendwo im Speicher steht, heißt das nicht, dass sie in dort in einer Form liegt, die dafür gemacht ist, sich einfach dadurch zu finden. Das werden irgendwelche internen Datenstrukturen von Chrome sein, die wer weiß wie angeordnet sind und deren Format sich auch gewiss mit jeder Version, ja sogar jedem Build ändern werden.

    Hier mal ein Auszug aus einem pdf-Dokument, das bei mir rumliegt:

    %PDF-1.4
    %ÐÔÅØ
    3 0 obj <<
    /Length 1180      
    /Filter /FlateDecode
    >>
    stream
    xÚ•VKoã6¾çWèH+•õìÞŒl³»iú@Èf²DI„(º•¨ð¯ï‡6×-PøÀá¼43ßÌÐÛÝÍ?ÅE¤QQq°ë‚8«"‘WA^UQ•%Á®
    ¾±­š4ãÚl’Œ
    ÒlBÁSö²Ir&7aÌæÑ‘Ãl7ßw_o>ínþº‰¿8 ?e•¿$i4ÓÍ·ï<hAö5àQ‘Á«Óœ‘Š¨ˆÑN7¿_óÁ£2‹/}$iõ¯>¶˜aÂH&Or— gYä*ÈÝ%ø´ÚÚB^=¨ÇoÔÓ8JÓü9½!sÈ4N8=rнˆŽßfµH"k}ôÂ<{gö̹xEº,ª—ˆ§ëõµž.Øä<À]°¾1¼ ô…q e׬ŒÄoð‚%¡@¢dŸ~&†TËXk+ºþ±É9«—EÎÞ ç=lWkÏÜ‚Óéeû¹^œ‰÷´6ãY1ãÜÅÅßGäì8v%3Ô4rÎxJä£Åä›XñGb=©é?ZH¤Q	ˆýoø“7xž|ÅeTdÅŠðmÂLTl5-)w kRK-ÿøˆE
    X`ÁIÞÖǵWòYˆ‚´œ%õVNĹ?4ƒ~yÞm¤bÔ{± TPC_iV°½ZÈáCqúÚ%‘9J;im/-xHS3Z«ÅFDê9¡N÷s,%ëp‚å&fúUº¦E9ä$Ãk¸î¥—"/ØìtWO׶vYüÎJ¦ëþ¬zëТ— ™¤j¡áÍ…›Q°ˆÞÅÚ‘x/'Èñj(‹›VÐdT1‹Y—×ùø$õÞ%ŒLW™Îb¸(iWgÔ£‘ÖŠZ@J& òKÝ–Èyu[U4VÑ\‹[ûÞ!¨!˹6£›iÎîääÆ\và»=:™'<Ê„_²oê™–>‰½ˆu@™(ÄH2:›‰ÎÛS.“ôƒr½.@•ì µOOø	'ú잦ù:Ö
    »7g£–Ê,ίŸ•=ºîϘƒS}ççÿè`ä¹ø‘~h2֐Ƥú°×5E
    XÛk‘Hcáóƒëæ8a_ä0…²mëfì¸kb6‘áH¢Ï»¨bAöo'—0t‹§.jäGv{h©“9”«•ÍhéB£'²Ê¯Àد@AÍ°µû2 »Qž•<S2lCõö¶Æ½R¦[å:Vð̼ÒÞ°à,<á
    Zöô- irQ÷¯cíåb1ÊÕ<°Î
    ú§‡-Zxð»¾-hÊ¿XEQº¶^'bºÆ@âHœò\Mà½æÓqûî`­L;Ó›AAl@z­—k!¸Ü’²tÍ2#Y±;Øš¸VÉŽ˜Ôâ¸ë#}™H ‘àΗƒTGX“ø?Áñ±çÝJd'ð :ÎÝ\·×"(¯ Û•YÉ\öµO
    /Ÿ%Tu1Ú!Jª‚€×šä‹{9çãÉØU	úëàFÀéÉùE] szjhD¯n¢‡ÚÐâêÕÞE° q¿6ÉVæBøkG-ä«4ž9¼áúÂSºêȽì•16:½ùÆ
    endstream
    

    Alles klar? Wie lange, denkst du wohl, würdest du brauchen, um herauszufinden, welchen Text dies darstellt? Und das ist ein statisches Dokument in einem wohldokumentiertes Format, dessen Definitionen du nachlesen kannst. Beim Speicherinhalt von Chrome kannst du das nicht nachlesen und der verändert sich auch noch pausenlos, während Chrome läuft. Wie lange bräuchtest du wohl ohne Anleitung? Und jetzt willst du das nicht nur lesen, sondern auch noch gezielt verändern, so dass ein Teil des Textes markiert wird? Viel Spaß.

    Der richtige Weg geht, wie schon gesagt, über ein Plugin. Da wird es Schnittstellen geben, die dir den Inhalt der Webseite in wohlaufbereiteter Form zur Verfügung stellen und ebenso auch Schnittstellen, um eben so etwas wie Hervorhebungen einzufügen.

    Aber selbst letzteres dürfte für einen Programmieranfänger nicht ganz leicht sein. Dein Vorhaben ist sehr ambitioniert.



  • xano schrieb:

    Was meinst du mit richtig programmieren lernen? Die Basics wie Grammatik kenne ich.

    Naja, wir reden auch alle deutsch aber können keine Bestseller schreiben. Es gibt viele Wege, ein Problem zu lösen, manche sind richtig schlecht, manche sind gut aber mitterweile veraltet und andere sind gut und andere sind sehr gut. Um zu wissen was was ist, reicht es eben nicht, die C++ Grammatik zu kennen. Das braucht einige Bücher und einige Jahre Zeit. Die Buchempfehlungen findest du unter meinem Beitrag in der Signatur.

    Stell dir die Programmiersprachen wie Werkzeuge in einem Werkzeugkoffer vor. Da gibt es nicht ein Werkzeug mit dem du alles machst. Je nach Problem entscheidest du dich gezielt für ein Werkzeug. Und so ist das mit den Programmiersprache halt auch.



  • ok danke. trotzdem finde ich es irgendwie schade.

    ich hätte gerne die position eines begriffs koordinatisch auf dem Display festgestellt und dann markiert nur mit Hilfe meines externen Programms



  • out schrieb:

    Naja, wir reden auch alle deutsch aber können keine Bestseller schreiben.

    Ich finde den Vergleich noch zu schwach. Die Basics von C++ zu kennen, entspricht vielleicht dem Kennen des Alphabets.



  • xano schrieb:

    ich hätte gerne die position eines begriffs koordinatisch auf dem Display festgestellt und dann markiert nur mit Hilfe meines externen Programms

    Mach doch ein Snapshot vom Browserfenster und markiere dort ein Wort. Nur eben ohne Tools wie 'Snippung Tool' und Paint zum markieren.

    Halt alles selbst geschrieben. Den Snapshot müsste Du mit der WinAPI hinbekommen und das Bild bearbeiten über das Dateiformat des Bildes.

    Ich denke, dieses Ziel ist in deutlich näherer Sicht, als was Du wünschst. Und damit wirst Du schon fürs erste genug zu tun haben.



  • Nur mit einem snapshot kann ich aber nicht definierte Wörter markieren. Es muss einen weg geben wie ich zum beispiel die koordinaten aller Wörter "Hallo" in der von Chrome angezeigten Seite erfahre und diese koordinaten dann markiere. Letzteres, also das markieren eines bestimmten Bereichs auf dem Bildschirm ist sicherlich easy.. müsste mich nur nach der passenden Funktion/Lib umgucken (DirectX?)



  • xano schrieb:

    Nur mit einem snapshot kann ich aber nicht definierte Wörter markieren.

    Warum nicht? Du suchst in dem Bild, über dessen Dateiformat Du Dich vorher informiert hat, nach dem Muster, was Deinem Wort entspricht und manipulierst diesen Inhalt so, das es markiert ist.

    Wie Du das im Browser selbst machst, wurde ja schon angeschnitten. Und so wie ich das überblicken kann, ist mein Vorschlag zur Übung deutlich leichter.



  • danke



  • Das ist alles nicht sinnvoll. Was heißt hier "Muster"? OCR ist auch nicht trivial und funktioniert bei weitem nicht perfekt.
    Und allein um den Browser Prozess zu finden, seine Fenster, einen Screenshot zu erstellen (und das ist auch schon gar nicht so trivial, wie du vielleicht denkst), muss man einiges über die WinApi (ich nehme an, wir reden über Windows) wissen. Das ist für Programmieranfänger nicht unbedingt zielführend. Das ist kompliziert, frustrierend, und trägt nicht dazu bei, Programmierkonzepte zu verstehen.



  • Ich hatte dies auch tatsächlich einfacher vorgestellt. Mir gings nicht um den Browser selbst oder dessen Prozesse. Sondern mein Vorschlag war, statt der TO sich in solche Untiefen begibt. Etwas naheliegendes zu üben.

    Weiß jetzt nicht, wie schwierig es ist, die Bilddaten und die Farbtabelle eines Bildes zu lesen und zu verändern, bei bmps zB ist es gar nicht SO schwierig. Jedenfalls deren Farbtabelle 🙂
    Wenn man sich wie bei der Farbtabelle etwas reinkniet, kann man schon ganz gut erkennen, wofür die Dateiinhalte stehen und kann sie verändern.

    Bin gerade auf ner Party und so übel am feiern, aber OCR klingt für mich doch etwas hochgestochen.
    Wollte nur darauf hinweisen, das man bei einer Sprache alles lernen muss, was über den Taschenrechner hinausgeht. Einfach "schau in Browserfenster und markiere meine gewünschten Wörter" geht so einfach nicht.



  • Also ich bin zwar auch nur blutiger C++ Anfänger, aber ich glaube Screenshot+OCR ist ganz schönes rumgeschuster und macht glaube ich kein vernünftiger Programmierer um da ran zu kommen. Aber wenn schon so etwas in Betracht gezogen wird, dann kann man auch darüber nachdenken das ganze wie folgt zu lösen:

    1. Maus automatisch mittig im Browserfenster positionieren lassen.
    2. Automatisch links klicken lassen (um Browserfenster anzuwählen)
    3. Automatisch STRG+A drücken lassen
    4. Automatisch STRG+C drücken lassen
    5. Zwischenablage auslesen

    Für die Schritte 1-4 gibt's Vorlagen wie man so etwas simuliert. Für Schritt 5 habe ich glaube auch noch irgendwo ein Schnipsel rumliegen.

    Aber das ist halt wirklich keine schöne Lösung.



  • Wie gesagt, keine endgültige Lösung. Sondern nur zur Übung. Bevor man sich an Browserseiten wagt, macht man erstmal etwas eine Stufe runter.

    Und die wenigsten Übungsaufgaben erfüllen einen praktischen Zweck, deshalb ist diese Überlegung müßig.

    Die simpelste und effektivste Lösung wurde aber schon genannt. Schreibe ein Addon für Chrome.


Log in to reply