using System.Globalization; using System.Net.Http.Headers; using System.Security.Cryptography; using System.Text; namespace Manager.YouTube.Util; public static class AuthenticationUtilities { private const string HeaderScheme = "SAPISIDHASH"; // Dave Thomas & windy for updated answer @ https://stackoverflow.com/a/32065323/9948300 public static AuthenticationHeaderValue GetSapisidHashHeader(string datasyncId, string sapisid, string origin) { var strHash = GetSapisidHash(datasyncId, sapisid, origin); return new AuthenticationHeaderValue(HeaderScheme, strHash); } public static string GetSapisidHash(string datasyncId, string sapisid, string origin, string? time = null) { if (string.IsNullOrWhiteSpace(datasyncId)) { throw new ArgumentNullException(nameof(datasyncId)); } if (string.IsNullOrWhiteSpace(sapisid)) { throw new ArgumentNullException(nameof(sapisid)); } if (string.IsNullOrWhiteSpace(origin)) { throw new ArgumentNullException(nameof(origin)); } datasyncId = datasyncId.Replace("||", ""); sapisid = Uri.UnescapeDataString(sapisid); if (string.IsNullOrWhiteSpace(time)) { time = GetTime(); } var sha1 = HashString($"{datasyncId} {time} {sapisid} {origin}"); var completeHash = $"{time}_{sha1}_u"; return completeHash; } private static string HashString(string stringData) { var dataBytes = Encoding.ASCII.GetBytes(stringData); var hashData = SHA1.HashData(dataBytes); return hashData.Aggregate(string.Empty, (current, item) => current + item.ToString("x2")); } private static string GetTime() { var st = new DateTime(1970, 1, 1); var t = DateTime.Now.ToUniversalTime() - st; var time = (t.TotalMilliseconds + 0.5).ToString(CultureInfo.InvariantCulture); return time[..10]; } }