Filipes Kachel ging nicht. Der Grund war nicht TikTok, sondern EIN WORT
in unserer Kennung.
DAS WORT HEISST "Mobile"
Gestern hiess es hier noch "17 KB, keine Daten, von jedem Weg aus".
Nachgemessen mit einem Keksglas und fuenf Kennungen:
Desktop-Kennung, ohne Kekse 17 KB keine Daten
Desktop-Kennung, MIT Keksen 17 KB keine Daten
Android-Kennung, ohne Kekse 939 KB DATEN
iPhone-Kennung, mit Keksen 939 KB DATEN
TikTok-App, mit Keksen 42 KB keine Daten
TikTok baut die Seite serverseitig NUR fuer die Handyfassung auf; am
Rechner laedt sie sich mit JavaScript nach. Kekse, Sprache und
Accept spielen keine Rolle -- einzeln nachgemessen.
UND WIR BLEIBEN EHRLICH: Unser Name und unsere Adresse stehen hinten
an der Kennung. Nachgemessen liefert TikTok damit dieselben 939 KB.
Es kostet also nichts. Die Pruefung verlangt jetzt BEIDES: "Mobile"
(sonst kommt nichts an) und unseren Namen (sonst ist es eine
Verkleidung).
ZWEI VORLAGEN, NICHT EINE
Filipes Einladung fuehrt zu "LIVE Glow Up" -- und die ist ganz
anders gebaut als "Gipfelstuermer". Ihr fehlen gleich DREI
Bausteine, auf denen der Bauplan beruht: live_rule_introduction,
live_reward_introduction, live_campaign_intro. Stattdessen hat sie
live_task_group (Aufgaben als Reiter) und live_secondary_gift.
Der Leser kann jetzt beide. Gemessen:
Gipfelstuermer 5 Aufgaben, 5 Geschenke, 6 Preisgruppen, 0 Hinweise
LIVE Glow Up 2 Aufgaben, 1 Geschenk, 0 Preise, 2 Hinweise
Die doppelten Reiter fallen weg: Die Vorlage legt je Reiter zwei
Eintraege an (Creator und Zuschauer), und zweimal derselbe Haken
waere ein Haken an zwei Stellen.
"HAT KEINE" IST ETWAS ANDERES ALS "KONNTE NICHT GELESEN WERDEN"
Ohne diese Unterscheidung haette LIVE Glow Up vier Hinweise gemeldet,
die alle nach einem Fehler klingen -- obwohl schlicht nichts da ist.
Das eine schickt jemanden suchen, das andere sagt ihm, dass nichts
fehlt. Entsprechend haengt der Regeltext auch kein pauschales "Bitte
nachtragen" mehr an: Jeder Hinweis sagt selbst, ob etwas zu tun ist.
FUENFTE PRUEFDATEI
kampagne-aufgabengruppe.html.br -- die echte Seite von LIVE Glow Up,
unveraendert, unangemeldet geholt (uid "0", anchor_id leer),
147 KB gepackt, sofort zurueckgelesen und Byte fuer Byte verglichen.
Ohne sie koennte der Leser eine Vorlage und faellt bei der naechsten
Einladung um.
GEPRUEFT
pruef-kampagne-lesen 112 -> 128 (eigener Abschnitt fuer die zweite
Vorlage, mit Gegenprobe: Gipfelstuermer meldet weiterhin nichts) ·
pruef-kampagne 102 -> 103 · pruef-struktur, pruef-zeichen, pruef-video
Co-Authored-By: Claude Opus 5 <[email protected]>
120 lines
6.1 KiB
Markdown
120 lines
6.1 KiB
Markdown
# 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 fünf 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 fünf 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-aufgabengruppe.html.br` | LIVE Glow Up | 7690927903777262344 | läuft | **keiner** |
|
|
|
|
### `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.** Die drei vollständigen Seiten vom
|
|
07.10.2026 haben alle sechs Preisgruppen (die vierte, „LIVE Glow Up“, hat gar
|
|
keine Preisliste — das ist etwas anderes als eine leere). 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.
|
|
|
|
### `kampagne-aufgabengruppe.html.br` — die ZWEITE Vorlage
|
|
|
|
Unverändert, am 07.10.2026 geholt. Diese Seite beweist, dass es **nicht
|
|
eine** Bauart gibt: Ihr fehlen `live_rule_introduction`,
|
|
`live_reward_introduction` und `live_campaign_intro` — also genau die
|
|
drei Bausteine, auf denen Gipfelstürmer beruht. Stattdessen hat sie
|
|
`live_task_group` (Aufgaben als Reiter) und `live_secondary_gift`.
|
|
|
|
Ohne sie hätte der Leser eine Vorlage gekonnt und bei der nächsten
|
|
Einladung vier Hinweise gemeldet, die alle „konnte nicht gelesen
|
|
werden" sagten — obwohl schlicht nichts da ist. Genau daran unterscheidet
|
|
er jetzt: **„hat keine Preisliste"** ist etwas anderes als **„konnte
|
|
nicht gelesen werden"**. Das eine schickt jemanden suchen, das andere
|
|
sagt ihm, dass nichts fehlt.
|
|
|
|
Sie wurde mit der Kennung geholt, die auch im Betrieb gilt — eine
|
|
Handy-Kennung mit unserem Namen dahinter. Mit einer Desktop-Kennung
|
|
kommen nur 17 KB ohne Daten; gemessen am selben Tag auf sieben Wegen.
|
|
|
|
## 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`.
|