Files
YouTube-Manager/Manager.YouTube/Util/AuthenticationUtilities.cs
2025-09-08 21:28:33 +02:00

59 lines
2.0 KiB
C#

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];
}
}