Nachrichten lesen mit RSS Web Feeds

Autor : Gerd Raudenbusch
Stand : 31.08.2024

Inhalt

Warum brauche ich das ?

Im heutigen Informationszeitalter ist eine einzige Quelle zur Bildung einer kompetenten Meinung nicht mehr ausreichend, und es ist notwendig, sich bei interessanten Themen um umfassende Informationen zu bemühen.

Selbst da, wo tiefere Recherchen zu einem Thema gar nicht notwendig sind, ist es doch immer erhellend, gewissenhaft und sinnvoll, zumindest verschiedene Perspektiven zu der Sache zu kennen, sobald man darüber kompetent bescheidwissen oder gar mitreden will.

Es ist aber sehr mühsam, jedesmal alle möglichen Seiten im Internet Browser oder in verschiedenen Apps abzuklappern.

Aber: Das geht auch viel einfacher!

Wie geht's ?

Das Abonnieren von Web Feeds mit einem entsprechenden Reader ist die wohl professionellste Methode, um dauerhaft Informations- und Nachrichtenquellen gebündelt zu verfolgen, und umfassend informiert zu bleiben. Die dafür am häufigsten eingesetzten Formate und Protokolle sind RSS und Atom.

ALLE großen, modernen Portale aus allen Bereichen, bieten Web Feeds meist völlig kostenlos an, ebenso wie die meisten privaten Blogs, die sich speziellen Themenbereichen widmen. Das liegt mitunter auch daran, daß die von Medien und Bloggern am häufigsten verwendeten Content Management Systeme (z. B. Wordpress) dies fast durchgehend unterstützen. Auch die Feeds von Social Media Kanälen können gewöhnlich als Web Feeds abonniert werden.

Die Verwendung der gewöhnlichen Nachrichten-Apps der einzelnen Nachrichten-Quellen wird völlig obsolet. Indem man stattdessen deren Web Feeds in seinem Reader abonniert, haben die Nachrichten-Quellen oft weniger Möglichkeiten, die eigenen Interessen auszuspähen.

Gelesene Artikel oder Ordner markiert man als solche, damit sie nach gewisser Vorhaltezeit vom Reader automatisch gelöscht werden, oder aber man markiert sie als Favorit, um sie zu behalten.

Die wesentlichen Vorteile im Überblick

Mit Web Feeds kann man also ganz einfach und auch anonym seine eigene, persönlich komponierte, digitale Tageszeitung lesen.

Man braucht dazu nur einen Feed-Reader, mit dem man Feeds im Web abonnieren kann.

Feed-Reader

Die Feeds werden in folgender Struktur verwaltet :

Feed-Quellen

Um die Web-Links zu den Web Feeds, wie :

zu finden...

...sucht man am besten auf den entsprechenden Webseiten selbst, und hält Ausschau nach diesem Logo.

Den gefundenen Weblink fügt man anschließend dem Feed-Reader seiner Wahl zu.

Es gibt viele Anbieter, welche die RSS Bridge oder vergleichbare Dienste hosten, um Feeds zu erstellen für Webseiten, die nicht selbst Feeds anbieten.

Weiterhin bietet die unter keinen Umständen unnötig zu würdigende Suchmaschine bing von Microsoft leider die herausragende Option, ihre Ergebnisse mit dem Anhängen von format=rss als RSS-Feed auszugeben und so auch die Nachrichten zu Suchbegriffen mit einem Feed-Reader abonnierbar zu machem, z. B. https://bing.com/news/search?q=Politik&format=rss. Die persönlichen Daten, die Microsoft als Big Data Unternehmen dabei sammeln könnte, dürften sich auf die typischen Merkmale eines Webbrowsers ohne Cookies beschränken.

Web Feeds für die eigene Webseite

