Blog einrichten und sich selbst überlassen, Teil 3 Vollautomatisiertes Blogging per Skript

Von Mirco Lang

Noch immer gilt: Content ist King; und je häufiger und regelmäßiger Inhalte erscheinen, desto besser. Aber wer hat schon die Zeit, täglich zu veröffentlichen? Na klar – ein Skript.

Anbieter zum Thema

Im letzten Teil dieser Artikelserie kommt nun das eigentliche Blogging auf den Tisch.
Im letzten Teil dieser Artikelserie kommt nun das eigentliche Blogging auf den Tisch.
(Bild: Wokandapix / Pixabay )

Zur Serie: In drei Artikeln zum vollautomatischen Blog – in diesem Teil kommt nun endlich das eigentliche Blogging auf den Tisch, in Form eines simplen Flat-File-CMS namens Pico. Die Open-Source-Plattform ist das perfekte System für simple Blogs, insbesondere, wenn per Skript gebloggt werden soll.

Als Flat-File-System benötigt Pico keine Datenbank, Artikel und Blog-Struktur entstehen allein durch die Ordner- und Dateistruktur sowie Header-Angaben in den Dateien selbst. Für die Optik ist im Wesentlichen das PHP-Template-System Twig verantwortlich, das sich durchaus als kleiner Standard etabliert hat; es ist in IDEs wie Eclipse und NetBeans sowie in Editoren wie Notepad++, Atom oder Visual Studio Code verfügbar – und in vim und emacs natürlich ebenso.

Die Formatierung von Artikeln geschieht mit der omnipräsenten Auszeichnungssprache Markdown, dank derer ein grafischer Editor völlig überflüssig ist. Und zu guter Letzt spricht auch die Lizenzierung für Pico, da die freigiebige MIT-Lizenz auch die einfache Verwendung in kommerziellen, proprietären Produkten ermöglicht.

Pico einrichten

Die Installation von Pico entspricht derer anderer Flat-File-CMS: Einfach in das Webverzeichnis entpacken – fertig! Relevant für das weitere Vorgehen sind die folgenden Ordner:

  • config
  • content
  • assets
  • themes

Die Grundkonfiguration findet in „config“ statt. Hier genügt es zunächst, die mitgelieferte Beispielkonfiguration von config.yml.template zu aktivieren, indem man sie schlicht nach config.yml kopiert. Die einzig wichtige Einstellung darin ist der Seitenname. Einstellungen für abweichende Pfade, Plug-in- und Theme-spezifische Angaben oder andere Datumsformate werden für unser Projekt nicht benötigt.

Im Ordner „content“ erwarten Sie zurecht die eigentlichen Inhalte. Es genügt, in diesem Ordner oder einem Ordner darunter Markdown-Dateien abzulegen (/testing/foobar.md), die einen Pico-Header beinhalten und schon sind sie beispielsweise über …

www.example.com/?/testing/foobar
… erreichbar (das Fragezeichen gehört zur Syntax).

Etwaige Bilder oder sonstige Medien landen standardmäßig im Ordner „assets“. Im Themes-Ordner befindet sich standardmäßig nur ein Theme. Und hier wird gleich das Blogging eingerichtet, das kann Pico standardmäßig nämlich nicht!

Blogging aktivieren

Blogging mit Pico sieht nach der Einrichtung so aus: Blog-Beiträge werden im Ordner /content/blog/ gespeichert und landen automatisch auf der Übersichtsseite, die über „www.example.com/?/blog“ aufgerufen wird. Dort werden alle Blog-Beiträge chronologisch gelistet und verlinkt, ganz schlicht mit Titel, Veröffentlichungsdatum und gegebenenfalls einer Beschreibung – eben ein Blog in der Urform.

