Files
Teti/Teti/DOCS/Debug_e_Persistenza_Sessione.md
Alberto Balbo d4e38ec8fc Aggiungi InstagramScraperService e modello ricerca utenti
Implementato servizio avanzato per scraping e ricerca utenti Instagram con gestione completa dei cookie, headers browser (21 headers da HAR), logging dettagliato e simulazione Chrome 143. Aggiunta classe modello InstagramSearchResult per risultati ricerca, con supporto MVVM. Risolti definitivamente problemi di autenticazione e passaggio cookie alle richieste.
2026-01-08 14:53:27 +01:00

10 KiB

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

{
  "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:

    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:

    <SolidColorBrush Color="{StaticResource SuccessColor}" 
                    Opacity="{x:Bind ViewModel.IsAuthenticated, Mode=OneWay, 
                             Converter={StaticResource BoolToOpacityConverter}}"/>
    
  3. Registrato converter in App.xaml:

    <converters:BoolToOpacityConverter x:Key="BoolToOpacityConverter"/>
    

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:

    public bool HasSavedCookies { get; set; }
    public string SavedCookiesInfo { get; set; }
    
  2. Creato nuovo componente InfoBar in SettingsPage.xaml:

    <Border Visibility="{x:Bind ViewModel.HasSavedCookies, Mode=OneWay, 
                                 Converter={StaticResource BoolToVisibilityConverter}}">
        <TextBlock Text="{x:Bind ViewModel.SavedCookiesInfo, Mode=OneWay}"/>
        <TextBlock Text="I cookie verranno caricati automaticamente all'avvio dell'app"/>
    </Border>
    
  3. Aggiornato UpdateAuthenticationState() per mostrare stato cookie:

    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<string, string>.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..."

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

  • 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

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)