# ?? Debug e Persistenza Sessione - Guida Implementazione
## ?? Modifiche Implementate
### 1. **Logging Dettagliato per Debug**
Ho aggiunto logging completo in tutti i servizi chiave con prefisso identificativo:
#### **InstagramScraperService**
- Prefisso: `[InstagramScraperService]`
- Log su:
- Inizializzazione servizio
- Impostazione cookie (con anteprima primi 20 caratteri)
- Ricerca utenti (query, endpoint utilizzato, risultati)
- Parsing risposte JSON (GraphQL e Topsearch)
- Validazione sessione
- Errori con stack trace completo
#### **InstagramSessionService**
- Prefisso: `[InstagramSessionService]`
- Log su:
- Inizializzazione con path file sessione
- Caricamento sessione da disco all'avvio
- Salvataggio cookie (da header o WebView2)
- Numero di cookie salvati/caricati
- Validazione sessione
- Pulizia sessione
- Errori di I/O
#### **SettingsViewModel**
- Prefisso: `[SettingsViewModel]`
- Log su:
- Inizializzazione
- Aggiornamento stato autenticazione
- Eventi SessionStateChanged
- Login/Logout
- Import/Export configurazioni
- Errori picker file/cartelle
#### **TargetsViewModel**
- Prefisso: `[TargetsViewModel]`
- Log su:
- Avvio ricerca Instagram
- Risultati ricevuti
- Verifica utenti già monitorati
- Aggiunta utenti selezionati
- Errori durante operazioni
---
## ?? Persistenza Sessione Instagram
### **Funzionamento Automatico**
La persistenza dei cookie è **GIÀ IMPLEMENTATA** e funziona automaticamente:
1. **All'avvio dell'applicazione**:
- `InstagramSessionService` viene inizializzato
- Il metodo `LoadSession()` carica automaticamente i cookie dal file:
```
%LocalAppData%\InstaArchive\session.json
```
- I cookie vengono impostati in `InstagramScraperService`
- Se la sessione è valida, l'utente risulta autenticato
2. **Al login (via WebView2)**:
- I cookie vengono salvati chiamando `SaveCookiesFromWebView2()`
- Il file JSON viene aggiornato su disco
- Lo scraper viene aggiornato con i nuovi cookie
3. **Alla chiusura dell'app**:
- Nessuna azione necessaria, i cookie sono già salvati
### **Formato File Sessione**
```json
{
"sessionid": "lungo_valore_alfanumerico...",
"csrftoken": "abc123...",
"ds_user_id": "12345678",
"ig_did": "...",
"mid": "..."
}
```
### **Sicurezza**
?? Il file è salvato in chiaro su disco. Per maggiore sicurezza futura, considera:
- Crittografia con DPAPI (Windows Data Protection API)
- Permessi file limitati all'utente corrente
---
## ?? Errori Risolti (Aggiornamento 2025-01-08)
### **1. Errore di Binding XAML: InvalidCastException**
**Problema**:
```
Unable to cast object of type 'System.Boolean' to type 'System.Double'
at SettingsPage_obj1_Bindings.Update_ViewModel_IsAuthenticated
```
**Causa**:
Il binding dell'opacità (`Opacity`) tentava di usare un `Boolean` tramite `InverseBoolConverter` che però non restituiva un `double` (0.0-1.0) richiesto dalla proprietà.
**Soluzione**:
1. Creato nuovo converter `BoolToOpacityConverter`:
```csharp
public class BoolToOpacityConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, string language)
{
// Se true: opacità 0.2, se false: opacità 1.0
if (value is bool b)
{
return b ? 0.2 : 1.0;
}
return 1.0;
}
}
```
2. Corretto binding in `SettingsPage.xaml`:
```xaml
```
3. Registrato converter in `App.xaml`:
```xaml
```
### **2. Problema Autenticazione Instagram**
**Sintomi dai log**:
```
[InstagramScraperService] GraphQL Response Status: Forbidden
[InstagramScraperService] Topsearch Response Status: Unauthorized
[InstagramSessionService] Nessun file di sessione trovato
```
**Causa**:
- Nessun cookie di sessione salvato
- L'app mostrava "Accedi" anche se potenzialmente c'erano cookie salvati
**Soluzione**:
1. Aggiunto indicatore visivo cookie salvati nell'UI:
```csharp
public bool HasSavedCookies { get; set; }
public string SavedCookiesInfo { get; set; }
```
2. Creato nuovo componente InfoBar in `SettingsPage.xaml`:
```xaml
```
3. Aggiornato `UpdateAuthenticationState()` per mostrare stato cookie:
```csharp
var cookies = _sessionService.GetSessionCookies();
HasSavedCookies = cookies.Count > 0;
if (HasSavedCookies)
{
var cookieNames = string.Join(", ", cookies.Keys.Take(3));
SavedCookiesInfo = $"Cookie salvati: {cookieNames}...";
}
```
### **3. Missing using System.Linq**
**Errore**:
```
CS1061: 'Dictionary.KeyCollection' non contiene una definizione di 'Take'
```
**Soluzione**:
Aggiunto `using System.Linq;` in `SettingsViewModel.cs`
---
## ??? Come Utilizzare il Debug
### **Visualizzare i Log in Visual Studio**
1. **Output Window**:
- Menu: `View` ? `Output` (oppure `Ctrl+Alt+O`)
- Seleziona "Debug" dal dropdown "Show output from:"
2. **Log durante l'esecuzione**:
```
[InstagramSessionService] Inizializzazione servizio
[InstagramSessionService] Path sessione: C:\Users\...\InstaArchive\session.json
[InstagramSessionService] File sessione trovato: ...
[InstagramSessionService] Caricati 5 cookie
[InstagramScraperService] Impostazione cookie di sessione (5 cookie)
[InstagramScraperService] Cookie: sessionid = 49f78a...
[InstagramSessionService] Sessione caricata correttamente. Autenticato: True
```
### **Esempi di Log Utili**
#### **Ricerca Utente**
```
[TargetsViewModel] Ricerca Instagram avviata: 'username'
[InstagramScraperService] Inizio ricerca utente: 'username'
[InstagramScraperService] Tentativo ricerca GraphQL (ricerche recenti)
[InstagramScraperService] GraphQL Response Status: OK
[InstagramScraperService] Trovati 3 risultati da GraphQL
[TargetsViewModel] Ricevuti 3 risultati
[TargetsViewModel] @username1 - Già monitorato: False
[TargetsViewModel] Trovati 3 risultati
```
#### **Errore Autenticazione**
```
[InstagramScraperService] GraphQL Response Status: Unauthorized
[InstagramScraperService] Nessun risultato da GraphQL, provo fallback
[InstagramScraperService] Topsearch Response Status: Unauthorized
[InstagramScraperService] Nessun risultato trovato
```
Questo indica che i cookie di sessione sono scaduti o non validi.
---
## ? Test Consigliati
### **1. Test Persistenza All'Avvio**
1. Esegui l'app e fai login via WebView2
2. Verifica nei log:
```
[InstagramSessionService] 5 cookie salvati su disco
```
3. Chiudi completamente l'app
4. Riapri l'app
5. Verifica nei log:
```
[InstagramSessionService] Caricati 5 cookie
[InstagramSessionService] Autenticato: True
```
6. **Verifica nell'UI**: Dovresti vedere una card verde con "Cookie di sessione salvati"
### **2. Test Ricerca Utenti**
1. Vai nella tab "Targets"
2. Digita un username nella barra di ricerca
3. Osserva nell'Output Window:
- Chiamata API (GraphQL o Topsearch)
- Numero risultati ricevuti
- Parsing JSON
### **3. Test Validazione Sessione**
1. Nella tab Settings, clicca "Refresh Status"
2. Osserva:
```
[InstagramSessionService] Validazione sessione
[InstagramScraperService] Verifica validità sessione
[InstagramScraperService] Sessione VALIDA
```
---
## ?? Troubleshooting
### **Problema: "Non autenticato" anche dopo login**
**Verifica nei log**:
```
[InstagramSessionService] File sessione trovato: ...
[InstagramSessionService] Caricati 0 cookie
```
**Verifica nell'UI**:
- Vedi la card verde "Cookie salvati"?
- Se NO: i cookie non sono stati salvati correttamente
- Se SÌ ma sei "Non autenticato": il cookie `sessionid` è mancante
**Soluzione**:
- Il file `session.json` è vuoto o corrotto
- Elimina il file e rifai il login
- Path file: `%LocalAppData%\InstaArchive\session.json`
### **Problema: Ricerca non restituisce risultati**
**Verifica nei log**:
```
[InstagramScraperService] GraphQL Response Status: Unauthorized
[InstagramScraperService] Topsearch Response Status: Unauthorized
```
**Soluzione**:
- Cookie scaduti
- Vai in Settings ? Disconnetti ? Accedi di nuovo
- Verifica che dopo il login vedi "Cookie salvati: sessionid, csrftoken..."
### **Problema: Cookie non vengono salvati**
**Verifica permessi**:
- La cartella `%LocalAppData%\InstaArchive` deve essere scrivibile
- Controlla nei log eventuali eccezioni I/O
**Verifica nell'UI**:
- Dopo il login, vai su Settings
- Dovresti vedere la card verde con i nomi dei cookie
---
## ?? Note Tecniche
### **Cookie Richiesti per Autenticazione**
- `sessionid` (obbligatorio)
- `csrftoken` (obbligatorio per POST)
- `ds_user_id` (identificativo utente)
- `ig_did` (device ID, opzionale)
- `mid` (machine ID, opzionale)
### **Durata Sessione Instagram**
- Cookie validi tipicamente per **30-90 giorni**
- Instagram può invalidare la sessione se:
- Login da nuovo dispositivo/IP
- Cambio password
- Attività sospetta
### **Rate Limiting**
Lo scraper implementa già ritardi casuali (jitter) per evitare ban:
- Nessun delay specifico implementato nella ricerca
- Considera di aggiungere throttling se fai molte ricerche consecutive
---
## ?? Nuove Funzionalità UI
### **Indicatore Cookie Salvati**
Ora nella pagina Impostazioni vedrai:
- ? **Card Verde**: "Cookie di sessione salvati" quando ci sono cookie
- **Dettagli**: Mostra i primi 3 nomi di cookie (es. "sessionid, csrftoken, ds_user_id...")
- **Info**: "I cookie verranno caricati automaticamente all'avvio dell'app"
Questo risolve il problema di non sapere se i dati sono salvati!
---
## ?? Prossimi Passi Suggeriti
1. **Crittografia Cookie**: Implementare DPAPI per proteggere `session.json`
2. **Auto-Refresh Token**: Validare automaticamente la sessione ogni X ore
3. **Notifiche UI**: Mostrare toast quando la sessione scade
4. **Gestione Errori Avanzata**: Retry automatico con backoff esponenziale
---
**Autore**: GitHub Copilot
**Data**: 2025-01-08
**Versione**: 2.0 (Aggiornato con fix errori)