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.
113 lines
2.9 KiB
C#
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>();
|
|
}
|
|
}
|
|
}
|