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 *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