Im Prinzip handelt es sich bei Webfeeds um eine Datei mit bestimmtem Format, die auf dem Webserver liegt und von den Benutzern beobachtet wird. Wie erwähnt, erstellen die meisten modernen Content Management Systeme die Feeds automatsch. Wer selbst auf der eigenen Webseite ein RSS-Feed zuzufügen möchte, muss einfach eine zusätzliche XML-Datei zu der Seite auf den Webserver zu legen und pflegen, die von außen erreicht werden kann. Wenn man beispielsweise auf seinem Webserver, der unter https://beispiel.de erreichbar ist, neben die Datei index.html die Datei feed.rss legt, dann können die Leser der Seite diese in ihrem Feed-Reader unter der URL https://beispiel.de/feed.rss abonnieren. Die XML-Datei hat die folgende, einfache Struktur :

<?xml version="1.0" encoding="utf-8"?>

<rss version="2.0">

<channel>
<title>Titel des Feeds</title>
<link>URL der Webpräsenz</link>
<description>Kurze Beschreibung des Feeds</description>
<language>Sprache des Feeds (z. B. "de-de")</language>
<copyright>Autor des Feeds</copyright>
<pubDate>Erstellungsdatum("Tue, 8 Jul 2008 2:43:19")</pubDate>
<image>
<url>URL einer einzubindenden Grafik</url>
<title>Bildtitel</title>
<link>URL, mit der das Bild verknüpft ist</link>
</image>

<item>
<title>Titel des Eintrags</title>
<description>Kurze Zusammenfassung des Eintrags</description>
<link>Link zum vollständigen Eintrag</link>
<author>Autor des Artikels, E-Mail-Adresse</author>
<guid>Eindeutige Identifikation des Eintrages</guid>
<pubDate>Datum des Items</pubDate>
</item>

<item>
 ...
</item>

</channel>

</rss>

Man kann bereits im HTML-Code der Startseite der Domain auf den RSS-Feed verweisen :

<link rel="alternate" type="application/rss+xml" title="Titel Deines Feeds" href="https://deine-domain.de/deine-feed.xml" />

Dadurch ist die Eingabe des Domainnamens in den Feed-Reader ausreichend, damit der zugehörige Feed dazu gefunden werden kann.

Auf einem Linux-basierten System kann man seine Feed-Dateien z. B. mit folgendem Shellskript aktualisieren :

#!/bin/bash
#
# This script creates RSS Feed Files
# for webpages and adds new feed entries.
#
# @author: gerd@raudenbusch.net
#

if test -t 1; then
        ncolors=$(tput colors)
        if test -n "$ncolors" && test $ncolors -ge 8; then
                BLACK=`tput setaf 0`
		RED=`tput setaf 1`
		GREEN=`tput setaf 2`
		YELLOW=`tput setaf 3`
		BLUE=`tput setaf 4`
		MAGENTA=`tput setaf 5`
		CYAN=`tput setaf 6`
		WHITE=`tput setaf 7`

		BOLD=`tput bold`
		RESET=`tput sgr0`
        fi
fi

log () {
        >&2 echo "${1}"
}

printInfo () {
    log "${BOLD}${WHITE}${1}${RESET}"
}

printWarning () {
    log "${BOLD}${YELLOW}${1}${RESET}"
}

printSuccess () {
    log "${BOLD}${GREEN}${1}${RESET}"
}

printError () {
    log "${BOLD}${RED}${1}${RESET}"
}

createFeed () {
    local TITLE="${1}"
    local DOMAIN="${2}"
    local DESCRIPTION="${3}"
    local FILENAME="${4}"
    cat << EOF >${FILENAME}
<rss version="2.0">
	<channel>
		<title>${TITLE}</title>
		<link>${DOMAIN}</link>
		<description>${DESCRIPTION}</description>
		<!-- ENTRIES -->
	</channel>
</rss>
EOF
    printSuccess "Success !"
}

addEntry () {
    local TITLE="${1}"
    local LINK="${2}"
    local DESCRIPTION="${3}"
    local FILENAME="${4}"
    feedentry="\\\t<item>\n\t\t<title>${TITLE}</title>\n\t\t<link>${LINK}</link>\n\t\t<description>${DESCRIPTION}</description>\n\t</item>\n"
    sed "/<\!-- ENTRIES -->/a ${feedentry}" -i ${FILENAME}
    if [ "$?" == "0" ]; then
	    printSuccess "Success !"
    else
	    printError "Failed !"
    fi
}

