Einrichten · Schritt für Schritt
Diese Seite führt durch die Einrichtung: das Repository holen, prüfen, was der Rechner braucht, installieren, die Zugänge bei Apple und Google beschaffen, die Apps in die Konfiguration eintragen, den täglichen Lauf auf einem Server einrichten und das Menü am Arbeitsplatz benutzen. Alle Einstellungen gehen am bequemsten in der Einrichtung im Browser. Zwei Erweiterungen sind optional und haben eigene Seiten: die KI-Analyse und die Benachrichtigung nach dem Tageslauf. Am Ende stehen alle Seiten und Dokumente auf einen Blick.
1 · GitHub
Das Werkzeug liegt als Quelltext auf GitHub. Du holst den Ordner auf deinen Rechner, mehr ist es nicht. Updates kommen mit git pull.
Der übliche Weg. Git ist auf dem Mac in den Command Line Tools enthalten, unter Linux ein Paket, unter Windows „Git for Windows“ (bringt Git Bash gleich mit).
git clone https://github.com/drapatzc/app-ratings-reviews-online.git cd app-ratings-reviews-online
Auf GitHub „Code → Download ZIP“, entpacken, Ordner an einen festen Platz legen. Updates dann wieder per ZIP; Daten und Konfiguration liegen in eigenen Ordnern und überstehen das.
# bleibt bei Updates erhalten:
config/config.json data/ reports/ keys/Das öffentliche Repository enthält nur Code und Dokumentation. Deine Konfiguration, Schlüssel, Daten und Berichte entstehen lokal und sind per .gitignore ausgeschlossen. Wer den täglichen Lauf in GitHub Actions betreiben will, braucht dafür ein eigenes privates Repository, weil data/ Rezensionstexte enthält.
# .gitignore (Auszug)
config/config.json
*.p8 keys/ data/ reports/ backups/2 · Voraussetzungen
Kein Server, keine Datenbank, kein Node, kein Docker. Die einzige Abhängigkeit (cryptography, für die Signatur bei Apple und Google)1 installiert das Skript selbst in eine lokale Python-Umgebung.
1 Die Abhängigkeit ist das Python-Paket cryptography, eine verbreitete quelloffene Bibliothek für Verschlüsselung und Signaturen. Das Skript braucht sie nur, um die Anmeldung bei Apple und Google zu signieren (Apple: p8-Schlüssel, ES256; Google: Dienstkonto-Schlüssel, RSA); das kann Python ohne Zusatzpaket nicht. Alles andere kommt aus der Python-Standardbibliothek. Installiert wird sie einmalig in eine lokale Umgebung, läuft rein lokal und telefoniert nicht nach Hause.
macOS, Linux (Debian/Ubuntu, RHEL) oder Windows. Für den Dauerbetrieb ist Linux mit systemd die ruhigste Wahl; ein Mac mini oder ein Windows-Rechner gehen auch.
python3 --version. Auf dem Mac installiert macOS Python beim ersten Aufruf mit den Command Line Tools; unter Linux dazu python3-venv und pip; unter Windows die normale Installation von python.org.
Die Skripte ./ratings.sh, ./menu.sh und ./shortmenu.sh brauchen Bash. Unter Windows Git Bash oder WSL; ohne Bash gehen die Python-Programme direkt: python menu.py, python collect.py.
Zu api.appstoreconnect.apple.com, itunes.apple.com und Apples Download-Hosts für Analytics-Berichte; mit Android zusätzlich androidpublisher.googleapis.com, oauth2.googleapis.com, playdeveloperreporting.googleapis.com. Proxy setzen, falls nötig.
data/ wächst langsam (JSON). Ein Backup von data/, config/ und keys/ einplanen; ./ratings.sh backup packt die Daten.
systemd-Timer oder cron (Linux), launchd (Mac), Aufgabenplanung (Windows) oder GitHub Actions. Der tägliche Lauf ist wichtig: Google liefert Rezensionen nur sieben Tage rückwirkend.
Ein Apple-API-Schlüssel je Entwicklerkonto; bei Android-Apps ein Google-Dienstkonto je Play Console. Wie du sie bekommst, steht im Abschnitt Apple und Google.
nginx mit Passwort oder IIS, wenn der Bericht im Firmennetz per Adresse erreichbar sein soll. Sonst wird die HTML-Datei oder die Markdown-Zusammenfassung verteilt.
3 · Installieren
Die Skripte legen beim ersten Start die Python-Umgebung .venv an und installieren die eine Abhängigkeit. Wer es von Hand mag, macht es so:
Einmalig. Danach nie wieder source nötig, weil ./ratings.sh und ./menu.sh die Umgebung selbst benutzen.
python3 -m venv .venv .venv/bin/pip install -r requirements.txt
Windows (PowerShell): py -3 -m venv .venv und .venv\Scripts\pip install -r requirements.txt.
Die Beispieldatei kopieren und nur für dich lesbar machen. Was hinein gehört, steht in den Abschnitten Zugänge und Konfiguration.
cp config/config.example.json config/config.json chmod 600 config/config.json mkdir -p keys && chmod 700 keys
Installiert beim ersten Mal pytest und lässt die Tests laufen, ohne Netz. Grün heißt: Python, Umgebung und Code passen zusammen. Dann die Zugänge prüfen, ohne etwas zu speichern.
./ratings.sh test ./ratings.sh dry-run
Auf einem Server: eigener Benutzer ohne Anmeldung (sudo useradd --system --create-home --shell /bin/bash ratings), Projekt in dessen Home, Rechte wie oben. Die ausführliche Anleitung mit allen Varianten steht im Repository in EINRICHTUNG.md und BETRIEB.md.
4 · Zugänge bei Apple und Google
Das ist der organisatorische Engpass, nicht die Technik. Jeder Kunde legt in seinem eigenen Konto einen lesenden Zugang an und übergibt ihn. Am besten verschickst du je Kunde eine kurze Anforderung mit genau diesen Punkten.
AuthKey_<KeyID>.p8, die Issuer ID und die Key ID. Die Key ID steckt im Dateinamen.id1234567890).ONGOING anlegen. Daten gibt es erst ab diesem Tag, also früh einrichten.ONGOING-Auftrag fehlt in App Store Connect.de.kasse.app, aus der Play-Store-URL (id=…)../ratings.sh import-csv einlesen."enabled": false setzen oder sie weglassen. Fehlende Google-Zugangsdaten sind dann in Ordnung.Schlüsseldateien gehören in keys/ mit chmod 600, zum Beispiel keys/kasse-nord.p8 und keys/kasse-nord-google.json. Alternativ als Umgebungsvariable: privateKeyEnvironmentVariable (Inhalt = Pfad oder Schlüsseltext) und serviceAccountEnvironmentVariable. Nie in die Konfiguration: das Programm lehnt Felder wie apiKey ab.
5 · Konfiguration
Ohne die Datei zu kennen: ./ratings.sh admin (Kurzmenü 7) öffnet eine Seite nur auf diesem Rechner, die jede Einstellung als Frage in Klartext stellt: Kunden, Apps, Zugänge, Wettbewerber, KI mit drei Modellen (Analyse, KI-Anfragen, KI-Crashanalyse) und den Sicherheitsschaltern der Crash-Analyse, Benachrichtigung, Ampel, Themen, Fragen und Ereignisse, dazu je Reiter und Bereich des Berichts ein Schalter, der für Bildschirm und Ausdruck zugleich gilt. Jede Eingabe wird sofort mit denselben Regeln geprüft wie beim Abruf, vor dem Speichern kommt die alte Fassung in die Sicherung, und danach sagt die Seite, welche laufenden Skripte neu gestartet werden müssen. Alles dazu, mit Sicherheit und Animationen: Einrichtung im Browser. Wer lieber in der Datei arbeitet: so sieht sie aus.
Ein Kunde ist ein Eintrag in customers mit eigenen Zugangsdaten und seiner App-Liste. Jede App hat je Plattform einen Block. Die id wird zum Ordnernamen unter data/ und darf später nicht mehr geändert werden.
So sieht ein Kunde mit zwei Apps aus. Die Schlüssel liegen als Dateien in keys/; Google ist bei der zweiten App ausgeschaltet.
{
"schemaVersion": 1,
"settings": { "minRefreshMinutes": 30, "fullSyncIntervalDays": 30, "overlapDays": 7, "logLevel": "INFO" },
"customers": [
{
"id": "kasse-nord", "name": "Krankenkasse Nord", "enabled": true, "countries": ["DE"],
"credentials": {
"apple": { "issuerId": "11111111-2222-3333-4444-555555555555", "keyId": "ABC123DEFG",
"privateKeyFile": "./keys/kasse-nord.p8" },
"google": { "serviceAccountFile": "./keys/kasse-nord-google.json" }
},
"apps": [
{ "id": "kasse-nord-app", "name": "Kasse Nord App", "enabled": true, "audience": 250000, "platforms": {
"apple": { "enabled": true, "appId": "1234567890" },
"google": { "enabled": true, "packageName": "de.kassenord.app", "languages": [] } } },
{ "id": "kasse-nord-bonus", "name": "Kasse Nord Bonus", "enabled": true, "platforms": {
"apple": { "enabled": true, "appId": "1234567891" },
"google": { "enabled": false, "packageName": "de.kassenord.bonus", "languages": [] } } }
]
}
]
}Ein weiterer Block in apps: eigene id (Buchstaben, Ziffern, . _ -), Name, Apple-ID und Paketname. Beim nächsten Lauf holt das Programm alles ab defaultStartDate. Ein neuer Kunde ist ein weiterer Block in customers mit eigenen Zugangsdaten.
./ratings.sh apps ./ratings.sh dry-run --customer kasse-nord
apps zeigt die Liste, dry-run prüft die Zugänge, ohne zu speichern. Ein Tippfehler in einer App-ID fällt dort als 404 auf.
customers[].id und apps[].id bestimmen die Ordnernamen unter data/customers/. Eine Änderung trennt die Historie von den neuen Daten.
Apple-Schlüssel hängen am Entwicklerkonto. Veröffentlichen mehrere Kunden unter demselben Konto (Agentur), reicht ein Schlüssel, der bei jedem eingetragen wird. Ein Google-Dienstkonto kann in mehrere Play Consoles eingeladen werden.
Keine Android-App: google auf "enabled": false oder ganz weglassen. Nötig und fehlend: das Programm lehnt die Konfiguration ab, bevor es etwas abruft.
countries je Kunde ist Pflicht (mindestens ein Land) und gilt für Store-Note, Rezensionen und Wettbewerber; jedes Land kostet je App und Lauf eine Anfrage, für den deutschen Markt reicht ["DE"]. languages bei Google leer lassen (alle).
audience ist optionalGröße der Zielgruppe je App, etwa die Zahl der Versicherten. Nur damit rechnet der Bericht „Downloads je 1000 der Zielgruppe“. Ohne Angabe bleibt die Spalte leer, geschätzt wird nie.
settings kann bleibenminRefreshMinutes 30: nach einem Erfolg keine Anfrage. fullSyncIntervalDays 30: alle 30 Tage ein vollständiger Abruf, der Änderungen alter Rezensionen erkennt. overlapDays 7: Sicherheitsüberlappung bei Apple.
config/themen.jsonDie Wortlisten für „Themen und Wörter“ im Bericht, versioniert und ohne Geheimnisse. Je Thema id, de, en, Art und Suchwörter; frei erweiterbar, die KI schlägt Ergänzungen vor.
config/fragen.jsonZwanzig vorbereitete Fragen für den Reiter „KI-Anfragen“ im Bericht, frei änderbar.
ai, optionalEin Anbieter für alle Kunden, Schlüssel als Umgebungsvariable. Alles dazu auf der Seite KI-Analyse einrichten.
competitors je Kunde, optional, nur AppleFremde Apple-Apps neben den eigenen auswerten, ohne Zugang: App-ID aus dem Store-Link, Länder, fertig. Quelle sind der öffentliche Apple-Feed und der iTunes Lookup; ohne Einträge ändert sich nichts. Alles dazu auf der Seite Wettbewerber einrichten.
notify, optionalE-Mail, Slack, Teams oder Webhook nach dem Tageslauf, nur bei neuen 1–2 ★, Ampelwechsel oder Absturzsprung. Passwort und Webhook-Adresse als Umgebungsvariable, Link über settings.reportUrl. Alles dazu auf der Seite Benachrichtigung einrichten.
| Feld | Bedeutung | Standard |
|---|---|---|
settings.defaultStartDate | ab wann ein vollständiger Abruf Rezensionen holt (Erstellungsdatum) | null (alles) |
settings.requestTimeoutSeconds, maxRetries | Timeout und Wiederholungen bei 429, 5xx und Netzfehlern | 30, 3 |
settings.fetchAppleVersions | Versionsliste je App holen (für „Was ein Update verändert hat“) | true |
settings.logLevel | DEBUG, INFO, WARNING, ERROR; Log in data/logs/collect.log | INFO |
credentials.apple.privateKeyFile oder privateKeyEnvironmentVariable | Pfad zur .p8 oder Name der Variable (Pfad oder Schlüsseltext) | eins von beiden |
credentials.google.serviceAccountFile oder serviceAccountEnvironmentVariable | Pfad zum JSON oder Name der Variable | nur mit Android |
platforms.apple.appId | numerische Apple-ID der App | Pflicht |
platforms.google.packageName | Paketname der Android-App | Pflicht, wenn aktiv |
6 · Start per Skript · täglicher Lauf auf einem Server
./ratings.sh dailyHolt Rezensionen, Stabilität, Store-Kennzahlen und Testbetrieb, läuft die KI mit, wenn ein Anbieter aktiv ist, erzeugt Bericht, Markdown und ZIP, ohne Browser. Höchstens ein erfolgreicher Lauf pro Kalendertag; ein zweiter Aufruf beendet sich sofort ohne Anfrage. Ein gescheiterter Lauf sperrt den Tag nicht.
Ein Timer um 06:30 mit etwas Zufall, ein oneshot-Dienst, der als Benutzer ratings läuft. Umgebungsvariablen (Schlüssel, KI) in einer Datei, die nur dieser Benutzer lesen kann. Persistent=true holt verpasste Läufe nach.
# /etc/systemd/system/ratings.service [Service] Type=oneshot User=ratings WorkingDirectory=/home/ratings/app-ratings-reviews EnvironmentFile=-/home/ratings/.config/ratings.env ExecStart=/home/ratings/app-ratings-reviews/ratings.sh daily # /etc/systemd/system/ratings.timer [Timer] OnCalendar=*-*-* 06:30:00 RandomizedDelaySec=10m Persistent=true sudo systemctl enable --now ratings.timer
Auf einem Mac mini, der durchläuft. cron ist die kürzeste Variante; launchd holt verpasste Läufe nach dem Ruhezustand nach (Vorlage in BETRIEB.md).
# crontab -e, täglich 07:15
15 7 * * * cd ~/Git-Home/app-ratings-reviews \
&& ./ratings.sh daily >> logs-daily.txt 2>&1
Der Mac muss um diese Zeit wach sein: Systemeinstellungen → Energie, Ruhezustand aus oder Zeitplan zum Aufwachen.
Ohne Bash werden die Python-Programme direkt aufgerufen; eine kleine daily.cmd übernimmt das, die Aufgabenplanung startet sie täglich und holt Verpasstes nach.
REM daily.cmd cd /d C:\ratings\app-ratings-reviews .venv\Scripts\python collect.py --dataset all --once-per-day .venv\Scripts\python report.py --zip .venv\Scripts\python notify.py # PowerShell, einmalig Register-ScheduledTask -TaskName "App-Bewertungen" …
Nur in einem privaten Repository, weil data/ Rezensionstexte enthält. Die Daten leben in einem Branch ci-data, der Schlüssel als Secret. Der Workflow .github/workflows/daily.yml liegt bei; Ergebnis ist ein Artefakt mit Bericht, Markdown und ZIP statt einer URL.
# Secrets: APPLE_PRIVATE_KEY, CONFIG_JSON,
# mit Benachrichtigung RATINGS_SMTP_PASSWORD …
git switch --orphan ci-data
git commit --allow-empty -m init
git push origin ci-datareports/index.html ist eine einzelne Datei ohne externe Abhängigkeiten. nginx mit Basic Auth oder hinter dem Firmen-VPN; unter Windows IIS mit Windows-Authentifizierung oder eine Netzwerkfreigabe. Mit --customer entsteht ein Bericht nur für einen Kunden. Diese Adresse gehört als reportUrl in die Konfiguration, dann steht sie in jeder Benachrichtigung.
./ratings.sh report --customer kasse-nord
# nginx: root …/reports; auth_basic
Der Fragedienst der KI wird auf dem Server nicht gestartet; der bereitgestellte Bericht zeigt gespeicherte Antworten.
Was im Alltag anfällt, meist nichts:
Lief der Abruf? ./ratings.sh status Fehler suchen data/logs/collect.log Außer der Reihe ./ratings.sh force Backup ./ratings.sh backup · backups · restore ZIP Ereignis ./ratings.sh event add --date … --title "…" Meldungsverlauf ./ratings.sh notify --history Neue App config.json, nächster Lauf Update git pull && ./ratings.sh test Benachrichtigung ./ratings.sh notify --test
Der Apple-Schlüssel läuft nicht ab, kann aber widerrufen werden; dann meldet der Lauf HTTP 401.
Die Filme
Beide stehen auf der Startseite, mit Untertiteln.
Der Bericht · 7 MinutenVom ersten Warnsignal bis zur Zeile im Code: Ampel, Diagramme, Wettbewerber, KI-Fragen und Crash-Analyse an einem Fall.Film ansehen →
Einrichtung im Browser · 3½ MinutenNeue App, Schlüssel, Wettbewerber, KI-Modelle, Ampelregeln, Themen und Reiter: einmal eingerichtet, läuft es jeden Tag.Film ansehen →
8 · Alle Seiten und Dokumente
Diese Anleitung deckt den Grundbetrieb ab. Alles Optionale hat eine eigene Seite, alles Technische ein Dokument im Repository.
Ein Sprachmodell deiner Wahl liest die Rezensionen: Zusammenfassung je App, Stimmung, Maßnahmen, Antwortentwürfe, Fragen an die Daten. Konto, Schlüssel, Konfiguration, Test, Modelle und Preise.
E-Mail, Slack, Teams oder Webhook nach dem Tageslauf, nur bei neuen 1–2-★-Rezensionen, Ampelwechsel oder Absturzsprung. Auslöser, Beispielnachricht, Zugänge, Konfiguration, Test, Datenschutz.
Fremde Apple-Apps mit derselben Ampel, denselben Themen und derselben KI neben den eigenen. Öffentlicher Apple-Feed, kein Zugang nötig, nur Apple. Einrichtung, Grenzen, Datenschutz.
Jede Einstellung als Frage in Klartext, sofort geprüft, mit Sicherung gespeichert, nur auf diesem Rechner. Alle Schritte, Reiter und Bereiche des Berichts, Speichern, Sicherheit.
Crash-Reports aus Apple und Android: Ursache, Stelle und Lösung nur mit Beleg, persönliche Daten vorher ersetzt, Projektordner je Anfrage. Ablauf, Datenschutz, Prompts im Wortlaut.
Was das Skript tut, was die Stores vergessen, der Bericht mit Bildern, die neunzehn Diagramme, Einrichten in fünf Minuten.
Anbieter dieser Homepage und was beim Besuch gespeichert wird (nichts außer Zugriffsprotokollen des Webservers). Der Bericht selbst bringt eine eigene Datenschutzerklärung mit.
Der Code, kostenlos und öffentlich. Dort liegen auch alle Dokumente: README.md (Befehle, Konfiguration, Datenschema), ANLEITUNG.md (Bedienung), BETRIEB.md (Zeitplan je Betriebssystem, CI), EINRICHTUNG.md (Server für mehrere Kunden, Checkliste), KI.md und BENACHRICHTIGUNG.md (die Kurzfassungen der beiden Erweiterungen), TECHNIK.md (Schnittstellen, Dateien, Fehlerklassen).
Taste H in jedem Menü, ./ratings.sh help auf der Kommandozeile, und im Bericht oben rechts „Hilfe“ mit Einrichtung, Zugängen, Befehlen, KI und Benachrichtigung auf einer Seite.