Blogging lässt sich in drei Schritten aktivieren:

  • 1. Erstellen Sie einen Ordner „blog“ im Ordner „content“.
  • 2. Erstellen Sie eine Datei „/content/blog/index.md“ und fügen Sie dem Header die Zeile „Template: blog-index“ hinzu (wobei der Template-Name frei gewählt werden kann).
  • 3. Kopieren Sie die Theme-Datei „/themes/default/index.twig“ nach „/themes/default/blog-index.twig“ – oder wie auch immer Sie das Template oben benannt haben. In diese Datei fügen Sie direkt vor die Zeile „{{ content }}“ (standardmäßig ca. Zeile 58) folgende Schleife ein:
{% for page in pages("blog")|sort_by("time")|reverse if not page.hidden %}
   <div class="post">
      <h3><a href="{{ base_url }}?blog/{{ page.title }}">{{ page.title }}</a></h3>
      <p class="date">{{ page.date_formatted }}</p>
      <p class="excerpt">{{ page.description }}</p>
   </div>
{% endfor %}

Die Schleife liest schlicht alle Dateien/Beiträge im Blog-Ordner ein und erstellt daraus eine chronologische Liste. Damit steht das Pico-Blog – noch aber ohne jeglichen Inhalt.

Inhalte produzieren

Um Pico nun mit Blog-Beiträgen zu füllen, müssen nun zwei Dinge geschehen:

  • Upload von MD-Datei und Gnuplot-Grafik in die passenden Ordner.

Ein Pico-Beitrag sieht in der einfachsten Form wie folgt aus:

---
Title: Testbeitrag
---
Hallo Welt

Der YAML-Header wird mit drei Bindestrichen abgetrennt und kann diverse Tags beinhalten, die Sie in der kurz gehaltenen Pico-CMS-Dokumentation finden. Der eigentliche Content ist dann reines Markdown.

Für das Testprojekt sollen Beiträge lediglich einen Titel und das Gnuplot-Bild beinhalten. Der Übersicht halber hier aufgeteilt in zwei separate echo-Anweisungen, hier zunächst für Header und Titel:

echo -e \
'---\n\
Title: exnews_'$(date +%Y_%m_%d)'\n\
Date: '$(date +%Y-%m-%d)'\n\
Robots: noindex,nofollow\n\
Template: index\n\
---\n\n\
## Schlagworte auf example.com vom' $(date +%d.%m.%Y) '\n\n'\
> exnews_$(date +%Y_%m_%d).md

Im Header sehen Sie zunächst den Title-Tag bestehend aus der Vorsilbe „exnews_“ und dem aktuellen Datum in der Form „2021_10_04“. Das so formatierte Datum wird dann auch im Date-Tag verwendet, im Fließtext-Titel, bei der Benennung der Datei und auch das Gnuplot-Bild wurde bereits mit diesem Datum benannt.