printUsage () {
    printInfo "RSS Feed writer"
    log "This script can create RSS feed XML files and add new entries to them."
    log "The XML file has to be placed on the webserver."
    log "Users will be able to follow with a feed reader."
    log ""
    printInfo "Usage :"
    log ""
    printInfo "create <options> <RSS feed output XML filename>"
    log "creates a new RSS feed XML file."
    log "   -t or --title        : The title of the webpage"
    log "   -D or --domain       : The domain of the feed channel"
    log "   -d or --description  : The description of the feed channel"
    log ""
    printInfo "add <option> <RSS feed output XML filename>"
    log "adds a new entry to an existing RSS feed XML file."
    log "    -t or --title        : The title of the feed entry"
    log "    -l or --link         : The URL to be announced by the new feed entry"
    log "    -d or --description  : The description of the feed entry"
}



# Evaluate command line options
POSITIONAL_ARGS=()
while [[ $# -gt 0 ]]; do
  case $1 in
    -h|--help)
      printUsage
      exit 1
      ;;
    -D|--domain)
      DOMAIN="${2}"
      shift # past argument
      shift # past value
      ;;      
    -t|--title)
      TITLE="${2}"      
      shift # past argument
      shift # past value
      ;;
    -l|--link)
      LINK="${2}"
      shift # past argument
      shift # past value
      ;;
    -d|--description)
      DESCRIPTION="${2}"
      shift # past argument
      shift # past value
      ;;
    -*|--*)
      log "Unknown option $1"
      (return 0 2>/dev/null) && return 1 || exit 1
      ;;
    *)
      POSITIONAL_ARGS+=("$1") # save positional arg
      shift # past argument
      ;;
  esac
done
set -- "${POSITIONAL_ARGS[@]}" # restore positional parameters

# Process operations
case ${1} in
     create)
        if [ "${TITLE}" == "" ]; then
            printError "Title is mandatory !"
            printUsage
            (return 0 2>/dev/null) && return 1 || exit 1
        elif [ "${DOMAIN}" == "" ]; then
            printError "Domain is mandatory !"
            printUsage
            (return 0 2>/dev/null) && return 1 || exit 1
        elif [ "${DESCRIPTION}" == "" ]; then
            printError "Domain is mandatory !"
            printUsage
            (return 0 2>/dev/null) && return 1 || exit 1
        elif [ "${2}" == "" ]; then
            printError "RSS XML output file name is mandatory !"
            printUsage
            (return 0 2>/dev/null) && return 1 || exit 1
        elif [ -f ${2} ]; then
            printError "File ${FILENAME} already exists!"
        else
            createFeed "${TITLE}" "${DOMAIN}" "${DESCRIPTION}" "${2}" 
        fi
      ;;
     add)
        if [ "${TITLE}" == "" ]; then
            printError "Title of feed entry is mandatory !"
            printUsage
            (return 0 2>/dev/null) && return 1 || exit 1
        elif [ "${LINK}" == "" ]; then
            printError "Link of webpage to be feeded is mandatory !"
            printUsage
            (return 0 2>/dev/null) && return 1 || exit 1
        elif [ "${DESCRIPTION}" == "" ]; then
            printError "Description of feed entry mandatory !"
            printUsage
            (return 0 2>/dev/null) && return 1 || exit 1
        elif [ "${2}" == "" ]; then
            printError "File name of RSS feed XML file is mandatory !"
            printUsage
            (return 0 2>/dev/null) && return 1 || exit 1
        elif [ ! -f ${2} ]; then
            printError "File ${FILENAME} does not exist !"
        else
            addEntry "${TITLE}" "${LINK}" "${DESCRIPTION}" "${2}"
        fi             
      ;;
    *)
      printUsage
	  (return 0 2>/dev/null) && return 1 || exit 1
      ;;
esac
(return 0 2>/dev/null) && return 0 || exit 0


Zurück zur Hauptseite