
OSINT su Reddit tramite username. Scopri post indicizzati, commenti, contenuti eliminati e attivi, pattern di attività, identificatori esposti e un punteggio complessivo di esposizione.
Reddit OSINT tramite username. Fornisci un username e restituisce tutto ciò che gli archivi pubblici di Reddit hanno indicizzato per quell'account: post, commenti, cosa è stato eliminato e cosa è ancora attivo, pattern di attività, identificatori trapelati e un punteggio di esposizione.
Nessuna dipendenza, nessuna API key, nessun login. Solo python3.

python3 reddit_osint.py someuser
La stessa analisi è disponibile anche come strumenti MCP per client LLM, vedi server MCP.
pip install -r requirements.txt && python mcp_server.py
Reddit elimina le cose, ma gli archivi dati di terze parti conservano la copia che esisteva prima della
cancellazione (o almeno il marcatore [removed] / [deleted]). Questo strumento interroga quegli archivi e
ricostruisce il profilo di attività di un account.
Questa è la premessa alla base dello strumento web h3kz-reddint, che è il riferimento per questo script:
reimplementa quella pipeline (due fonti, merge, regex PII, grafo, punteggio) come CLI
standalone, con test e supporto proxy opzionale.
| Fonte | Cos'è | Ruolo |
|---|---|---|
Arctic Shift (arctic-shift.photon-reddit.com) | Archivio Reddit gratuito, successore gestito dalla community di Pushshift. Copre dal 2022 a oggi e conserva lo scrape originale (selftext, removed_by_category, media_metadata, flair). Nessuna API key, rate limit per IP. | Fonte primaria. Fornisce il 100% dei dati utili. |
PullPush (api.pullpush.io) | Un altro indice degli stessi dati Reddit (dump storici di Pushshift). | Fallback. Interrogato in parallelo e unito per id. La sua API subreddit restituisce 404, quindi serve solo post/commenti. |
reddit.com | — | Mai interrogato. Usato solo per costruire gli URL permalink nel report. L'API ufficiale di Reddit non viene usata (nessun login), ed è per questo che funziona su account sospesi. |
Misurato su un account campione reale: Arctic Shift ha restituito 39 post / 139 commenti, PullPush
ha restituito 38 post con ID sovrapposti. Arctic Shift vince; --source arctic è più veloce e
sufficiente.
pip install. Solo libreria standard.pip install pysocks (opzionale, necessario solo per socks5://)pip install -r requirements.txt (FastMCP). La CLI non ne ha bisogno.python3 reddit_osint.py someuser
Stampa il report come JSON su stdout (solo il riepilogo, senza il dump per elemento) e registra su
stderr.
python3 reddit_osint.py someuser --json report.json
python3 reddit_osint.py someuser --json report.json --quiet > /dev/null
report.json include la chiave all_items con ogni post e commento (testo, subreddit,
punteggio, data, stato, permalink). Il riepilogo a schermo la omette per non riversare 200 KB.
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, un proxy per riga. Formati accettati:
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
I duplicati vengono rimossi. Se il file non contiene alcun proxy valido, lo script termina con codice 2 e non effettua alcuna richiesta.
Rotazione. I proxy vengono percorsi a turno. Quando una richiesta restituisce un codice di blocco/rate-limit,
quel proxy viene messo in cooldown per --cooldown secondi e lo script passa al successivo:
| Flag | Default | Cosa fa |
|---|---|---|
--proxies FILE | — | Lista di proxy. Senza di esso: connessione diretta. |
--cooldown SECONDS | 30 | Per quanto tempo un proxy bannato resta messo da parte. |
--max-attempts N | (proxies+1) × 3 | Limite di tentativi per richiesta prima di arrendersi. |
--no-direct-fallback | off | Attende invece di connettersi direttamente quando tutti i proxy sono in cooldown. |
--shuffle-proxies | off | Mescola la lista all'avvio (distribuisce il carico fin dalla prima richiesta). |
--proxy-stats | off | Aggiunge proxy_stats al report: ok / banned / errors per proxy. |
--rate-limit-retries N | 2 | Ritenta l'intera pagina con backoff esponenziale (30 s, 60 s, con limite a 120 s) quando l'API risponde 429/422. |
I codici trattati come ban (che fanno ruotare il proxy): 401 403 407 422 429 500 502 503 504 520 521 522 523 524, più qualsiasi 400/409 il cui corpo contenga slow down / rate limit /
too many requests / timeout. Arctic Shift usa 422 "Timeout. Maybe slow down a bit" per
il rate limiting, quindi viene deliberatamente gestito come un ban.
Un 404 non fa ruotare: è una richiesta errata, non un proxy errato, e ritentare altrove non
risolverà il problema.
Backoff. Dopo un ban attende min(cooldown, 10 s) — questo vale anche per le connessioni dirette,
che è dove fa più male. Se una pagina esaurisce i tentativi, fetch_all ritenta la pagina con
backoff esponenziale (--rate-limit-retries, 2 tentativi per default = 30 s e 60 s). È questo che
impedisce allo script di perdere silenziosamente commenti quando incappa in un rate limit durante l'esecuzione.
Log di esempio con rotazione:
[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)
Quando ogni proxy è in cooldown, lo script attende il cooldown rimanente più lungo e riprova
(oppure usa una connessione diretta a meno che non sia stato passato --no-direct-fallback).
Attenzione: un proxy è il percorso di uscita che il tuo IP utilizza verso una terza parte. Se non ti fidi del fornitore del proxy, non usarne uno con questo strumento.
| Variabile | Scopo |
|---|---|
REDDIT_OSINT_ARCTIC | Sovrascrive l'URL di Arctic Shift (mirror, test). |
REDDIT_OSINT_PULLPUSH | Sovrascrive l'URL di PullPush. |
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.
| Stato | Rilevamento |
|---|---|
removed | Testo = [removed] o [ Removed by Reddit ], oppure removed_by_category presente (post) → un moderatore lo ha rimosso. |
deleted | Testo = [deleted] o author == "[deleted]" → l'autore lo ha eliminato. |
live | Tutto il resto. |
Questo è l'intero scopo dello strumento: l'archivio cattura il fatto della rimozione anche quando non ha contenuto, e già questo è metadato utile.