Durch die Verwendung des Datums in Dateinamen und Titeln umgeht man sehr einfach Probleme mit Benennungen – beliebig erweiterbar etwa durch genaue Zeitstempel oder dynamische Vorsilben. Der Fließtext nach den zwei Umbrüchen (\n\n) besteht lediglich aus einer Zeile mit einer Überschrift der Ebene 2 (##) in der Form „Schlagworte auf example.com vom 4.10.2021“.

Gespeichert wird alles in einer Datei „exnews_2021_10_04.md“. Nun fehlt noch die Gnuplot-Grafik, die über eine zweite echo-Anweisung hinzugefügt wird:

Jetzt Newsletter abonnieren

Täglich die wichtigsten Infos zu Softwareentwicklung und DevOps

Mit Klick auf „Newsletter abonnieren“ erkläre ich mich mit der Verarbeitung und Nutzung meiner Daten gemäß Einwilligungserklärung (bitte aufklappen für Details) einverstanden und akzeptiere die Nutzungsbedingungen. Weitere Informationen finde ich in unserer Datenschutzerklärung.

Aufklappen für Details zu Ihrer Einwilligung
echo -e \
'\n\n\
![Image Title](%assets_url%/exnews_'$(date +%Y_%m_%d)'.png)'\
>> exnews_$(date +%Y_%m_%d).md

Hier wird lediglich mittels Markdown ein Bild eingebaut („![Bild-Titel](meinbild.jpg)“) und per „>>“ an die bestehende Datei „exnews_2021_10_04.md“ angefügt. Hier sehen Sie auch eine interne Pico-Variable: %assets_url% steht systemweit als Alias für den Assets-Ordner zur Verfügung.

Damit ist der Beitrag fertig, Bild und Markdown-Datei müssen lediglich noch in die Ordner „assets“ und „/content/blog“ kopiert werden. Um es etwas praktischer zu gestalten, hier ein Upload auf einen echten Server via sshpass, über das dem scp-Kommando ein Passwort mitgegeben werden kann, um den scp-Upload ohne Interaktion und ohne Schlüssel durchführen zu können:

sshpass -p "meinpasswort" scp exnews_$(date +%Y_%m_%d).md ich@example.com:www/exnews/contentsshpass -p "meinpasswort" scp exnews_$(date +%Y_%m_%d).png ich@example.com:www/exnews/assets

Danach existieren in Pico somit folgende Dateien:

  • .../assets/exnews_2021_10_04.png
  • .../content/blog/exnews_2021_10_04.md

Dieser Eintrag landet dann dank der oben eingefügten for-Schleife im Theme-Twig im Blog-Index, also unter „www.example.com/?/blog/“; direkt aufrufbar ist er über „www.example.com/?/blog/exnews_2021_10_04“.

Auto-Blog-Übersicht

Damit ist das Auto-Blogging-Projekt im Grunde abgeschlossen. Hier nochmal die Übersicht:

1. Crawling und Text-Mining mit Bash-Standards

Rohtexte von Seiten einer Website werden automatisch heruntergeladen und soweit verarbeitet, dass eine Liste mit Häufigkeiten vorgegebener Begriffe entsteht.

2. Graphing mit Gnuplot

Aus der Liste wird automatisch über ein Gnuplot-Skript eine PNG-Datei mit Balkendiagramm gerendert.

3. Blogging mit Pico

Die Gnuplot-Grafik wird zusammen mit einem YAML-Header und zusätzlichem Text per echo-Befehl in eine Markdown-Datei eingefügt. Anschließend werden Grafiken und Markdown-Datei via scp in die Pico-Ordnerstruktur auf dem Server hochgeladen.

Alles automatisch: Term-Statistik, Balkendiagramm, Blog-Beitrag, Publishing
Alles automatisch: Term-Statistik, Balkendiagramm, Blog-Beitrag, Publishing
(Bild: Lang)

In einer echten Pico-Installation sieht das Ganze dann so aus, wie im vorangestellten Bild. Für ein komplett selbstlaufendes Blog könnten Sie die Skripte nun etwa so anpassen, dass beispielsweise jeden Montag die Beiträge der vergangenen Woche analysiert und die Ergebnisse gebloggt werden – und das Ganze dann schlicht via Cron-Job automatisch triggern.

Als Zusammenfassung hier nochmal alle Dateien des Auto-Blog-Systems – optimierungsbedürftig, aber funktionierend:

  • Hauptskript: vogel.sh
  • Gnuplog-Skript: vogel.gnu
  • Term-Liste: vogelterms
  • Generierte Liste für Gnuplot: vogel.dat
  • Generierter Beitrag für Pico: Dev_2021_10_04.md

Die Dateien finden sich allesamt unter dem Artikel in der Demo.zip als Download gehängt. Wenn Sie die Quelltexte aufmerksam durchlesen, sehen Sie noch ein kleines Gimmick als Idee für Optimierungen: Das Hauptskript lässt sich wie folgt aufrufen:

bash vogel.sh Oktober

Das Argument „Oktober“ wird vom Gnuplot-Skript einfach in den Titel eingebaut – Argumente könnten aber auch für Datum, Seitenbereich und URLs genutzt werden, um ein Skript tatsächlich universell auf diverse Seiten und/oder Zeiträume loszulassen. Gleiches gilt für mehrere Such-Term-Listen und so weiter. Um eine Variable aus dem Bash-Skript im Gnuplog-Skript nutzen zu können, muss sie exportiert werden – hier die Zeilen aus dem Bash-Skript:


# Plotting image
datamonth=$1
export datamonth

Und die Verwendung im Gnuplot-Skript:


month = system("echo $datamonth")

Artikelfiles und Artikellinks

Datei: demo.zip

(ID:47835430)