TikTok liefert die Kampagnenseite nicht mehr aus -- und der Kasten sagt es jetzt
Filipe hat die Kachel benutzt und bekam "Ging nicht." Im Protokoll des
Servers stand der Grund; im Kasten stand er nicht. Beides ist jetzt
behoben -- und beim Nachmessen kam ein groesserer Befund heraus.
DER BEFUND: DIE SEITE KOMMT LEER AN
Gemessen am 07.10.2026, von zwei Leitungen und auf fuenf Wegen:
ehrliche Kennung, accept text/html 17 KB, keine Daten
ehrliche Kennung + Browser-Accept 17 KB, keine Daten
Browser-Kennung 17 KB, keine Daten
Browser-Kennung + Accept + Sprache 17 KB, keine Daten
ganz ohne eigene Koepfe 17 KB, keine Daten
zweiter Abruf MIT Keksen 17 KB, keine Daten
echtes Chromium (headless) 17 KB, LEERE Seite
Titel "Campaign", leerer Koerper, zwei Skripte (tiktok-environment,
gfdatav1). Dasselbe fuer Filipes neue Kampagne UND fuer
"Gipfelstuermer", von meinem Rechner wie vom Server.
Damit traegt eine Annahme des Bauplans nicht: "HTML 1.100.298
Zeichen, serverseitig gerendert". Die 1,1-MB-Seiten, an denen der
Bauplan entwickelt wurde, stammen aus einer echten Browsersitzung.
Auf einen gewoehnlichen Abruf baut TikTok die Seite nicht mehr auf.
Ob das voruebergehend ist (Modern.js kann SSR abstufen -- die
gespeicherten Seiten tragen "renderLevel":2) oder bleibt, laesst
sich an einem Abend nicht sagen. Der Weg bleibt deshalb eingebaut:
Kommt die Seite wieder mit Daten, laeuft alles sofort.
WAS DER MENSCH DAVOR JETZT SIEHT
Der Leser unterscheidet HUELLE von UMBAU. Das sind zwei sehr
verschiedene Lagen: Bei einem Umbau ist etwas zu reparieren, bei
einer Huelle kann niemand etwas machen -- und soll das hoeren statt
zu suchen. Die Meldung sagt die Groesse, sagt "das liegt nicht an
dir und nicht am Link" und nennt den naechsten Schritt.
"umgebaut" steht dort ausdruecklich NICHT mehr: Dieser Satz haette
ihn auf die falsche Suche geschickt.
UND NIE WIEDER "Ging nicht."
Der Verlust der Meldung liess sich NICHT nachstellen -- 403 und 502
kommen beide woertlich im Kasten an, jetzt in bild-kampagne
gemessen (25 Messungen). Ein Ersatztext, der nichts sagt, ist aber
auch ohne bekannte Ursache falsch: Er laesst raten. Er nennt jetzt
die Nummer der Antwort und sagt, wo mehr steht.
GEPRUEFT
pruef-kampagne-lesen 108 -> 112 (Huelle und Umbau getrennt, mit
Gegenprobe: eine fremde Seite gilt NICHT als Huelle) ·
pruef-kampagne 99 -> 102 (fuenf verschiedene Saetze fuer fuenf
Faelle) · bild-kampagne 20 -> 25 (zeigt der Kasten den Grund?) ·
pruef-struktur, pruef-eventkarte 94, pruef-agentur 62,
pruef-css-klassen 39, pruef-zeichen 8, pruef-deutsche-texte 12
Co-Authored-By: Claude Opus 5 <[email protected]>
This commit is contained in:
@@ -254,6 +254,89 @@ await messen(412, 915, "Auf dem Handy, haeufigste Android-Breite");
|
||||
`keine Bewegung bei prefers-reduced-motion (${ruht.animation}, ${ruht.dauer})`);
|
||||
}
|
||||
|
||||
/* ---- SAGT DER KASTEN, WARUM ES NICHT GING? -------------------------
|
||||
|
||||
Am 07.10.2026 stand bei Filipe im Kasten "Ging nicht." -- der
|
||||
Ersatztext. Im Protokoll des Servers stand dagegen der genaue
|
||||
Grund. Zwischen beiden liegt die ganze Frage, ob jemand weiss, was
|
||||
zu tun ist.
|
||||
|
||||
GEMESSEN WIRD HIER DER ECHTE WEG: Auf einer Pruefadresse hat die
|
||||
Sitzung kein Haus, die Route lehnt deshalb mit 403 und einem
|
||||
ganzen deutschen Satz ab. Genau dieser Satz muss im Kasten
|
||||
stehen -- nicht "Ging nicht.".
|
||||
|
||||
Das ist kein Umweg: Jede Fehlermeldung dieser Route geht
|
||||
denselben Weg (res.status(...).json({ fehler })). Wer hier
|
||||
ankommt, kommt ueberall an. */
|
||||
{
|
||||
const ctx = await browser.newContext({ viewport: { width: 1280, height: 900 } });
|
||||
const seite = await ctx.newPage();
|
||||
await anmelden(seite, "admin", "CODE-DOGI-0001");
|
||||
await seite.goto(BASIS + "/workspace/bereich.html?b=agentur", { waitUntil: "networkidle" });
|
||||
await seite.waitForTimeout(1400);
|
||||
|
||||
await seite.fill("#kampagne-text",
|
||||
"Dein Creator Network lädt dich ein: https://www.tiktok.com/t/ZSbqPsFa8/");
|
||||
await seite.$eval("#kampagne-holen", (b) => b.click());
|
||||
/* Auf eine ANTWORT warten, nicht auf eine feste Zeit: Ein fester
|
||||
Wert waere hier dieselbe Rechnung von gestern wie ueberall. */
|
||||
await seite.waitForFunction(
|
||||
() => document.getElementById("kampagne-sagt").textContent.trim() !== "Wird geholt …",
|
||||
{ timeout: 25000 }).catch(() => {});
|
||||
|
||||
const gezeigt = await seite.evaluate(() => ({
|
||||
text: document.getElementById("kampagne-sagt").textContent.trim(),
|
||||
knopfFrei: !document.getElementById("kampagne-holen").disabled,
|
||||
}));
|
||||
console.log("\n=== Was der Kasten nach einem Fehlschlag sagt ===");
|
||||
console.log(" gezeigt: " + JSON.stringify(gezeigt.text));
|
||||
|
||||
ok(gezeigt.text !== "Ging nicht.",
|
||||
"der Kasten zeigt NICHT den Ersatztext");
|
||||
ok(gezeigt.text.length > 25 && /[.!]$/.test(gezeigt.text),
|
||||
`sondern einen ganzen Satz (${gezeigt.text.length} Zeichen)`);
|
||||
ok(/Agentur|workspace\.dogfather/i.test(gezeigt.text),
|
||||
"der den Grund nennt und sagt, was zu tun ist");
|
||||
ok(gezeigt.knopfFrei, "und der Knopf ist wieder frei");
|
||||
|
||||
/* UND DER FALL, DER FILIPE GETROFFEN HAT: HTTP 502.
|
||||
|
||||
Der 403 oben beweist, dass der Weg grundsaetzlich traegt. Die
|
||||
Meldung, die bei ihm verschwand, war aber ein 502 -- und ein
|
||||
502 kommt in diesem Haus durch einen anderen Flaschenhals
|
||||
(Vorbau, Dienst). Deshalb wird er hier EINZELN nachgestellt:
|
||||
window.holen gibt eine fertige 502-Antwort zurueck, genau so,
|
||||
wie der Server sie schickt. Zeigt der Kasten dann den Satz,
|
||||
liegt es nicht am Browsercode.
|
||||
|
||||
Nachgestellt wird die ANTWORT, nicht der Fehler -- damit misst
|
||||
diese Zeile genau eine Sache und nicht nebenbei TikTok. */
|
||||
await seite.evaluate(() => {
|
||||
const echt = window.holen;
|
||||
window.holen = async (pfad, o) => {
|
||||
if (!String(pfad).includes("/kampagne/einlesen")) return echt(pfad, o);
|
||||
return new Response(JSON.stringify({
|
||||
fehler: "Die Seite konnte nicht gelesen werden: "
|
||||
+ "__MODERN_ROUTER_DATA__ fehlt in der Seite. "
|
||||
+ "Vermutlich hat TikTok die Seite umgebaut.",
|
||||
}), { status: 502, headers: { "Content-Type": "application/json" } });
|
||||
};
|
||||
});
|
||||
await seite.fill("#kampagne-text", "https://www.tiktok.com/t/ZSbqPsFa8/");
|
||||
await seite.$eval("#kampagne-holen", (b) => b.click());
|
||||
await seite.waitForFunction(
|
||||
() => document.getElementById("kampagne-sagt").textContent.trim() !== "Wird geholt …",
|
||||
{ timeout: 20000 }).catch(() => {});
|
||||
const beiFuenfNullZwei = (await seite.evaluate(
|
||||
() => document.getElementById("kampagne-sagt").textContent.trim()));
|
||||
console.log(" bei HTTP 502: " + JSON.stringify(beiFuenfNullZwei));
|
||||
ok(beiFuenfNullZwei !== "Ging nicht."
|
||||
&& /MODERN_ROUTER_DATA/.test(beiFuenfNullZwei),
|
||||
"auch ein 502 zeigt den Satz des Servers, nicht den Ersatztext");
|
||||
await ctx.close();
|
||||
}
|
||||
|
||||
/* ---- Und ein Creator sieht den Kasten gar nicht --------------------- */
|
||||
{
|
||||
const ctx = await browser.newContext({ viewport: { width: 1280, height: 900 } });
|
||||
|
||||
Reference in New Issue
Block a user