Abstract-Loader für Heises Newsticker

Inhaltsverzeichnis

 

1. Vorwort Inhalt

NewsTicker mit AbstractLoader NewsTicker ohne AbstractLoader Und schon wieder ist es an der Zeit, Heise ein bißchen zu pimpen. Genervt von all den reißerischen Überschriften, die sich nach Klick als wenig mehr denn Werbeträger und eben Klickfänger herausstellen, wird es höchste Eisenbahn, sich vorab einen genaueren Blick über den Inhalt zu verschaffen. Heise selbst bietet dafür schon die besten Voraussetzungen, haben sie doch seit einigen Monaten bereits selbst über jeden Artikel einen sogenannten „Anreißtext“ gesetzt. Wäre doch ein Traum, wenn wir diesen gleich mit jeder Überschrift (außer Apple-haltigem, versteht sich), mitgeliefert bekämen.

Nun, des Coders Hobby besteht unter anderem im Konvertieren von Konjunktiven in Indikative, und blumiger Worte nackte Bedeutung: Gesagt – getan!

2. Script Inhalt

Das hier abgebildete Script kann im GreaseMonkey, oder, da Google inzwischen regelmäßig Userscripte aus dem Chrome entfernt, auch im TamperMonkey installiert werden und verhält sich auf der Domain www.heise.de/newsticker/ wie folgt:

  • Es sucht zunächst alle Headlines und deren Links des aktuellen Tages (erster <ul>…</ul> Block im Newsarchiv).
  • Für jeden gefundenen Link wird der Anrißtext geladen, im localStorage gespeichert und als neues <div></div> -Element unter der Überschrift eingefügt.

Sofern eine Überschrift schon im Localstorage vorhanden ist, wird der Anrißtext dafür natürlich lokal geladen und nicht mehr vom Server. Da bei der Anfrage nur der HTML-Text übertragen wird, sollte sich die Belastung für Heise in Grenzen halten.

Für Paranoide: Der localStorage wird im Privacy-Modus nicht dauerhaft gespeichert. Bei Schließen der Session bzw. des Browsers gehen leider auch die lokal gespeicherten Texte verloren. Darauf sei nur hingewiesen, falls sich jemand wundert.

// ==UserScript==
// @author Christoph Soellner
// @name AbstractLoader for Heise's NewsTicker
// @version 1.0
// @description This tiny script loads the HTML from each newsitem and adds the abstracts on hover to the headlines and to a div element below each headline.
// @match http://www.heise.de/*
// @match https://www.heise.de/*
// ==/UserScript==

String.prototype.hashCode = function() {
	var hash = 0, i, chr, len;
	if (this.length == 0) return hash;
	for (i = 0, len = this.length; i<len; i++) {
		chr   = this.charCodeAt(i);
		hash  = ((hash << 5) - hash) + chr;
		hash |= 0; // Convert to 32bit integer
	}
	return hash;
};

function addTitleToLink(element, titleText) {
	if (!element) return;
	element.title=titleText;
	var teaserNode = document.createElement("div");
	teaserNode.appendChild(document.createTextNode(titleText));
	teaserNode.style.fontSize = "8pt";
	teaserNode.style.lineHeight = "11pt";
	teaserNode.style.color = "#999";
	teaserNode.style.margin = "1pt 0 2pt 0";
	teaserNode.style.padding = "0 0 0 5pt";
	element.parentNode.insertBefore(teaserNode, element.nextSibling);
}

function ajx(url, linkElement, hashForLocalStorage) {
	var xmlhttp;
	var headlineText = linkElement.innerHTML.trim();
	var headlineId   = headlineText.hashCode();
	if (window.XMLHttpRequest) { xmlhttp=new XMLHttpRequest(); } else { xmlhttp=new ActiveXObject("Microsoft.XMLHTTP"); }
	xmlhttp.onreadystatechange = function() {
		if (xmlhttp.readyState!=4 || xmlhttp.status!=200) return;
		if (xmlhttp.responseText=="" || xmlhttp.responseText==undefined || xmlhttp.responseText==null) return;
		var fishAbstractRegex = new RegExp('<p\s+class="meldung_anrisstext"\s*>\s*<strong>\s*(.*?)\s*</strong>\s*</p>');
		var teaserText = fishAbstractRegex.exec(xmlhttp.responseText);
		if (!teaserText) return;
		teaserText = teaserText[1].replace("<strong>", "").replace("</strong>", "").trim();
		if (teaserText=="" || teaserText==undefined || teaserText==null) return;
		localStorage.setItem(headlineId, teaserText);
		addTitleToLink( linkElement, teaserText);
	}
	xmlhttp.open("GET", url, true);
	xmlhttp.send();
}

var archivBox = document.getElementById("archiv_woche");

var currentDayBox = archivBox.getElementsByTagName("ul")[0]; // Today is always the first one 🙂
var currentDayHeadlines = currentDayBox.getElementsByTagName("li");

for (i=0; i<currentDayHeadlines.length; i++) {
	var headlineLinkElement = currentDayHeadlines[i].getElementsByTagName("a")[0];
	var headlineText        = headlineLinkElement.innerHTML.trim();
	var headlineId          = headlineText.hashCode();
	if (localStorage.getItem(headlineId)) continue;
	console.log("Loading from heise for today:" + headlineLinkElement.href +":::"+ headlineId);
	ajx(headlineLinkElement.href, currentDayHeadlines[i].getElementsByTagName("a")[0], headlineId);
}

var allHeadlines = archivBox.getElementsByTagName("li");

for (i=0; i<allHeadlines.length; i++) {
	var headlineLinkElement = allHeadlines[i].getElementsByTagName("a")[0];
	var headlineText        = headlineLinkElement.innerHTML.trim();
	var headlineId          = headlineText.hashCode();
	if (!localStorage.getItem(headlineId)) continue;
	console.log("Loaded from localstorage:" + headlineLinkElement.href +":::"+ headlineId);
	addTitleToLink( headlineLinkElement, localStorage.getItem(headlineId));
}

3. Installation Inhalt

Auch hier gestaltet sie sich äußerst einfach. Man speichere den Inhalt der Textbox oben einfach in einer Datei, die die Endung “.user.js” besitzt, z.B. “newsfilter.user.js”, und ziehe sie per Drap&Drop in das Browserfenster im jeweiligen Installationsmodus (bei Chrome etwa “Tools” → “Erweiterungen”). Nach einer Bestätigung der Rechte (“alles auf heise.de”) werden zukünftig zu den Überschriften auch die Anrißtexte migeliefert.

4. Fazit Inhalt

Auch wenn es für Heise ein Leichtes wäre, das hier nachzurüsten, so gibt’s jetzt eine Q&D(tm)-Möglichkeit, die News vorab etwas weiter zu filtern. Mal schauen, was mir sonst noch so einfällt; eine interessante Möglichkeit wäre, die Anzahl der Kommentare auszuwerten und allen Beiträgen mit geringem Leserinteresse ebenfalls den virtuellen Garaus zu machen. Mal sehen…

Bislang keine Kommentare vorhanden.

Einen Kommentar hinterlassen