13. Mai 2010
Vor einigen Tagen hatte ich bereits darueber berichtet, dass mir bei Facebook die Anwendungen ungeheuer auf die Nerven gehen, die sich ungefragt in den eigenen Neuigkeiten einmisten. Jede Anwendung muss einzeln blockiert werden um diese fuer die Zukunft zu ignoieren. Facebook scheint daran auch nichts aendern zu wollen.
Nun bin ich vor kurzem ueber eine Erweiterung fuer Chromium/Google Chrome gestossen, die sich Personalized Web nennt. Diese Applikation erlaubt es den Quelltext von Webseiten in Chromium zu veraendern. Sie bietet auch die Eigenschaften eigenen Code auszufuehren. Perfekt dachte ich mir und machte mich an die Arbeit mir etwas zu ueberlegen um mich der laestigen Facebook Anwendungen zu entledigen.
Die Theorie
Schaut man in den Facebook-Quelltext und analysiert diesen, stellt man fest, dass alle Eintraege die auf der Pinnwand (egal ob die eigene oder bei anderen) gemacht werden das Div-Elternelement mit der ID profile_minifeed besitzen, d.h. direkte Kind-Elemente davon sind. Weiterhin macht es uns Facebook gluecklicherweise einfach die "boesen" Eintraege, welche ueber Applikationen gemacht wurden, von den "guten", naemlich den normalen Eintraegen, zu unterscheiden. Facebook verwendet ein Attribut namens data-ft in dem, sofern der Eintrag von einer Applikation stammt, ein app_id vorkommt. Ein Beispiel eines solchen Elements koennte so aussehen:
HTML:
-
<div id="div_story_499681885_101495166563750" data-ft="{"src":"9","sty":"63","actrs":"1152153362","fbid":"121006254577135","s_obj":"9","s_edge":"1","s_prnt":"9","app_id":"65496494327"}">(...)</div>
Das Tolle daran ist, dass nur die von Applikationen erstellten Eintraege den app_id-String aufweisen. Die Idee ist nun mittels einem Script, welches clientseitig ausgefuehrt wird, also via JavaScript, die Kinder zu loeschen auf die dieses Kriterium zutrifft und damit die nervigen Eintraege zu verstecken.
Die Praxis
In der Praxis braucht es erstmal die Moeglichkeit beim Laden der Facebook-Seite ein Skript auszufuehren, welches die oben genannte Aufgabe uebernimmt. Dazu verwende ich die oben vorgestellte Erweiterung fuer Chromium, mittels der es moeglich ist den Quellcode von Webseiten on-the-fly zu manipulieren. Mittels diesem schiebe ich Facebook das folgende Script unter:
JavaScript:
-
function removeAppEntries() {
-
feed = document.getElementById("profile_minifeed");
-
if (feed === null) {
-
feed = document.getElementById("home_stream");
-
}
-
if (feed === null) return;
-
-
childs = feed.childNodes;
-
for (i=0; i<childs.length; i++) {
-
node = childs.item(i).getAttributeNode("data-ft");
-
if (node !== null) {
-
var re = new RegExp("app_id");
-
var m = re.exec(node.nodeValue);
-
if (m != null) {
-
feed.removeChild(feed.childNodes.item(i));
-
i--; // decrease i, because we removed one element
-
}
-
}
-
}
-
}
-
-
var _timer = setInterval(function() {removeAppEntries();}, 500);
Dieser Code muss unter "Add JavaScript" eingefuegt werden. Die Match-Url fuer das Script lautet ^https?://www.facebook.com/.
Alles in allem sollten eure gemachten Einstellungen dann so aussehen (auf das Bild klicken um es zu vergroessern):
In der letzten Zeile des Codes wird ein Timer gesetzt, der alle 500ms das Script aufruft. Da Facebook sehr viel Inhalte dynamisch nachlaed (AJAX ist hier das Stichwort) ist es nicht moeglich den Code beispielsweise beim onload-Event des Body-Tags aufzurufen, da dieser dann nur einmal ausgefuehrt wird und beim Nachladen von Code via AJAX nicht ausgefuehrt werden wuerde. Vielleicht hat jemand von euch noch eine andere Idee als das mit einem Timer zu realisieren, aber mir ist keine eingefallen. Da das Script aber sowieso sehr schlank ist macht es eigentlich auch nichts aus dieses ueber einen Timer alle halbe Sekunde aufzurufen. Sollte das Script euren Rechner dennoch zu sehr auslasten, dann koennt ihr diesen Wert jederzeit erhoehen.
Bitte beachtet auch, dass das Script unmittelbar ALLE Eintraege die von Applikationen gemacht wurden versteckt. Alle meint hier wirklich alle, d.h. es gibt keine Whitelist oder aehnliches. Solltet ihr also auch nur eine Applikation nutzen und deren Eintraege sehen wollen, dann lasst die Finger von dem Script.
So und das war dann auch schon das ganze Hexenwerk. Mittels diesen wenigen Zeilen Code werden nun alle Applikations-Postings versteckt. Aetsch, Facebook.