Files
Teti/Teti/Services/InstagramSessionService.cs
Alberto Balbo d2ca019d64 Creazione progetto InstaArchive WinUI 3 (.NET 8)
Aggiunta di tutti i file sorgente, configurazione e risorse per la nuova app desktop InstaArchive. Implementati servizi per monitoraggio e archiviazione automatica di contenuti Instagram (post, storie, reels, highlights) con persistenza locale, gestione utenti, impostazioni avanzate, dashboard e interfaccia moderna in italiano. Integrazione MVVM, rate limiting, iniezione metadati e funzionalità di import/export.
2026-01-07 14:03:34 +01:00

113 lines
2.9 KiB
C#

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Threading.Tasks;
using Newtonsoft.Json;
namespace InstaArchive.Services;
public class InstagramSessionService
{
private readonly string _sessionPath;
private Dictionary<string, string> _cookies = new();
public event EventHandler<bool>? SessionStateChanged;
public InstagramSessionService()
{
var appDataPath = Path.Combine(
Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData),
"InstaArchive"
);
Directory.CreateDirectory(appDataPath);
_sessionPath = Path.Combine(appDataPath, "session.json");
LoadSession();
}
public bool IsAuthenticated => _cookies.Count > 0 && _cookies.ContainsKey("sessionid");
public async Task SaveSessionAsync(string cookieHeader)
{
_cookies.Clear();
var cookies = cookieHeader.Split(';')
.Select(c => c.Trim())
.Where(c => !string.IsNullOrEmpty(c));
foreach (var cookie in cookies)
{
var parts = cookie.Split('=', 2);
if (parts.Length == 2)
{
_cookies[parts[0].Trim()] = parts[1].Trim();
}
}
var json = JsonConvert.SerializeObject(_cookies, Formatting.Indented);
await File.WriteAllTextAsync(_sessionPath, json);
SessionStateChanged?.Invoke(this, IsAuthenticated);
}
public async Task SaveCookiesFromWebView2(IEnumerable<KeyValuePair<string, string>> cookies)
{
_cookies.Clear();
foreach (var cookie in cookies)
{
_cookies[cookie.Key] = cookie.Value;
}
var json = JsonConvert.SerializeObject(_cookies, Formatting.Indented);
await File.WriteAllTextAsync(_sessionPath, json);
SessionStateChanged?.Invoke(this, IsAuthenticated);
}
public string GetCookieHeader()
{
return string.Join("; ", _cookies.Select(kvp => $"{kvp.Key}={kvp.Value}"));
}
public string? GetCookie(string name)
{
return _cookies.TryGetValue(name, out var value) ? value : null;
}
public async Task ClearSessionAsync()
{
_cookies.Clear();
if (File.Exists(_sessionPath))
{
File.Delete(_sessionPath);
}
SessionStateChanged?.Invoke(this, false);
await Task.CompletedTask;
}
private void LoadSession()
{
try
{
if (File.Exists(_sessionPath))
{
var json = File.ReadAllText(_sessionPath);
var loaded = JsonConvert.DeserializeObject<Dictionary<string, string>>(json);
if (loaded != null)
{
_cookies = loaded;
}
}
}
catch
{
_cookies = new Dictionary<string, string>();
}
}
}