fix(kontakte): LinkedIn-Foto nur aus der Vorschau, klarere Meldung

Anlass: Bei einem Kontakt kam das Foto, beim naechsten nicht. Der Vergleich
der beiden Profilseiten zeigt warum - das zweite Profil liefert als
og:image nur LinkedIns Ersatzgrafik (static.licdn.com/aero-v1/sc/h/...),
weil die Sichtbarkeit des Fotos auf "Meine Kontakte" steht. Angemeldet
sieht man es, der Abruf hier ist es nicht.

Zwei Konsequenzen:

* Die Rueckfallebene "erste media.licdn.com-Adresse im Quelltext" faellt
  weg. Dieselbe Seite enthaelt 24 solcher Adressen: Firmenlogos,
  Beitragsbilder und die Fotos der "aehnlichen Profile" am Rand. Nur die
  Open-Graph-Vorschau gehoert nachweislich zum aufgerufenen Profil -
  alles andere haette irgendwann ein fremdes Gesicht an einen Kontakt
  gehaengt.
* Die Meldung sagt jetzt, was wirklich los ist: "nur fuer Kontakte
  sichtbar oder es gibt keines" statt "hat kein eigenes Foto". Von
  aussen sind die beiden Faelle nicht unterscheidbar.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
Sascha Wolf
2026-09-10 00:30:30 +02:00
co-authored by Claude Opus 5
parent 0a2cf52e8a
commit 46983a7e2c
5 changed files with 68 additions and 24 deletions
+16 -4
View File
@@ -71,12 +71,24 @@ check(
extractImageUrl('<meta name="twitter:image" content="https://media.licdn.com/dms/image/t">') ===
'https://media.licdn.com/dms/image/t'
);
check('Seite ohne Vorschau liefert null', extractImageUrl('<html><body>nichts</body></html>') === null);
/*
* Wichtig: ohne og:image wird NICHT im uebrigen Quelltext gesucht. Eine
* Profilseite ist voller fremder Bilder - Firmenlogos, Beitragsbilder, Fotos
* der "aehnlichen Profile". Eines davon zu nehmen, haenge dem Kontakt das
* Gesicht einer fremden Person an.
*/
check(
'Ohne Vorschau greift die Suche im Quelltext',
extractImageUrl('var x = "https://media.licdn.com/dms/image/v2/zzz/profile-displayphoto";') ===
'https://media.licdn.com/dms/image/v2/zzz/profile-displayphoto'
'Fremde Bilder im Quelltext werden nicht genommen',
extractImageUrl(
'<html><body><img src="https://media.licdn.com/dms/image/v2/xy/profile-displayphoto-shrink_400_400/0/1"></body></html>'
) === null
);
check(
'Ersatzgrafik von static.licdn.com kommt als solche zurueck',
extractImageUrl('<meta property="og:image" content="https://static.licdn.com/aero-v1/sc/h/abc">') ===
'https://static.licdn.com/aero-v1/sc/h/abc'
);
check('Seite ohne Bild liefert null', extractImageUrl('<html><body>nichts</body></html>') === null);
console.log(failures === 0 ? '\nAlle Pruefungen bestanden.' : `\n${failures} Pruefung(en) fehlgeschlagen.`);
process.exit(failures === 0 ? 0 : 1);