Instagram: Scraper raus, Beitraege einzeln ueber oEmbed aufnehmen

bin/instagram-sync.php lieferte seit dem 03.09.2026 bei jedem Lauf "Keine Posts
ermittelbar". Von einem privaten Anschluss gegengeprueft: feed/user und
web_profile_info antworten mit 401 require_login, das Profil-HTML traegt keine
Beitragsdaten mehr, auch /embed/ liefert nur noch eine App-Huelle. Es lag also
nicht an der Server-IP, und der Scraper ist geloescht, damit ihn niemand
wiederbelebt. Graph API (Meta-Konto noetig) und kommerzielle Dienste wurden
verworfen.

Neu: bin/instagram-add.php. --profil liest die Beitragsliste ueber headless
Chrome aus dem gerenderten Profil-DOM (im HTML stehen die Codes nicht) und holt
zu jedem neuen Beitrag Bild, Caption und Datum ueber Instagrams oEmbed-Endpunkt;
das Datum steckt in der media_id. Daneben einzelne URLs, --liste, --entfernen und
--bild als Notfall. Der Shortcode ist Primaerschluessel und damit die komplette
Dedupe-Logik. Die Struktur von data/instagram.json bleibt exakt gleich, deshalb
war an Startseite, News-Feed und Stadionzeitung nichts zu aendern.

Kein Cron mehr: der Job faellt aus public/cron.php, auf dem Webspace gibt es kein
Chrome. Die Chrome-Suche liegt jetzt gemeinsam in bin/chrome-lib.php, genutzt von
bin/logo-build.php und bin/instagram-add.php.

data/instagram.json ist ab jetzt versioniert. Solange sie ignoriert war, lief sie
gegen die versionierten Bilder auseinander: lokal lagen 10 Bilder zu 9 Eintraegen,
drei Beitraege fehlten im Feed, zwei Eintraege hatten kein Bild. Repariert, jetzt
16 Eintraege zu 16 Bildern. bin/preflight.php prueft das in beide Richtungen.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01J9mubC8gtpjtJntbhSJBRS
This commit is contained in:
2026-09-17 11:23:12 +02:00
parent 75fce4f680
commit fef80bf669
25 changed files with 753 additions and 357 deletions

View File

@@ -197,21 +197,26 @@ Startseite kommen. Weißes Blatt oder 500er? Dann [SSH]
### C3 [SSH] Datenstände erzeugen
`data/matchcenter.json` und `data/instagram.json` sind bewusst nicht im Repo, die
holen die Syncs. Vor dem ersten Lauf fehlen Tabellen, Spiele und der
Instagram-Block (die Seite bricht deswegen nicht, sie zeigt Ersatzinhalte).
`data/matchcenter.json` ist bewusst nicht im Repo, die holt der Sync. Vor dem
ersten Lauf fehlen Tabellen und Spiele (die Seite bricht deswegen nicht, sie zeigt
Ersatzinhalte).
```bash
cd /www/htdocs/w01ca75d/tsv08kulmbach-website
php bin/matchcenter-sync.php # Spiele, Ergebnisse, Tabellen, Wappen
php bin/instagram-sync.php # Posts und Bilder
```
**Der Instagram-Lauf ist der Wackelkandidat des ganzen Deploys.** Instagram sperrt
Rechenzentrums-IPs; bisher lief der Scraper nur über einen privaten Anschluss.
Schlägt er hier fehl, ist das kein Fehler im Deploy: dann bleibt der Weg, ihn von
zu Hause laufen zu lassen und `data/instagram.json` samt Bildern hochzuladen, oder
der Block wird redaktionell gepflegt. Die Website funktioniert in jedem Fall.
**Instagram braucht hier nichts mehr.** Seit dem 17.09.2026 gibt es keinen Scraper
und keinen Cron dafür: `data/instagram.json` liegt IM REPO und kommt mit dem Pull
mit, die Bilder ebenso. Neue Beiträge nimmt Claude im Chat mit
`php bin/instagram-add.php <post-url>` auf. Hintergrund in CLAUDE.md, Abschnitt
„Instagram-Beiträge".
**Einmalig beim ersten Pull nach dem 17.09.2026:** auf dem Server liegt noch eine
alte, unversionierte `data/instagram.json` vom letzten Sync-Lauf. Git bricht den
Pull sonst ab („untracked working tree file would be overwritten"). Sie ist
reiner Skript-Output und enthält keine Pflegearbeit, also einfach löschen:
`rm data/instagram.json && git pull`.
### C4 [SSH] `preflight` bis null Fehler
@@ -270,11 +275,12 @@ nicht `app_secret`). Steht er leer, antwortet der Endpoint mit 403 und **nichts*
| # | Pfad | Zeitpunkt |
|---|---|---|
| 1 | `www.tsv08kulmbach.de/cron.php?job=matchcenter&key=KEY` | stündlich, Minute 37 |
| 2 | `www.tsv08kulmbach.de/cron.php?job=instagram&key=KEY` | täglich, 06:17 |
| 3 | `www.tsv08kulmbach.de/cron.php?job=instagram&key=KEY` | täglich, 18:17 |
| 4 | `www.tsv08kulmbach.de/cron.php?job=logrotate&key=KEY` | täglich, 03:23 |
| 2 | `www.tsv08kulmbach.de/cron.php?job=logrotate&key=KEY` | täglich, 03:23 |
Vier Dinge dahinter sind Absicht:
Die beiden früheren Instagram-Jobs (06:17 und 18:17) sind am 17.09.2026 entfallen und
**gehören im KAS gelöscht** — der Endpoint kennt den Job nicht mehr und antwortet mit 403.
Drei Dinge dahinter sind Absicht:
- **Matchcenter stündlich statt halbstündlich am Spieltag.** Das KAS kann Wochentage
nicht mit einem Halbstunden-Takt kombinieren, wie es die ursprüngliche Crontab vorsah.
@@ -282,8 +288,6 @@ Vier Dinge dahinter sind Absicht:
spätestens eine Stunde später. Kostet 24 Läufe/Tag. Wer den Verkehr zum BFV klein
halten will, nimmt zwei „täglich"-Jobs (07:37 und 19:37) und lebt damit, dass
Samstagsergebnisse erst abends stehen.
- **Instagram zwei Einträge**, weil „täglich" nur einen Zeitpunkt kennt. Bewusst nicht
stündlich: Instagram sperrt auffällige Zugriffsmuster schneller als der BFV.
- **Versetzte Minuten**, damit sich zwei Läufe nie überlappen (die Syncs sperren sich
per Lock, sonst fällt einer aus).
- **Das E-Mail-Feld im KAS bleibt leer.** Die Antwort ist immer leer (204 = gelaufen oder