|
2 | 2 |
|
3 | 3 | using System; |
4 | 4 | using System.Collections.Generic; |
| 5 | +using System.Linq; |
5 | 6 | using System.Net.Http; |
| 7 | +using System.Net.Http.Headers; |
6 | 8 | using System.Threading; |
7 | 9 | using System.Threading.Tasks; |
| 10 | +using Google.Protobuf; |
8 | 11 | using Newtonsoft.Json; |
9 | 12 | using Richasy.Bili.Lib.Interfaces; |
10 | 13 | using Richasy.Bili.Models.App.Constants; |
11 | 14 | using Richasy.Bili.Models.App.Other; |
12 | 15 | using Richasy.Bili.Models.Enums; |
| 16 | +using Richasy.Bili.Models.gRPC; |
| 17 | +using static Richasy.Bili.Models.App.Constants.ServiceConstants; |
13 | 18 |
|
14 | 19 | namespace Richasy.Bili.Lib.Uwp |
15 | 20 | { |
@@ -79,6 +84,50 @@ public async Task<HttpRequestMessage> GetRequestMessageAsync( |
79 | 84 | return requestMessage; |
80 | 85 | } |
81 | 86 |
|
| 87 | + /// <inheritdoc/> |
| 88 | + public async Task<HttpRequestMessage> GetRequestMessageAsync(string url, IMessage grpcMessage) |
| 89 | + { |
| 90 | + var requestMessage = new HttpRequestMessage(HttpMethod.Post, url); |
| 91 | + var token = await _authenticationProvider.GetTokenAsync(); |
| 92 | + var grpcConfig = new GRPCConfig(token); |
| 93 | + var userAgent = $"bili-universal/62800300 " |
| 94 | + + $"os/ios model/{GRPCConfig.Model} mobi_app/iphone " |
| 95 | + + $"osVer/{GRPCConfig.OSVersion} " |
| 96 | + + $"network/{GRPCConfig.NetworkType} " |
| 97 | + + $"grpc-objc/1.32.0 grpc-c/12.0.0 (ios; cronet_http)"; |
| 98 | + requestMessage.Headers.Authorization = new AuthenticationHeaderValue(Headers.Identify, token); |
| 99 | + requestMessage.Headers.Add(Headers.UserAgent, userAgent); |
| 100 | + requestMessage.Headers.Add(Headers.AppKey, GRPCConfig.MobileApp); |
| 101 | + requestMessage.Headers.Add(Headers.BiliDevice, grpcConfig.GetDeviceBin()); |
| 102 | + requestMessage.Headers.Add(Headers.BiliFawkes, grpcConfig.GetFawkesreqBin()); |
| 103 | + requestMessage.Headers.Add(Headers.BiliLocale, grpcConfig.GetLocaleBin()); |
| 104 | + requestMessage.Headers.Add(Headers.BiliMeta, grpcConfig.GetMetadataBin()); |
| 105 | + requestMessage.Headers.Add(Headers.BiliNetwork, grpcConfig.GetNetworkBin()); |
| 106 | + requestMessage.Headers.Add(Headers.BiliRestriction, grpcConfig.GetRestrictionBin()); |
| 107 | + requestMessage.Headers.Add(Headers.GRPCAcceptEncodingKey, Headers.GRPCAcceptEncodingValue); |
| 108 | + requestMessage.Headers.Add(Headers.GRPCTimeOutKey, Headers.GRPCTimeOutValue); |
| 109 | + requestMessage.Headers.Add(Headers.Envoriment, GRPCConfig.Envorienment); |
| 110 | + requestMessage.Headers.Add(Headers.TransferEncodingKey, Headers.TransferEncodingValue); |
| 111 | + requestMessage.Headers.Add(Headers.TEKey, Headers.TEValue); |
| 112 | + |
| 113 | + var messageBytes = grpcMessage.ToByteArray(); |
| 114 | + |
| 115 | + // 校验用?第五位为数组长度 |
| 116 | + var stateBytes = new byte[] { 0, 0, 0, 0, (byte)messageBytes.Length }; |
| 117 | + |
| 118 | + // 合并两个字节数组 |
| 119 | + var bodyBytes = new byte[5 + messageBytes.Length]; |
| 120 | + stateBytes.CopyTo(bodyBytes, 0); |
| 121 | + messageBytes.CopyTo(bodyBytes, 5); |
| 122 | + |
| 123 | + var byteArrayContent = new ByteArrayContent(bodyBytes); |
| 124 | + byteArrayContent.Headers.ContentType = new MediaTypeHeaderValue(Headers.GRPCContentType); |
| 125 | + byteArrayContent.Headers.ContentLength = bodyBytes.Length; |
| 126 | + |
| 127 | + requestMessage.Content = byteArrayContent; |
| 128 | + return requestMessage; |
| 129 | + } |
| 130 | + |
82 | 131 | /// <inheritdoc/> |
83 | 132 | public Task<HttpResponseMessage> SendAsync(HttpRequestMessage request) |
84 | 133 | { |
@@ -107,5 +156,13 @@ public async Task<T> ParseAsync<T>(HttpResponseMessage response) |
107 | 156 | var responseString = await response.Content.ReadAsStringAsync(); |
108 | 157 | return JsonConvert.DeserializeObject<T>(responseString); |
109 | 158 | } |
| 159 | + |
| 160 | + /// <inheritdoc/> |
| 161 | + public async Task<T> ParseAsync<T>(HttpResponseMessage response, MessageParser<T> parser) |
| 162 | + where T : IMessage<T> |
| 163 | + { |
| 164 | + var bytes = await response.Content.ReadAsByteArrayAsync(); |
| 165 | + return parser.ParseFrom(bytes.Skip(5).ToArray()); |
| 166 | + } |
110 | 167 | } |
111 | 168 | } |
0 commit comments