From 2b251c11969db479e1f2405fb60df0ac5e4b05c3 Mon Sep 17 00:00:00 2001 From: Richasy Date: Fri, 28 Jul 2023 21:30:59 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E5=8A=A8=E6=80=81=E8=8E=B7?= =?UTF-8?q?=E5=8F=96=E5=A4=B1=E8=B4=A5=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../HttpProvider/HttpProvider.Extension.cs | 31 +++++++--- .../HttpProvider/HttpProvider.cs | 9 +-- .../Models.App/Constants/ServiceConstants.cs | 1 + src/Models/Models.gRPC/Buvid.cs | 57 +++++++++++++++++++ 4 files changed, 86 insertions(+), 12 deletions(-) create mode 100644 src/Models/Models.gRPC/Buvid.cs diff --git a/src/Lib/Lib.Implementation/HttpProvider/HttpProvider.Extension.cs b/src/Lib/Lib.Implementation/HttpProvider/HttpProvider.Extension.cs index dca296fd3..53e8b5f6a 100644 --- a/src/Lib/Lib.Implementation/HttpProvider/HttpProvider.Extension.cs +++ b/src/Lib/Lib.Implementation/HttpProvider/HttpProvider.Extension.cs @@ -1,15 +1,18 @@ // Copyright (c) Richasy. All rights reserved. using System; +using System.Linq; using System.Net; using System.Net.Http; using System.Net.Http.Headers; +using System.Net.NetworkInformation; using System.Threading; using System.Threading.Tasks; using Bili.Lib.Interfaces; using Bili.Models.App.Constants; using Bili.Models.App.Other; using Bili.Models.BiliBili; +using Bili.Models.gRPC; using Newtonsoft.Json; namespace Bili.Lib @@ -19,8 +22,8 @@ namespace Bili.Lib /// public partial class HttpProvider { + private static string _buvid; private readonly IAuthorizeProvider _authenticationProvider; - private HttpClient _httpClient; private bool _disposedValue; private CookieContainer _cookieContainer; @@ -40,7 +43,7 @@ public void Dispose() { await Task.Run(async () => { - response = await _httpClient.SendAsync(request, cancellationToken); + response = await HttpClient.SendAsync(request, cancellationToken); }); await ThrowIfHasExceptionAsync(response); } @@ -83,17 +86,29 @@ protected virtual void Dispose(bool disposing) { if (disposing) { - if (this._httpClient != null) - { - this._httpClient.Dispose(); - } + HttpClient?.Dispose(); } - this._httpClient = null; + HttpClient = null; _disposedValue = true; } } + private static string GetBuvid() + { + if (string.IsNullOrEmpty(_buvid)) + { + var macAddress = NetworkInterface.GetAllNetworkInterfaces() + .Where(nic => nic.OperationalStatus == OperationalStatus.Up && nic.NetworkInterfaceType != NetworkInterfaceType.Loopback) + .Select(nic => nic.GetPhysicalAddress().ToString()) + .FirstOrDefault(); + var buvidObj = new Buvid(macAddress); + _buvid = buvidObj.Generate(); + } + + return _buvid; + } + private void InitHttpClient() { ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12 | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls; @@ -108,7 +123,7 @@ private void InitHttpClient() var client = new HttpClient(handler); client.DefaultRequestHeaders.CacheControl = new CacheControlHeaderValue { NoCache = false, NoStore = false }; client.DefaultRequestHeaders.Add("accept", ServiceConstants.DefaultAcceptString); - this._httpClient = client; + this.HttpClient = client; } private async Task ThrowIfHasExceptionAsync(HttpResponseMessage response) diff --git a/src/Lib/Lib.Implementation/HttpProvider/HttpProvider.cs b/src/Lib/Lib.Implementation/HttpProvider/HttpProvider.cs index 1352dedbe..9bdf4c865 100644 --- a/src/Lib/Lib.Implementation/HttpProvider/HttpProvider.cs +++ b/src/Lib/Lib.Implementation/HttpProvider/HttpProvider.cs @@ -29,7 +29,7 @@ public partial class HttpProvider : IHttpProvider, IDisposable /// 授权验证模块. public HttpProvider(IAuthorizeProvider authProvider) { - this._authenticationProvider = authProvider; + _authenticationProvider = authProvider; InitHttpClient(); } @@ -38,14 +38,14 @@ public TimeSpan OverallTimeout { get { - return this._httpClient.Timeout; + return HttpClient.Timeout; } set { try { - this._httpClient.Timeout = value; + HttpClient.Timeout = value; } catch (InvalidOperationException exception) { @@ -60,7 +60,7 @@ public TimeSpan OverallTimeout } /// - public HttpClient HttpClient { get => _httpClient; } + public HttpClient HttpClient { get; private set; } /// public async Task GetRequestMessageAsync( @@ -150,6 +150,7 @@ public async Task GetRequestMessageAsync(string url, IMessag requestMessage.Headers.Add(Headers.Envoriment, GRPCConfig.Envorienment); requestMessage.Headers.Add(Headers.TransferEncodingKey, Headers.TransferEncodingValue); requestMessage.Headers.Add(Headers.TEKey, Headers.TEValue); + requestMessage.Headers.Add(Headers.Buvid, GetBuvid()); var messageBytes = grpcMessage.ToByteArray(); diff --git a/src/Models/Models.App/Constants/ServiceConstants.cs b/src/Models/Models.App/Constants/ServiceConstants.cs index e6dfeb51f..1e7065c60 100644 --- a/src/Models/Models.App/Constants/ServiceConstants.cs +++ b/src/Models/Models.App/Constants/ServiceConstants.cs @@ -238,6 +238,7 @@ public static class Headers public const string TransferEncodingValue = "chunked"; public const string TEKey = "TE"; public const string TEValue = "trailers"; + public const string Buvid = "buvid"; } public static class Settings diff --git a/src/Models/Models.gRPC/Buvid.cs b/src/Models/Models.gRPC/Buvid.cs new file mode 100644 index 000000000..a6fb7019b --- /dev/null +++ b/src/Models/Models.gRPC/Buvid.cs @@ -0,0 +1,57 @@ +// Copyright (c) Richasy. All rights reserved. + +#pragma warning disable SA1300 // Element should begin with upper-case letter +using System.Security.Cryptography; +using System.Text; + +namespace Bili.Models.gRPC +{ + /// + /// BUVID. + /// + public class Buvid + { + private readonly string _mac; + + /// + /// Initializes a new instance of the class. + /// + /// MAC 地址. + public Buvid(string macAddress) => _mac = macAddress; + + /// + /// 生成 buvid. + /// + /// buvid. + public string Generate() + { + var buvidPrefix = "XY"; + var inputStrMd5 = GetMd5Hash(_mac.Replace(":", string.Empty)); + + var buvidRaw = new StringBuilder(); + buvidRaw.Append(buvidPrefix); + buvidRaw.Append(inputStrMd5[2]); + buvidRaw.Append(inputStrMd5[12]); + buvidRaw.Append(inputStrMd5[22]); + buvidRaw.Append(inputStrMd5); + + return buvidRaw.ToString(); + } + + private static string GetMd5Hash(string input) + { + using (var md5 = MD5.Create()) + { + var inputBytes = Encoding.UTF8.GetBytes(input); + var hashBytes = md5.ComputeHash(inputBytes); + var sb = new StringBuilder(); + foreach (var b in hashBytes) + { + sb.Append(b.ToString("x2")); + } + + return sb.ToString(); + } + } + } +}