# ?? 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)