48 lines
1.8 KiB
C#
48 lines
1.8 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 strHash == null ? null : new AuthenticationHeaderValue(HeaderScheme, strHash);
|
|
}
|
|
|
|
public static string? GetSapisidHash(string datasyncId, string sapisid, string origin, string? time = null)
|
|
{
|
|
if (string.IsNullOrWhiteSpace(datasyncId) || string.IsNullOrWhiteSpace(sapisid) || string.IsNullOrWhiteSpace(origin))
|
|
return null;
|
|
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];
|
|
}
|
|
} |