Kapitel 10/Free Rhohtext.md aktualisiert
This commit is contained in:
@@ -1023,4 +1023,217 @@ Er prüft das Feld `postAllowed`, das aus dem vorherigen Code-Node stammt.
|
|||||||
- Der *True*-Pfad wird nur ausgeführt, wenn der Stream innerhalb der nächsten 30 Minuten startet **und** noch kein Post gesendet wurde.
|
- Der *True*-Pfad wird nur ausgeführt, wenn der Stream innerhalb der nächsten 30 Minuten startet **und** noch kein Post gesendet wurde.
|
||||||
- Der *False*-Pfad kann später genutzt werden, um Debug-Logs oder Benachrichtigungen zu schreiben (z. B. „Kein Post nötig“).
|
- Der *False*-Pfad kann später genutzt werden, um Debug-Logs oder Benachrichtigungen zu schreiben (z. B. „Kein Post nötig“).
|
||||||
|
|
||||||
👉 Screenshot geeignet: n8n – IF-Node mit `{{$json.postAllowed}} is true (Boolean)`
|
👉 Screenshot geeignet: n8n – IF-Node mit `{{$json.postAllowed}} is true (Boolean)`
|
||||||
|
|
||||||
|
### 6.13 – Nextcloud-Node: Datei herunterladen
|
||||||
|
|
||||||
|
**Zweck:**
|
||||||
|
Dieser Node lädt die Datei `posts.txt` aus deiner Nextcloud in n8n, damit sie anschließend lokal verarbeitet werden kann.
|
||||||
|
|
||||||
|
**Node-Typ:** `Nextcloud`
|
||||||
|
**Name:** `posts.txt herunterladen`
|
||||||
|
|
||||||
|
👉 Screenshot geeignet: n8n – Nextcloud-Node mit ausgefüllten Feldern
|
||||||
|
|
||||||
|
#### Einstellungen
|
||||||
|
|
||||||
|
| Feld | Eingabe |
|
||||||
|
|------|----------|
|
||||||
|
| **Credential to connect with** | `Nextcloud` *(aus Schritt 5.9)* |
|
||||||
|
| **Resource** | `File` |
|
||||||
|
| **Operation** | `Download` |
|
||||||
|
| **File Path** | `/n8n/posts.txt` *(Pfad in deiner Nextcloud anpassen)* |
|
||||||
|
| **Put Output File in Field** | `data` |
|
||||||
|
|
||||||
|
[!NOTE]
|
||||||
|
Die Datei `posts.txt` sollte in deiner Nextcloud vorhanden sein und **eine Textzeile pro Post** enthalten, z. B.:
|
||||||
|
|
||||||
|
```
|
||||||
|
Gleich geht’s los – der Stream startet in Kürze!
|
||||||
|
Heute wieder live – seid dabei!
|
||||||
|
Stream incoming! Noch ein paar Minuten bis Start.
|
||||||
|
```
|
||||||
|
|
||||||
|
👉 Screenshot geeignet: Beispielansicht der Datei `posts.txt` in Nextcloud
|
||||||
|
|
||||||
|
Nach der Ausführung enthält der Node die Datei als **binäre Ausgabe** im Feld `data`.
|
||||||
|
Diese wird im nächsten Schritt lokal gespeichert, damit sie gelesen werden kann.
|
||||||
|
|
||||||
|
### 6.14 – Code-Node: Zufälligen Post auswählen
|
||||||
|
|
||||||
|
**Zweck:**
|
||||||
|
Dieser Node liest die Datei `posts.txt` (aus dem Binary-Feld des Nextcloud-Nodes) und wählt zufällig eine Zeile als Posting-Text.
|
||||||
|
Wenn die Datei fehlt oder leer ist, nutzt der Workflow eine kleine Standardliste mit vorbereiteten Posts als Fallback.
|
||||||
|
|
||||||
|
**Node-Typ:** `Code`
|
||||||
|
**Name:** `Posttext auswählen`
|
||||||
|
|
||||||
|
👉 Screenshot geeignet: n8n – geöffneter Code-Node mit Script
|
||||||
|
|
||||||
|
#### Code-Inhalt
|
||||||
|
|
||||||
|
```
|
||||||
|
/**
|
||||||
|
* Liest posts.txt direkt aus dem Binary-Feld "data" (vom Nextcloud-Node)
|
||||||
|
* und wählt zufällig eine Zeile aus.
|
||||||
|
* Wenn keine Datei oder kein Inhalt vorhanden ist, wird ein Fallback-Text aus einer Liste genutzt.
|
||||||
|
* Zusätzlich wird der Startzeitpunkt des Streams in lokaler Zeit (MEZ/MESZ) angehängt.
|
||||||
|
*/
|
||||||
|
|
||||||
|
let content = '';
|
||||||
|
try {
|
||||||
|
const buffer = items[0].binary?.data?.data;
|
||||||
|
if (buffer) {
|
||||||
|
content = Buffer.from(buffer, 'base64').toString('utf8');
|
||||||
|
}
|
||||||
|
} catch (err) {
|
||||||
|
content = '';
|
||||||
|
}
|
||||||
|
|
||||||
|
// Inhalt in Zeilen aufteilen
|
||||||
|
const lines = content.split('\n').map(l => l.trim()).filter(Boolean);
|
||||||
|
|
||||||
|
// Fallback-Texte
|
||||||
|
const fallbackPosts = [
|
||||||
|
'Der Stream startet gleich – holt euch Snacks und seid dabei! 🎮',
|
||||||
|
'Bald geht’s los – heute wird wieder gezockt! 🔥',
|
||||||
|
'Noch kurz durchatmen – gleich geht’s live auf Sendung! 🚀',
|
||||||
|
'In wenigen Minuten live – Kaffee bereit? ☕',
|
||||||
|
'Los geht’s – der Chat wartet schon auf euch! 💬',
|
||||||
|
'Heute gibt’s wieder gute Laune und Gaming pur! 💜'
|
||||||
|
];
|
||||||
|
|
||||||
|
// Textauswahl
|
||||||
|
let postText;
|
||||||
|
if (lines.length > 0) {
|
||||||
|
const randomIndex = Math.floor(Math.random() * lines.length);
|
||||||
|
postText = lines[randomIndex];
|
||||||
|
} else {
|
||||||
|
const randomIndex = Math.floor(Math.random() * fallbackPosts.length);
|
||||||
|
postText = fallbackPosts[randomIndex];
|
||||||
|
}
|
||||||
|
|
||||||
|
// Startzeitpunkt des Streams aus vorherigem Node lesen (startIso)
|
||||||
|
let startIso = items[0].json?.startIso || null;
|
||||||
|
let startLocal = '';
|
||||||
|
|
||||||
|
if (startIso) {
|
||||||
|
try {
|
||||||
|
const date = new Date(startIso);
|
||||||
|
const formatter = new Intl.DateTimeFormat('de-DE', {
|
||||||
|
weekday: 'short',
|
||||||
|
hour: '2-digit',
|
||||||
|
minute: '2-digit',
|
||||||
|
timeZone: 'Europe/Berlin',
|
||||||
|
hour12: false
|
||||||
|
});
|
||||||
|
startLocal = formatter.format(date);
|
||||||
|
} catch (err) {
|
||||||
|
startLocal = '';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (startLocal) {
|
||||||
|
postText = `${postText} 🎬 Start: ${startLocal}`;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Weitergabe an nächste Nodes
|
||||||
|
return [{
|
||||||
|
json: {
|
||||||
|
...items[0].json,
|
||||||
|
postText
|
||||||
|
}
|
||||||
|
}];
|
||||||
|
```
|
||||||
|
|
||||||
|
👉 Screenshot geeignet: Node-Ausgabe mit Feld `postText` und zufälligem Text
|
||||||
|
|
||||||
|
[!NOTE]
|
||||||
|
Wenn die Datei `posts.txt` fehlt oder leer ist, sorgt die integrierte Fallback-Liste dafür, dass trotzdem ein sinnvoller Post generiert wird.
|
||||||
|
Damit ist der Workflow robust und funktioniert zuverlässig auch ohne manuelle Pflege der Datei.
|
||||||
|
|
||||||
|
### 6.15 – X-Post veröffentlichen
|
||||||
|
|
||||||
|
**Zweck:**
|
||||||
|
Dieser Node sendet den zuvor generierten Text (`postText`) automatisch als Tweet über das verknüpfte X-Konto.
|
||||||
|
|
||||||
|
**Node-Typ:** `X`
|
||||||
|
**Name:** `X – Post veröffentlichen`
|
||||||
|
|
||||||
|
👉 Screenshot geeignet: n8n – X-Node mit ausgefülltem Formular für Tweet-Erstellung
|
||||||
|
|
||||||
|
#### Einstellungen
|
||||||
|
|
||||||
|
| Feld | Eingabe |
|
||||||
|
|------|----------|
|
||||||
|
| **Credential to connect with** | `X account` *(aus Schritt 5.8)* |
|
||||||
|
| **Resource** | `Tweet` |
|
||||||
|
| **Operation** | `Create` |
|
||||||
|
| **Text** | `{{ $json.postText }}` |
|
||||||
|
|
||||||
|
Beispielausgabe:
|
||||||
|
```
|
||||||
|
Stream incoming! Noch ein paar Minuten bis Start 🎬 Start: Mi., 18:00
|
||||||
|
```
|
||||||
|
|
||||||
|
👉 Screenshot geeignet: n8n – Erfolgreicher Tweet-Node mit grünem Ausgabestatus
|
||||||
|
|
||||||
|
[!NOTE]
|
||||||
|
Dieser Node nutzt direkt die X-Integration von n8n und benötigt keine manuelle API-Konfiguration.
|
||||||
|
Im **Free-Plan** sind bis zu **17 Posts pro 24 Stunden** erlaubt.
|
||||||
|
|
||||||
|
[!TIP]
|
||||||
|
Wenn der Node mit `401 Unauthorized` fehlschlägt:
|
||||||
|
- Öffne die X-Credentials in n8n und **verbinde den Account erneut**,
|
||||||
|
- prüfe, ob die App im X Developer Dashboard **„Read and Write“** aktiviert hat.
|
||||||
|
Danach sollte der Node wieder erfolgreich posten.
|
||||||
|
|
||||||
|
### 6.16 – Lokale Datei löschen (Workflow-Speicher bereinigen)
|
||||||
|
|
||||||
|
**Zweck:**
|
||||||
|
Dieser Node entfernt die lokal zwischengespeicherte Datei `posts.txt` aus dem Workflow-Speicher.
|
||||||
|
Damit wird verhindert, dass beim nächsten Lauf alte Daten erneut verwendet werden.
|
||||||
|
|
||||||
|
**Node-Typ:** `Code`
|
||||||
|
**Name:** `Temporäre Datei entfernen`
|
||||||
|
|
||||||
|
👉 Screenshot geeignet: n8n – Code Node mit Löschskript
|
||||||
|
|
||||||
|
#### Einstellungen
|
||||||
|
|
||||||
|
**Code:**
|
||||||
|
```
|
||||||
|
return items.map(item => {
|
||||||
|
if (item.binary && item.binary.data) {
|
||||||
|
delete item.binary.data; // Entfernt die heruntergeladene Datei aus dem Speicher
|
||||||
|
}
|
||||||
|
return item;
|
||||||
|
});
|
||||||
|
```
|
||||||
|
|
||||||
|
[!NOTE]
|
||||||
|
- Dieser Node löscht **nicht die Datei auf der Festplatte oder in Nextcloud**,
|
||||||
|
sondern nur die temporäre Kopie, die n8n im Speicher hält.
|
||||||
|
- Beim nächsten Workflow-Lauf wird die Datei automatisch neu aus Nextcloud geladen.
|
||||||
|
- Diese Methode funktioniert stabil in jeder n8n-Version, ohne zusätzliche Module.
|
||||||
|
|
||||||
|
### 6.17 – Gesamter Workflow als JSON-Import
|
||||||
|
|
||||||
|
Zum Abschluss stellen wir den gesamten Workflow als **importierbare JSON-Datei** bereit.
|
||||||
|
Diese Datei enthält alle Nodes, Verbindungen und Einstellungen – fertig vorbereitet für den direkten Import in n8n.
|
||||||
|
|
||||||
|
👉 Screenshot geeignet: n8n – Menüpunkt „Import from File“
|
||||||
|
|
||||||
|
1) Öffne n8n im Browser.
|
||||||
|
2) Klicke oben rechts auf das **Drei-Punkte-Menü** → **Import from File**.
|
||||||
|
3) Wähle die bereitgestellte JSON-Datei (`stream_schedule_workflow.json`) aus.
|
||||||
|
4) Nach dem Import prüfe, ob alle **Credentials** korrekt zugewiesen sind:
|
||||||
|
- Twitch
|
||||||
|
- X (Twitter)
|
||||||
|
- Nextcloud
|
||||||
|
|
||||||
|
[!TIP]
|
||||||
|
Sollten Credentials fehlen oder fehlerhaft sein, öffne den jeweiligen Node, wähle in der Liste das passende Credential neu aus und speichere den Node anschließend.
|
||||||
|
|
||||||
|
Nach erfolgreichem Import ist der Workflow sofort einsatzbereit und kann manuell gestartet oder automatisch durch den Cron-Trigger ausgelöst werden.
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user