Parser e analisi per chat WhatsApp esportate in formato .txt
Project description
whatsapp-chat-analyzer
Parser robusto per le chat WhatsApp esportate in formato .txt, con riconoscimento
automatico del formato, modelli dati puliti ed export verso JSON, CSV e pandas.
La libreria nasce per essere usata in due modi: come base solida su cui costruire analisi personalizzate (ti restituisce oggetti Python ordinati) e come strumento pronto all'uso grazie agli export e a una piccola CLI.
Caratteristiche
- Riconoscimento automatico del formato: iOS e Android, date
DD/MMoMM/DD, anno a 2 o 4 cifre, orario 24h oppure 12h con AM/PM. Il formato si può anche forzare. - Messaggi tipizzati: ogni messaggio è classificato come
TEXT,MEDIA,SYSTEMoDELETED, con riconoscimento del sottotipo media (immagine, video, audio, ...). I pattern sono multilingua (italiano e inglese). - Messaggi multi-linea gestiti correttamente.
- Trasformazioni in fase di parsing: filtri per data/autore/sistema e anonimizzazione dei nomi.
- Export: JSON (con re-import per il round-trip), CSV e
pandas.DataFrame. - CLI
wa-analyzerper convertire una chat senza scrivere codice. - Zero dipendenze obbligatorie (solo standard library);
pandasè opzionale.
Installazione
pip install whatsapp-chat-analyzer
Per l'export verso pandas.DataFrame:
pip install whatsapp-chat-analyzer[pandas]
Requisiti: Python 3.10+.
Uso rapido
from whatsapp_analyzer import parse_file
chat = parse_file("export.txt")
print(len(chat), "messaggi")
print("Partecipanti:", chat.participants)
for msg in chat:
print(msg.timestamp, msg.sender, "->", msg.text)
Se hai già il contenuto in memoria (ad esempio caricato da un upload):
from whatsapp_analyzer import parse_string
chat = parse_string(testo_della_chat)
Come esportare una chat
Esportala dal telefono senza i media:
Impostazioni chat → Altro → Esporta chat → Senza file multimediali. Otterrai un
file .txt. La libreria gestisce automaticamente il BOM utf-8 che WhatsApp aggiunge
ad alcuni export.
I modelli dati
Chat
Si comporta come una sequenza di Message (supporta len(), indicizzazione e
iterazione) e offre alcune comodità:
chat.participants # set degli autori (esclusi i messaggi di sistema)
chat.filter(predicate) # nuova Chat con i soli messaggi che soddisfano il predicato
chat.to_json() # -> str (vedi sezione Export)
chat.to_csv() # -> str
chat.to_dataframe() # -> pandas.DataFrame (richiede l'extra pandas)
Chat.from_json(data) # ricostruisce una Chat da un export JSON
Message
È un oggetto immutabile (frozen dataclass) con questi campi:
| Campo | Tipo | Note |
|---|---|---|
timestamp |
datetime |
data e ora del messaggio |
sender |
str | None |
None per i messaggi di sistema (senza autore) |
text |
str |
corpo del messaggio (per i multi-linea include i \n) |
type |
MessageType |
TEXT, MEDIA, SYSTEM, DELETED |
media_kind |
MediaKind | None |
valorizzato solo quando type == MEDIA |
MediaKind può valere IMAGE, VIDEO, AUDIO, DOCUMENT, STICKER, GIF.
from whatsapp_analyzer import MessageType
testo = [m for m in chat if m.type == MessageType.TEXT]
media = [m for m in chat if m.type == MessageType.MEDIA]
Configurazione
Tutte le opzioni passano da ParserConfig, che funge anche da punto di
dependency injection: se un campo è lasciato a None, il parser usa l'implementazione
di default.
from whatsapp_analyzer import parse_file, ParserConfig
config = ParserConfig(
locale="it", # tie-break per le date ambigue (DD/MM vs MM/DD)
max_lines_per_message=1000, # salvaguardia anti file corrotti
transformers=[], # filtri/anonimizzazione (vedi sotto)
)
chat = parse_file("export.txt", config=config)
Campi disponibili:
chat_format: forza un formato specifico e salta il riconoscimento automatico.detectors: lista diFormatDetectorpersonalizzati (default: iOS + Android).locale: usato per disambiguare le date quando il giorno è ≤ 12 in entrambe le posizioni. Con"us"/"en_us"si assume mese per primo, altrimenti giorno per primo.classifier: unMessageClassifieralternativo.transformers: lista di trasformazioni applicate in ordine (vedi sotto).max_lines_per_message: oltre questa soglia un messaggio viene troncato e viene emesso un warning (protegge da export corrotti dove l'header non viene più riconosciuto).
Forzare il formato
Se hai un export con un formato che il riconoscimento automatico non prende, puoi descriverlo a mano:
import re
from whatsapp_analyzer import parse_file, ParserConfig
from whatsapp_analyzer.detection.base import ChatFormat
formato = ChatFormat(
header_regex=re.compile(
r"^(?P<date>\d{2}/\d{2}/\d{4}), (?P<time>\d{2}:\d{2}) - "
r"(?:(?P<sender>[^:]+): )?(?P<text>.*)$"
),
datetime_format="%d/%m/%Y, %H:%M",
)
chat = parse_file("export.txt", ParserConfig(chat_format=formato))
Filtri e anonimizzazione
I transformer vengono applicati a ogni messaggio nell'ordine in cui li metti nella
lista. Ognuno può modificare il messaggio o scartarlo.
from datetime import datetime
from whatsapp_analyzer import parse_file, ParserConfig
from whatsapp_analyzer.transform.filters import (
DateRangeFilter, AuthorFilter, SystemMessageFilter,
)
from whatsapp_analyzer.transform.anonymizer import Anonymizer
config = ParserConfig(transformers=[
SystemMessageFilter(), # rimuove i messaggi di sistema
DateRangeFilter(start=datetime(2024, 1, 1)), # solo dal 2024 in poi
AuthorFilter(["Mario"], mode="include"), # solo i messaggi di Mario
Anonymizer(), # Mario -> User1, Luigi -> User2, ...
])
chat = parse_file("export.txt", config=config)
Note:
- L'ordine conta. Di norma conviene filtrare prima e anonimizzare per ultimo.
AuthorFilteraccettamode="include"omode="exclude".Anonymizersostituisce solo il camposendercon un alias stabile per tutta la chat; non tocca il testo dei messaggi.
Export
chat = parse_file("export.txt")
# JSON (timestamp in ISO 8601, enum come stringhe)
testo_json = chat.to_json()
# Round-trip: ricarica senza ri-parsare il .txt
from whatsapp_analyzer import Chat
chat2 = Chat.from_json(testo_json)
# CSV (una riga per messaggio)
testo_csv = chat.to_csv()
# pandas (richiede l'extra [pandas])
df = chat.to_dataframe()
Le colonne di CSV e DataFrame sono: timestamp, sender, text, type, media_kind.
CLI
Dopo l'installazione è disponibile il comando wa-analyzer:
# JSON su stdout
wa-analyzer export.txt --to json
# CSV su file, escludendo i messaggi di sistema e anonimizzando gli autori
wa-analyzer export.txt --to csv --out chat.csv --no-system --anonymize
Opzioni:
| Flag | Descrizione |
|---|---|
--to {json,csv} |
formato di export (default: json) |
--out PATH |
file di output (default: stdout) |
--anonymize |
sostituisce i nomi degli autori |
--no-system |
esclude i messaggi di sistema |
Estendere la libreria
L'architettura è pensata per essere estesa senza modificare il codice esistente:
- nuovo formato → implementa un
FormatDetectore passalo inParserConfig(detectors=...); - nuova trasformazione → estendi
MessageTransformer; - nuovo export → estendi
Exporter.
Esempio di transformer personalizzato:
from dataclasses import replace
from whatsapp_analyzer.models import Message
from whatsapp_analyzer.transform.base import MessageTransformer
class UppercaseTransformer(MessageTransformer):
def apply(self, msg: Message) -> Message | None:
return replace(msg, text=msg.text.upper())
Licenza
MIT.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file whatsapp_chat_analyzer-0.1.1.tar.gz.
File metadata
- Download URL: whatsapp_chat_analyzer-0.1.1.tar.gz
- Upload date:
- Size: 17.5 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
beda33abb2a1f64c3c8a77b7cd7bc07141739aa80b0db4301fc52315e49f8ccd
|
|
| MD5 |
6e166549190a07d18344220fe3d290b1
|
|
| BLAKE2b-256 |
f87bae1f7ff5e81c717a40abb8910155eeb38ad0c1bf19709ec1ba237c355d5d
|
Provenance
The following attestation bundles were made for whatsapp_chat_analyzer-0.1.1.tar.gz:
Publisher:
publish.yml on mtmxo/whatsapp-chat-analyzer
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
whatsapp_chat_analyzer-0.1.1.tar.gz -
Subject digest:
beda33abb2a1f64c3c8a77b7cd7bc07141739aa80b0db4301fc52315e49f8ccd - Sigstore transparency entry: 1806734076
- Sigstore integration time:
-
Permalink:
mtmxo/whatsapp-chat-analyzer@a9bbdd68bbef6eb32398c283e0b93edf75e8fb61 -
Branch / Tag:
refs/tags/v0.1.1 - Owner: https://github.com/mtmxo
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@a9bbdd68bbef6eb32398c283e0b93edf75e8fb61 -
Trigger Event:
release
-
Statement type:
File details
Details for the file whatsapp_chat_analyzer-0.1.1-py3-none-any.whl.
File metadata
- Download URL: whatsapp_chat_analyzer-0.1.1-py3-none-any.whl
- Upload date:
- Size: 19.2 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
4e3f8983833f4b255dd32dc9685100c90916dda12916c38e365bdf34ee0c92e1
|
|
| MD5 |
7a516e6180a79dfab35b72d526a3b8c2
|
|
| BLAKE2b-256 |
8baca744e8c60e8e310b5587cdc5b775f0a3ba9d954a6d38fa6ede1fe15a680f
|
Provenance
The following attestation bundles were made for whatsapp_chat_analyzer-0.1.1-py3-none-any.whl:
Publisher:
publish.yml on mtmxo/whatsapp-chat-analyzer
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
whatsapp_chat_analyzer-0.1.1-py3-none-any.whl -
Subject digest:
4e3f8983833f4b255dd32dc9685100c90916dda12916c38e365bdf34ee0c92e1 - Sigstore transparency entry: 1806734195
- Sigstore integration time:
-
Permalink:
mtmxo/whatsapp-chat-analyzer@a9bbdd68bbef6eb32398c283e0b93edf75e8fb61 -
Branch / Tag:
refs/tags/v0.1.1 - Owner: https://github.com/mtmxo
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@a9bbdd68bbef6eb32398c283e0b93edf75e8fb61 -
Trigger Event:
release
-
Statement type: