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:
@@ -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`);
|
||||
|
||||
@@ -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");
|
||||
|
||||
@@ -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
@@ -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",
|
||||
|
||||
Reference in New Issue
Block a user