Eine Null zu viel -- HasiDog-Videos waeren abgelehnt worden

In KANAELE stand "@hasidog00804". Der Account heisst "@hasidog0804".
Nachgemessen bei TikTok selbst: der richtige hat 65 Follower, der
andere liefert "Couldn't find this account".

Das war nicht kosmetisch. `kanalVonHandle` ordnet ein hochgeladenes
Video ueber genau diesen Text einem Kanal zu. Ein echtes
HasiDog-Video waere mit 403 abgelehnt worden -- und die Begruendung
haette gelautet: "ist keiner deiner Kanaele. Moeglich sind:
@dogfather0804, @hasidog00804, @dogis.modi.gang." Eine Sackgasse, die
zusaetzlich eine Adresse nennt, die es nicht gibt.

WARUM ES KEINE PRUEFUNG GEFUNDEN HAT: pruef-kanalzeile und
pruef-teilen hatten denselben Handle abgeschrieben. Zwei Abschriften
desselben Tippfehlers bestaetigen sich gegenseitig -- beide waren
gruen. Sie leiten ihn jetzt aus KANAELE ab und koennen ihn damit gar
nicht mehr eigenstaendig falsch haben.

Gefunden hat es ein Vergleich: Die oeffentliche Website verlinkt
dieselben Accounts und hatte die richtige Schreibweise. Genau das ist
jetzt Abschnitt 7 von pruef-kanaele -- alle Handles muessen auch
draussen vorkommen, mit Gegenprobe, dass eine falsche Adresse
durchfaellt. Ohne Netz, damit eine Stoerung bei TikTok nicht zu einem
roten Alarm im Haus wird.

Co-Authored-By: Claude Opus 5 <[email protected]>
This commit is contained in:
2026-09-21 11:51:06 +02:00
co-authored by Claude Opus 5
parent 2a6008d699
commit 9a71f3a242
4 changed files with 98 additions and 7 deletions
+69
View File
@@ -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`);
+20 -5
View File
@@ -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");
+8 -1
View File
@@ -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",
+1 -1
View File
@@ -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",