
Reddit OSINT nach Benutzername. Entdecke indexierte Beiträge, Kommentare, gelöschte und aktive Inhalte, Aktivitätsmuster, offengelegte Identifikatoren und einen Gesamt-Expositionswert.
Reddit OSINT per Benutzername. Gib ihm einen Benutzernamen und es liefert alles zurück, was die öffentlichen Reddit-Archive für dieses Konto indexiert haben: Beiträge, Kommentare, was gelöscht wurde und was noch live ist, Aktivitätsmuster, geleakte Identifikatoren und einen Expositions-Score.
Keine Abhängigkeiten, keine API-Schlüssel, kein Login. Nur python3.

python3 reddit_osint.py someuser
Dieselbe Analyse ist auch als MCP-Tools für LLM-Clients verfügbar, siehe MCP-Server.
pip install -r requirements.txt && python mcp_server.py
Reddit löscht Dinge, aber Datenarchive von Drittanbietern behalten die Kopie, die vor der
Löschung existierte (oder zumindest den [removed] / [deleted]-Marker). Dieses Tool fragt diese Archive ab und
rekonstruiert das Aktivitätsprofil eines Kontos.
Das ist die Prämisse hinter dem h3kz-reddint-Webtool, das die Referenz für dieses Skript ist:
es implementiert diese Pipeline (zwei Quellen, Zusammenführung, PII-Regexes, Graph, Score) als eigenständiges
CLI neu, mit Tests und optionaler Proxy-Unterstützung.
| Quelle | Was es ist | Rolle |
|---|---|---|
Arctic Shift (arctic-shift.photon-reddit.com) | Kostenloses Reddit-Archiv, von der Community betriebener Nachfolger von Pushshift. Deckt 2022→heute ab und behält den ursprünglichen Scrape (selftext, removed_by_category, media_metadata, Flair). Kein API-Schlüssel, Rate-Limit pro IP. | Primärquelle. Liefert 100 % der nützlichen Daten. |
PullPush (api.pullpush.io) | Ein weiterer Index derselben Reddit-Daten (historische Pushshift-Dumps). | Fallback. Wird parallel abgefragt und per id zusammengeführt. Seine Subreddit-API gibt 404 zurück, daher liefert es nur Posts/Kommentare. |
reddit.com | — | Wird nie abgefragt. Wird nur verwendet, um Permalink-URLs im Bericht zu erstellen. Die offizielle Reddit-API wird nicht verwendet (kein Login), weshalb dies bei gesperrten Konten funktioniert. |
Gemessen an einem echten Beispielkonto: Arctic Shift lieferte 39 Posts / 139 Kommentare, PullPush
lieferte 38 Posts mit überlappenden IDs. Arctic Shift gewinnt; --source arctic ist schneller und
ausreichend.
pip install. Nur Standardbibliothek.pip install pysocks (optional, nur für socks5:// erforderlich)pip install -r requirements.txt (FastMCP). Die CLI benötigt es nicht.python3 reddit_osint.py someuser
Gibt den Bericht als JSON auf stdout aus (nur Zusammenfassung, ohne den Dump pro Element) und protokolliert auf
stderr.
python3 reddit_osint.py someuser --json report.json
python3 reddit_osint.py someuser --json report.json --quiet > /dev/null
report.json enthält den Schlüssel all_items mit jedem Beitrag und Kommentar (Text, Subreddit,
Score, Datum, Status, Permalink). Die Zusammenfassung auf dem Bildschirm lässt ihn weg, damit sie nicht 200 KB ausgibt.
python3 reddit_osint.py someuser --subreddit dotnet # one subreddit only
python3 reddit_osint.py someuser --keywords "kubernetes" # posts mentioning X
python3 reddit_osint.py someuser --over18 true # NSFW only
python3 reddit_osint.py someuser --source arctic # single source (faster)
python3 reddit_osint.py someuser --max-pages 10 # cap pagination (100 items/page)
python3 reddit_osint.py someuser --delay 1.0 # slower, better with proxies
python3 reddit_osint.py someuser --rate-limit-retries 0 # fail fast when throttled
python3 reddit_osint.py someuser --proxies proxies.txt
proxies.txt, ein Proxy pro Zeile. Akzeptierte Formate:
http://1.2.3.4:8080
https://1.2.3.4:8443
socks5://1.2.3.4:1080
socks5://user:[email protected]:1080
1.2.3.4:8080 # no scheme -> assumed http://
# comments and blank lines are ignored
Duplikate werden entfernt. Wenn die Datei keinen gültigen Proxy enthält, beendet sich das Skript mit Code 2 und stellt keine Anfragen.
Rotation. Proxies werden reihum durchlaufen. Wenn eine Anfrage mit einem Blockierungs-/Rate-Limit-
Code zurückkommt, wird dieser Proxy für --cooldown Sekunden in den Cooldown versetzt und das Skript wechselt zum nächsten:
| Flag | Standard | Was es bewirkt |
|---|---|---|
--proxies FILE | — | Proxy-Liste. Ohne sie: direkte Verbindung. |
--cooldown SECONDS | 30 | Wie lange ein gesperrter Proxy außen vor bleibt. |
--max-attempts N | (proxies+1) × 3 | Versuchsobergrenze pro Anfrage, bevor aufgegeben wird. |
--no-direct-fallback | aus | Warten statt direkt zu verbinden, wenn alle Proxies im Cooldown sind. |
--shuffle-proxies | aus | Mischt die Liste beim Start (verteilt die Last ab der ersten Anfrage). |
--proxy-stats | aus | Fügt proxy_stats zum Bericht hinzu: ok / banned / errors pro Proxy. |
--rate-limit-retries N | 2 | Wiederholt die gesamte Seite mit exponentiellem Backoff (30 s, 60 s, gedeckelt bei 120 s), wenn die API 429/422 antwortet. |
Codes, die als Ban behandelt werden (sie rotieren den Proxy): 401 403 407 422 429 500 502 503 504 520 521 522 523 524, plus alle 400/409, deren Body slow down / rate limit /
too many requests / timeout enthält. Arctic Shift verwendet 422 "Timeout. Maybe slow down a bit" für
Rate Limiting, daher wird es bewusst als Ban behandelt.
Ein 404 rotiert nicht: Das ist eine fehlerhafte Anfrage, kein fehlerhafter Proxy, und ein erneuter Versuch
an anderer Stelle behebt das nicht.
Backoff. Nach einem Ban wartet es min(cooldown, 10 s) — das gilt auch für direkte Verbindungen,
was am schmerzhaftesten ist. Wenn eine Seite ihre Versuche ausschöpft, wiederholt fetch_all die Seite mit
exponentiellem Backoff (--rate-limit-retries, standardmäßig 2 Versuche = 30 s und 60 s). Das ist es, was
verhindert, dass das Skript stillschweigend Kommentare verliert, wenn es mitten im Lauf ein Rate Limit auslöst.
Beispielprotokoll mit Rotation:
[proxy] http://1.2.3.4:8080 blocked (429), backing off 10s -> rotating
[proxy] http://5.6.7.8:1080 failed (Connection refused), rotating
[proxy] direct connection blocked (422), backing off 10s -> rotating
[!] arctic/comments rate limited, backing off 30s (retry 1/2)
Wenn jeder Proxy abkühlt, wartet das Skript die längste verbleibende Abkühlzeit ab und versucht es erneut
(oder verwendet eine direkte Verbindung, sofern nicht --no-direct-fallback übergeben wurde).
Warnung: Ein Proxy ist der Egress-Pfad, den deine IP zu einem Drittanbieter nimmt. Wenn du dem Proxy-Anbieter nicht vertraust, verwende keinen mit diesem Tool.
| Variable | Zweck |
|---|---|
REDDIT_OSINT_ARCTIC | Überschreibt die Arctic-Shift-URL (Mirrors, Tests). |
REDDIT_OSINT_PULLPUSH | Überschreibt die PullPush-URL. |
id, title, selftext, body, author, subreddit, created_utc, score, permalink,
url, over_18, num_comments, link_flair_text, preview.images, media_metadata,
removed_by_category.
| Status | Erkennung |
|---|---|
removed | Text = [removed] oder [ Removed by Reddit ], oder removed_by_category vorhanden (Posts) → ein Moderator hat ihn entfernt. |
deleted | Text = [deleted] oder author == "[deleted]" → der Autor hat ihn gelöscht. |
live | Alles andere. |
Das ist der ganze Sinn des Tools: Das Archiv erfasst die Tatsache der Entfernung, selbst wenn kein Inhalt vorhanden ist, und allein das sind nützliche Metadaten.