# Gespeicherte TikTok-Kampagnenseiten — Herkunft und Eingriffe Diese Dateien sind die Eingabe für `server/pruef-kampagne-lesen.mjs`. Sie liegen hier, damit das Auslesen einer Kampagnenseite **ohne Netz, ohne Server und ohne Datenbank** geprüft werden kann. Eine Prüfung, die dafür das echte TikTok braucht, misst fremde Verfügbarkeit statt unseren Code und wird irgendwann rot, ohne dass etwas kaputt ist. ## Woher sie kommen Alle vier wurden am **07.10.2026** von `www.tiktok.com` geholt, **unangemeldet**. Das ist nachprüfbar in den Dateien selbst: globalData.userInfo = { "uid": "0" } env.anchor_id, env.user_id = "" Es steckt also **keine Person** darin — kein Name, kein Handle, keine Sitzung, kein Keks. Die 6 Treffer für „nickname" sind Einstellungsnamen (`hide_user_nickname`) und ein Platzhalter (`{nickname_or_handlename}`), keine echte Person. Deshalb dürfen sie hier liegen. ## Warum gepackt (Brotli) und nicht als Klartext Eine Seite ist rund 1 MB; gepackt sind es 150 KB. Das Zurückpacken (`brotliDecompressSync`, in Node eingebaut, keine neue Abhängigkeit) wurde beim Anlegen jeder Datei **sofort gegengeprüft**: Der Inhalt kommt Byte für Byte identisch zurück. Eine Ablage, die man nie zurückgespielt hat, ist eine Hoffnung. Die Prüfung hält zusätzlich die SHA-256-Summe des **entpackten** Inhalts fest. Ändert sich eine Datei, wird die Prüfung rot und nennt die neue Summe — das ist Absicht: Eine Prüfdatei, die sich still ändert, macht jedes grüne Häkchen darüber wertlos. ## Die vier Dateien | Datei | Kampagne | `activity_id` | Zustand | Eingriff | |---|---|---|---|---| | `kampagne-gipfelstuermer.html.br` | Gipfelstürmer | 7691493175936699143 | läuft (`activity_status` 15) | **keiner** | | `kampagne-beendet.html.br` | Sonne im Gepäck | 7657456323453405959 | beendet (16) | **keiner** | | `kampagne-ohne-preise.html.br` | Stern Stunde | 7670899782609996552 | beendet (16) | Preisbaustein entfernt, siehe unten | | `kampagne-kaputt.html` | — | — | — | vollständig selbst geschrieben | ### `kampagne-gipfelstuermer.html.br` — der vollständige Fall Unverändert. Alles, was eine Kachel braucht, ist darin: Titel, Zeitraum, Zone, 5 Aufgaben, 5 Kampagnengeschenke, 6 Preisgruppen, 2 Klapptexte (Ligen und Teilnahmebedingungen), Banner, Länder. Sie ist außerdem der Beleg für den wichtigsten Satz des Lesers: **Im Wörterbuch stehen 135 Einträge, im Seitengerüst nur 134 Platzhalter.** Der Überzählige lautet „1 schenkende Person = 100 Punkte" und gehört zu einer früheren Fassung der Kampagne. Wer das Wörterbuch durchliest statt im Gerüst nachzuschlagen, schreibt diese Regel in die Kachel, und das Team richtet seinen Stream danach aus. ### `kampagne-beendet.html.br` — der Fall, den der Bauplan nicht kannte Unverändert. Diese Seite liefert `activityInfo.ac_schema_with_interaction_rules` **nicht mehr** — bei einer beendeten Kampagne ist das Feld weg. Das Gerüst steht nur noch unter `value.schema`, und die Bausteine heißen dort `…_rep_remove`. Ohne diese Datei wäre der Rückfallweg ungeprüft, und abgelaufene Kampagnen ließen sich nicht nachtragen. ### `kampagne-ohne-preise.html.br` — der einzige Eingriff **Es gibt keine echte Kampagne ohne Preise.** Alle vier am 07.10.2026 geholten Seiten haben sechs Preisgruppen. Dieser Fall muss deshalb hergestellt werden, und das ist hier offen dokumentiert, statt in einem Skript zu verschwinden: Grundlage ist die unveränderte Seite von **Stern Stunde**. Daraus wurde in `loaderData.home_page.COSMIC_D_K.value` jeder Baustein entfernt, dessen `type` `live_reward_introduction` enthält — **zwei** Stück, einer in `activityInfo.ac_schema_with_interaction_rules`, einer in `value.schema`. Danach wurde das Datenpaket neu geschrieben (`JSON.stringify`); die Seite um das Paket herum ist unverändert. Entfernt wurde der **ganze Baustein**, nicht nur seine Liste. Das ist der härtere Fall: Dann fehlt auch die Überschrift, und der Leser kann nicht einmal sagen, wie der Abschnitt hieß. Der mildere Fall (Baustein da, Liste leer) wird in der Prüfung zusätzlich im Speicher aus Gipfelstürmer hergestellt — beide müssen denselben Hinweis erzeugen. ### `kampagne-kaputt.html` — vollständig selbst geschrieben 369 Bytes, kein echter Abzug. Eine Seite, die aussieht wie eine TikTok-Seite und das Datenpaket **nicht** enthält. Sie steht für „TikTok hat die Seite umgebaut" und muss den dritten Ausgang auslösen: `KampagneUnlesbar` mit `art: "aufbau"` und einem Grund, der `__MODERN_ROUTER_DATA__` nennt — nicht „Fehler 502". Sie enthält bewusst ein **anderes** JSON-Skript (`__NEXT_DATA__`) und eine Zeile, in der `activityId` vorkommt. Wer „das erste Skript" oder „irgendwo die Nummer" nimmt, wird hier grün und im Betrieb falsch. ## Keine Testdaten im Live-System Diese Dateien werden ausschließlich gelesen. Sie wandern nie in eine Datenbank, und es entsteht aus ihnen nie eine Kachel auf `workspace.dogfather-universe.com`.