diff --git a/server/pruef-kanaele.mjs b/server/pruef-kanaele.mjs index 94297139..7bdce2b5 100644 --- a/server/pruef-kanaele.mjs +++ b/server/pruef-kanaele.mjs @@ -271,6 +271,75 @@ melde("=== 6. Nicht nur nachgeplappert ==="); .map((v) => `${v.kanal ?? "leer"}:${v.n}`).join(" ")})`); } +/* ======================================================================= + 7. STIMMEN DIE ADRESSEN MIT DER OEFFENTLICHEN SEITE UEBEREIN? + ======================================================================= */ +melde(""); +melde("=== 7. Dieselben Accounts wie draussen ==="); +{ + /* WARUM DIESER ABSCHNITT AM 21.09.2026 DAZUKAM. + + In KANAELE stand "@hasidog00804" -- eine Null zu viel. Nachgemessen + bei TikTok selbst: "@hasidog0804" hat 65 Follower, "@hasidog00804" + liefert "Couldn't find this account". Der Tippfehler war nicht + kosmetisch: `kanalVonHandle` ordnet ein hochgeladenes Video ueber + genau diesen Text einem Kanal zu. Ein echtes HasiDog-Video waere + abgelehnt worden -- mit dem Satz "ist keiner deiner Kanaele. + Moeglich sind: ..." und einer Adresse darin, die es nicht gibt. + Eine Sackgasse, die auch noch falsch erklaert, wo sie hinfuehrt. + + GEFUNDEN HAT ES KEINE PRUEFUNG, sondern ein Vergleich: Die + oeffentliche Website verlinkt dieselben Accounts, und dort stand + die richtige Schreibweise. Zwei Orte im selben Haus, die dasselbe + behaupten und sich widersprechen -- das ist messbar, ohne irgendwen + im Netz zu fragen. + + WARUM NICHT BEI TIKTOK NACHFRAGEN: Das waere die direktere Frage, + haengt aber an einem fremden Dienst. Faellt er aus, wird aus einer + Stoerung ein roter Alarm (der Fall vom 04.09. in der Buchhaltung). + Der Vergleich im Haus braucht kein Netz und kann deshalb immer + antworten. */ + const { readFileSync, readdirSync } = await import("node:fs"); + const { fileURLToPath } = await import("node:url"); + const { KANAELE } = await import("./workspace.js"); + const wurzel = fileURLToPath(new URL("../", import.meta.url)); + + const draussen = new Set(); + let gelesen = 0; + for (const f of readdirSync(wurzel)) { + if (!f.endsWith(".html")) continue; + gelesen++; + const text = readFileSync(wurzel + f, "utf8"); + for (const m of text.matchAll(/tiktok\.com\/@([A-Za-z0-9._-]+)/g)) { + draussen.add("@" + m[1].toLowerCase()); + } + } + + /* DIE ZAHL GEHOERT IN DIE BEDINGUNG. Faende die Suche gar nichts -- + weil die Seiten umgezogen sind oder anders verlinken --, waere + "keiner fehlt" wahr und vollkommen wertlos. */ + ok(gelesen > 10 && draussen.size >= 3, + `auf ${gelesen} oeffentlichen Seiten stehen ${draussen.size} TikTok-Adressen`); + + const fehlend = KANAELE.filter((k) => !draussen.has(k.handle.toLowerCase())); + ok(fehlend.length === 0, + fehlend.length + ? `DIESE ADRESSEN KENNT DIE OEFFENTLICHE SEITE NICHT: ` + + fehlend.map((k) => `${k.name} ${k.handle}`).join(", ") + + ` -- eine davon ist falsch geschrieben, und Videos von diesem ` + + `Account wuerden abgelehnt` + : `alle ${KANAELE.length} Accounts stehen genauso auch draussen ` + + `(${KANAELE.map((k) => k.handle).join(", ")})`); + + /* GEGENPROBE: Kann dieser Vergleich ueberhaupt "nicht in Ordnung" + sagen? Eine erfundene Adresse muss durchfallen -- sonst wuerde + oben auch der echte Tippfehler durchrutschen. */ + ok(!draussen.has("@hasidog00804"), + "Gegenprobe: die falsch geschriebene Adresse findet sich draussen NICHT"); + ok(!draussen.has("@diesen-account-gibt-es-nicht"), + "Gegenprobe: eine erfundene Adresse wuerde auffallen"); +} + /* ------------------------------------------------------------------- */ melde(""); melde(`${geprueft} Pruefungen, ${fehler} Fehler`); diff --git a/server/pruef-kanalzeile.mjs b/server/pruef-kanalzeile.mjs index 97a998ba..2691b451 100644 --- a/server/pruef-kanalzeile.mjs +++ b/server/pruef-kanalzeile.mjs @@ -34,6 +34,20 @@ process.env.SITE_ACCESS_SECRET = "lokaler-test"; process.env.SITE_PUBLIC_LAUNCH_AT = "2020-01-01T00:00:00+01:00"; process.env.TIKTOK_OEMBED_BASIS = `http://127.0.0.1:${TIKTOK}/oembed`; +/* DIE HANDLES WERDEN ABGELEITET, NICHT ABGESCHRIEBEN (21.09.2026). + + Hier standen sie als Text im Pruefcode -- und einer davon war falsch: + "@hasidog00804" mit einer Null zu viel. Er stand genauso falsch in + KANAELE, weshalb die Pruefung gruen war: Zwei Abschriften desselben + Tippfehlers bestaetigen sich gegenseitig. Nachgemessen bei TikTok + selbst gibt es nur "@hasidog0804" (65 Follower); die andere Adresse + liefert "Couldn't find this account". + + Jetzt kommen sie aus KANAELE. Damit kann diese Datei den Wert gar + nicht mehr eigenstaendig falsch haben -- sie misst den echten. */ +const { KANAELE } = await import("./workspace.js"); +const HANDLES = KANAELE.map((k) => k.handle.replace(/^@/, "")); + const PNG = Buffer.from( "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mP8z8BQDwAEhQGAhKmMIQAAAABJRU5ErkJggg==", "base64"); @@ -43,9 +57,10 @@ const tiktok = createServer((q, a) => { const ziel = u.searchParams.get("url") || ""; const wer = (ziel.match(/@([^/?]+)/) || [])[1] || ""; if (!wer) { a.writeHead(404); a.end("{}"); return; } - const titel = { "dogfather0804": "Casper klaut die Fernbedienung 😄", - "hasidog00804": "Casper schläft im Wäschekorb", - "dogis.modi.gang": "Der Chat entscheidet: Horror oder Koop?" }[wer] || "Video"; + const TITEL = ["Casper klaut die Fernbedienung 😄", + "Casper schläft im Wäschekorb", + "Der Chat entscheidet: Horror oder Koop?"]; + const titel = TITEL[HANDLES.indexOf(wer)] || "Video"; a.writeHead(200, { "content-type": "application/json" }); a.end(JSON.stringify({ version: "1.0", type: "video", title: titel, @@ -141,8 +156,8 @@ ok(!(await zeileDa()), "bei einem einzigen Kanal steht dort KEINE Filterzeile"); /* ---- 2. Drei Kanäle -------------------------------------------------- */ console.log("\n=== 2. Mit drei Kanaelen ==="); -console.log(" Video 2:", await video("hasidog00804", "102")); -console.log(" Video 3:", await video("dogis.modi.gang", "103")); +console.log(" Video 2:", await video(HANDLES[1], "102")); +console.log(" Video 3:", await video(HANDLES[2], "103")); await seite.reload({ waitUntil: "networkidle" }); await seite.waitForTimeout(1800); ok(await zeileDa(), "sobald drei Kanaele da sind, erscheint sie"); diff --git a/server/pruef-teilen.mjs b/server/pruef-teilen.mjs index 046b5d4a..cb3cae11 100644 --- a/server/pruef-teilen.mjs +++ b/server/pruef-teilen.mjs @@ -39,6 +39,13 @@ process.env.SITE_ACCESS_SECRET = "lokaler-test"; process.env.SITE_PUBLIC_LAUNCH_AT = "2020-01-01T00:00:00+01:00"; process.env.TIKTOK_OEMBED_BASIS = `http://127.0.0.1:${TIKTOK}/oembed`; +/* Der Handle wird abgeleitet, nicht abgeschrieben (21.09.2026) -- hier + stand "@hasidog00804" mit einer Null zu viel, derselbe Tippfehler wie + in KANAELE. Zwei gleiche Abschriften bestaetigen sich gegenseitig und + merken nichts. */ +const { KANAELE } = await import("./workspace.js"); +const HANDLES = KANAELE.map((k) => k.handle.replace(/^@/, "")); + const PNG = Buffer.from( "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mP8z8BQDwAEhQGAhKmMIQAAAABJRU5ErkJggg==", "base64"); @@ -233,7 +240,7 @@ melde(""); melde("=== 5. Wohin ist eine Frage ==="); { const vorher = await zahlIm("treff"); - await oeffne(`url=${encodeURIComponent(`http://127.0.0.1:${TIKTOK}/@hasidog00804/video/99`)}`); + await oeffne(`url=${encodeURIComponent(`http://127.0.0.1:${TIKTOK}/@${HANDLES[1]}/video/99`)}`); await seite.click('.tl-brett[data-brett="treff"]'); await seite.waitForTimeout(300); const gewaehlt = await seite.$$eval(".tl-brett", diff --git a/server/workspace.js b/server/workspace.js index 4595959f..4930582f 100644 --- a/server/workspace.js +++ b/server/workspace.js @@ -1762,7 +1762,7 @@ export const KANAELE = [ { wert: "dogfather", name: "DogFather", handle: "@dogfather0804", text: "Der Hauptkanal. Die Livestreams und alles, was unmittelbar " + "daran hängt." }, - { wert: "hasidog", name: "HasiDog", handle: "@hasidog00804", + { wert: "hasidog", name: "HasiDog", handle: "@hasidog0804", text: "Der zweite Account — eigene Zuschauer, eigener Ton. Was hier " + "läuft, ist nicht einfach dasselbe noch einmal." }, { wert: "clips", name: "DogFather Clips", handle: "@dogis.modi.gang",